compnerd updated this revision to Diff 82983.
compnerd marked 3 inline comments as done.
compnerd added a comment.

Use l-values, static_cast.


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
@@ -63,6 +63,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
@@ -81,21 +83,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 static_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 static_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
@@ -105,11 +142,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);
@@ -164,7 +202,7 @@
 #if defined(_LIBCPP_HAS_THREAD_API_PTHREAD) || \
     defined(_LIBCPP_BUILDING_THREAD_API_EXTERNAL_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);
@@ -188,22 +226,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);
 }
@@ -219,13 +257,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
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to