compnerd updated this revision to Diff 82845.
compnerd added a comment.
add more context
Repository:
rL LLVM
https://reviews.llvm.org/D28226
Files:
include/__threading_support
include/mutex
Index: include/mutex
===================================================================
--- include/mutex
+++ include/mutex
@@ -206,7 +206,7 @@
class _LIBCPP_TYPE_VIS recursive_mutex
{
- __libcpp_mutex_t __m_;
+ __libcpp_recursive_mutex_t __m_;
public:
recursive_mutex();
@@ -221,7 +221,7 @@
bool try_lock() _NOEXCEPT;
void unlock() _NOEXCEPT;
- typedef __libcpp_mutex_t* native_handle_type;
+ typedef __libcpp_recursive_mutex_t* native_handle_type;
_LIBCPP_INLINE_VISIBILITY
native_handle_type native_handle() {return &__m_;}
};
Index: include/__threading_support
===================================================================
--- include/__threading_support
+++ include/__threading_support
@@ -50,6 +50,8 @@
typedef pthread_mutex_t __libcpp_mutex_t;
#define _LIBCPP_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
+typedef pthread_mutex_t __libcpp_recursive_mutex_t;
+
// Condition Variable
typedef pthread_cond_t __libcpp_condvar_t;
#define _LIBCPP_CONDVAR_INITIALIZER PTHREAD_COND_INITIALIZER
@@ -64,21 +66,56 @@
typedef pthread_key_t __libcpp_tls_key;
#endif
+struct __libcpp_mutex_reference {
+ const bool __recursive;
+ void * const __value;
+
+ _LIBCPP_CONSTEXPR
+ __libcpp_mutex_reference(__libcpp_mutex_t* m) _NOEXCEPT
+ : __recursive(false), __value(m)
+ {
+ }
+
+ template <typename _Mutex = __libcpp_mutex_t,
+ typename _RecursiveMutex = __libcpp_recursive_mutex_t,
+ typename = typename _VSTD::enable_if<!_VSTD::is_same<_Mutex,
+ _RecursiveMutex>::value>::type>
+ _LIBCPP_CONSTEXPR
+ __libcpp_mutex_reference(__libcpp_recursive_mutex_t* m) _NOEXCEPT
+ : __recursive(true), __value(m)
+ {
+ }
+
+ operator __libcpp_mutex_t*() const _NOEXCEPT
+ {
+ return reinterpret_cast<__libcpp_mutex_t*>(__value);
+ }
+
+ template <typename _Mutex = __libcpp_mutex_t,
+ typename _RecursiveMutex = __libcpp_recursive_mutex_t,
+ typename = typename _VSTD::enable_if<!_VSTD::is_same<_Mutex,
+ _RecursiveMutex>::value>::type>
+ operator __libcpp_recursive_mutex_t*() const _NOEXCEPT
+ {
+ return reinterpret_cast<__libcpp_recursive_mutex_t*>(__value);
+ }
+};
+
// Mutex
_LIBCPP_THREAD_ABI_VISIBILITY
-int __libcpp_recursive_mutex_init(__libcpp_mutex_t *__m);
+int __libcpp_recursive_mutex_init(__libcpp_recursive_mutex_t *__m);
_LIBCPP_THREAD_ABI_VISIBILITY
-int __libcpp_mutex_lock(__libcpp_mutex_t *__m);
+int __libcpp_mutex_lock(__libcpp_mutex_reference&& __m);
_LIBCPP_THREAD_ABI_VISIBILITY
-int __libcpp_mutex_trylock(__libcpp_mutex_t *__m);
+int __libcpp_mutex_trylock(__libcpp_mutex_reference&& __m);
_LIBCPP_THREAD_ABI_VISIBILITY
-int __libcpp_mutex_unlock(__libcpp_mutex_t *__m);
+int __libcpp_mutex_unlock(__libcpp_mutex_reference&& __m);
_LIBCPP_THREAD_ABI_VISIBILITY
-int __libcpp_mutex_destroy(__libcpp_mutex_t *__m);
+int __libcpp_mutex_destroy(__libcpp_mutex_reference&& __m);
// Condition variable
_LIBCPP_THREAD_ABI_VISIBILITY
@@ -88,11 +125,12 @@
int __libcpp_condvar_broadcast(__libcpp_condvar_t* __cv);
_LIBCPP_THREAD_ABI_VISIBILITY
-int __libcpp_condvar_wait(__libcpp_condvar_t* __cv, __libcpp_mutex_t* __m);
+int __libcpp_condvar_wait(__libcpp_condvar_t* __cv,
+ __libcpp_mutex_reference&& __m);
_LIBCPP_THREAD_ABI_VISIBILITY
-int __libcpp_condvar_timedwait(__libcpp_condvar_t *__cv, __libcpp_mutex_t *__m,
- timespec *__ts);
+int __libcpp_condvar_timedwait(__libcpp_condvar_t* __cv,
+ __libcpp_mutex_reference&& __m, timespec* __ts);
_LIBCPP_THREAD_ABI_VISIBILITY
int __libcpp_condvar_destroy(__libcpp_condvar_t* __cv);
@@ -136,7 +174,7 @@
#if defined(_LIBCPP_HAS_THREAD_API_PTHREAD)
-int __libcpp_recursive_mutex_init(__libcpp_mutex_t *__m)
+int __libcpp_recursive_mutex_init(__libcpp_recursive_mutex_t *__m)
{
pthread_mutexattr_t attr;
int __ec = pthread_mutexattr_init(&attr);
@@ -160,22 +198,22 @@
return 0;
}
-int __libcpp_mutex_lock(__libcpp_mutex_t *__m)
+int __libcpp_mutex_lock(__libcpp_mutex_reference&& __m)
{
return pthread_mutex_lock(__m);
}
-int __libcpp_mutex_trylock(__libcpp_mutex_t *__m)
+int __libcpp_mutex_trylock(__libcpp_mutex_reference&& __m)
{
return pthread_mutex_trylock(__m);
}
-int __libcpp_mutex_unlock(__libcpp_mutex_t *__m)
+int __libcpp_mutex_unlock(__libcpp_mutex_reference&& __m)
{
return pthread_mutex_unlock(__m);
}
-int __libcpp_mutex_destroy(__libcpp_mutex_t *__m)
+int __libcpp_mutex_destroy(__libcpp_mutex_reference&& __m)
{
return pthread_mutex_destroy(__m);
}
@@ -191,13 +229,14 @@
return pthread_cond_broadcast(__cv);
}
-int __libcpp_condvar_wait(__libcpp_condvar_t *__cv, __libcpp_mutex_t *__m)
+int __libcpp_condvar_wait(__libcpp_condvar_t* __cv,
+ __libcpp_mutex_reference&& __m)
{
return pthread_cond_wait(__cv, __m);
}
-int __libcpp_condvar_timedwait(__libcpp_condvar_t *__cv, __libcpp_mutex_t *__m,
- timespec *__ts)
+int __libcpp_condvar_timedwait(__libcpp_condvar_t* __cv,
+ __libcpp_mutex_reference&& __m, timespec* __ts)
{
return pthread_cond_timedwait(__cv, __m, __ts);
}
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits