summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/common/bits/uClibc_mutex.h
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/linux/common/bits/uClibc_mutex.h')
-rw-r--r--libc/sysdeps/linux/common/bits/uClibc_mutex.h22
1 files changed, 17 insertions, 5 deletions
diff --git a/libc/sysdeps/linux/common/bits/uClibc_mutex.h b/libc/sysdeps/linux/common/bits/uClibc_mutex.h
index c6094c3d2..02bcc7225 100644
--- a/libc/sysdeps/linux/common/bits/uClibc_mutex.h
+++ b/libc/sysdeps/linux/common/bits/uClibc_mutex.h
@@ -13,8 +13,16 @@
#ifdef __UCLIBC_HAS_THREADS__
#include <pthread.h>
+#include <bits/libc-lock.h>
#include <bits/uClibc_pthread.h>
+#define __uclibc_maybe_call(FUNC, ARGS) \
+ (__extension__ ({ \
+ __typeof (FUNC) *_fn = (FUNC); \
+ if (_fn != NULL) { (*_fn) ARGS; } \
+ }))
+
+
#define __UCLIBC_MUTEX_TYPE pthread_mutex_t
#define __UCLIBC_MUTEX(M) pthread_mutex_t M
@@ -22,19 +30,23 @@
#define __UCLIBC_MUTEX_STATIC(M,I) static pthread_mutex_t M = I
#define __UCLIBC_MUTEX_EXTERN(M) extern pthread_mutex_t M
+#define __UCLIBC_MUTEX_INIT_VAR(M) \
+ __uclibc_maybe_call(__pthread_mutex_init,(&(M),NULL))
+
#define __UCLIBC_MUTEX_LOCK_CANCEL_UNSAFE(M) \
- __pthread_mutex_lock(&(M))
+ __uclibc_maybe_call(__pthread_mutex_lock,(&(M)))
#define __UCLIBC_MUTEX_UNLOCK_CANCEL_UNSAFE(M) \
- __pthread_mutex_unlock(&(M))
+ __uclibc_maybe_call(__pthread_mutex_unlock,(&(M)))
#define __UCLIBC_MUTEX_TRYLOCK_CANCEL_UNSAFE(M) \
- __pthread_mutex_trylock(&(M))
+ __uclibc_maybe_call(__pthread_mutex_trylock,(&(M)))
#define __UCLIBC_MUTEX_CONDITIONAL_LOCK(M,C) \
do { \
struct _pthread_cleanup_buffer __infunc_pthread_cleanup_buffer; \
- if (C) { \
+ int __infunc_need_locking = ((C) && (__pthread_mutex_lock != NULL)); \
+ if (__infunc_need_locking) { \
_pthread_cleanup_push_defer(&__infunc_pthread_cleanup_buffer, \
(void (*) (void *))__pthread_mutex_unlock, \
&(M)); \
@@ -43,7 +55,7 @@
((void)0)
#define __UCLIBC_MUTEX_CONDITIONAL_UNLOCK(M,C) \
- if (C) { \
+ if (__infunc_need_locking) { \
_pthread_cleanup_pop_restore(&__infunc_pthread_cleanup_buffer,1); \
} \
} while (0)