new internal locking primitive; drop spinlocks
[musl] / src / internal / libc.h
index 45d5c9e..d6797f9 100644 (file)
@@ -22,6 +22,9 @@ struct __libc {
 #if !defined(__PIC__) || 100*__GNUC__+__GNUC_MINOR__ >= 303 || defined(__PCC__) || defined(__TINYC__)
 
 #ifdef __PIC__
+#if __GNUC__ < 4
+#define BROKEN_VISIBILITY 1
+#endif
 #define ATTR_LIBC_VISIBILITY __attribute__((visibility("hidden"))) 
 #else
 #define ATTR_LIBC_VISIBILITY
@@ -42,10 +45,11 @@ extern struct __libc *__libc_loc(void) __attribute__((const));
 
 /* Designed to avoid any overhead in non-threaded processes */
 void __lock(volatile int *);
+void __unlock(volatile int *);
 int __lockfile(FILE *);
 void __unlockfile(FILE *);
 #define LOCK(x) (libc.threads_minus_1 ? (__lock(x),1) : ((void)(x),1))
-#define UNLOCK(x) (*(volatile int *)(x)=0)
+#define UNLOCK(x) (libc.threads_minus_1 ? (__unlock(x),1) : ((void)(x),1))
 
 void __synccall(void (*)(void *), void *);
 void __synccall_wait(void);