[PATCH] D19412: [libcxx] Refactor pthread usage - II

Eric Fiselier via cfe-commits cfe-commits at lists.llvm.org
Thu Apr 28 16:45:01 PDT 2016


EricWF added a comment.

OK. I *think* this is my last round of review comments except for one specific issue. I'm still looking into the changes to the static mutex's and condition_variables in `memory.cpp` and `algorithm.cpp`. In these cases I don't want to go from compile-time initialization to run-time initialization.  This could introduce the static initialization order fiasco.


================
Comment at: include/__mutex_base:37
@@ -38,2 +36,3 @@
 {
-    pthread_mutex_t __m_;
+    typedef __libcpp_mutex_t __mutex_type;
+    __mutex_type __m_;
----------------
Why not use `__libcpp_mutex_t` directly? Sorry for yet another renaming comment.

================
Comment at: include/__mutex_base:43
@@ -43,3 +42,3 @@
 #ifndef _LIBCPP_HAS_NO_CONSTEXPR
-     constexpr mutex() _NOEXCEPT : __m_(PTHREAD_MUTEX_INITIALIZER) {}
+    constexpr mutex() _NOEXCEPT : __m_(__LIBCPP_MUTEX_INITIALIZER) {}
 #else
----------------
Only one underscore in `_LIBCPP_MUTEX_INITIALIZER`

================
Comment at: include/__threading_support:11
@@ +10,3 @@
+
+#ifndef _LIBCPP_OS_SUPPORT
+#define _LIBCPP_OS_SUPPORT
----------------
`_LIBCPP_THREADING_SUPPORT`

================
Comment at: include/__threading_support:13
@@ +12,3 @@
+#define _LIBCPP_OS_SUPPORT
+
+#ifndef _LIBCPP_HAS_NO_THREADS
----------------
```
#include <__config>

#ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
#pragma GCC system_header
#endif
```

================
Comment at: include/__threading_support:30
@@ +29,3 @@
+inline _LIBCPP_ALWAYS_INLINE
+int __libcpp_mutex_init(__libcpp_mutex_t* __m, bool is_recursive = false)
+{
----------------
Two comments:
1. This is only used to initialize a recursive mutex. Let's simply name this `__libcpp_recursive_mutex_init` and get rid of the bool parameter. 
2. This is only used in `recursive_mutex.cpp`. It's OK to keep this in `__threading_support` for now but I'll probably want to move this out of the headers later.

================
Comment at: include/__threading_support:33
@@ +32,3 @@
+    pthread_mutexattr_t attr;
+    int ec = pthread_mutexattr_init(&attr);
+    if (!ec && is_recursive) {
----------------
Nit:

Let's invert the control flow here:
```
if (ec) return ec;
ec = pthread_mutexattr_settype(...);
```

Then at the end we can just `return 0;`


================
Comment at: include/__threading_support:82
@@ +81,3 @@
+// Condition variable
+#define __LIBCPP_COND_INITIALIZER PTHREAD_COND_INITIALIZER
+typedef pthread_cond_t __libcpp_condvar_t;
----------------
Nit: `_LIBCPP_CONDVAR_INITIALIZER`

================
Comment at: include/__threading_support:119
@@ +118,3 @@
+inline _LIBCPP_ALWAYS_INLINE
+int __libcpp_thread_id_compare(__libcpp_thread_id t1, __libcpp_thread_id t2)
+{
----------------
Can we split this into `__libcpp_thread_id_equal` and `__libcpp_thread_id_less`?



================
Comment at: include/__threading_support:129
@@ +128,3 @@
+inline _LIBCPP_ALWAYS_INLINE
+int __libcpp_thread_create(__libcpp_thread_t* __t, _Func&& __f, _Arg&& __arg)
+{
----------------
This signature needs to work in C++03. Let's make the signature `__libcpp_thread_create(__libcpp_thread_t* __t, _Func* __f, _Arg* __arg)` because both `_Func` and `_Arg` should be pointers so there is no need to perfect forward them.

================
Comment at: include/__threading_support:169
@@ +168,3 @@
+inline _LIBCPP_ALWAYS_INLINE
+int __libcpp_tl_create(__libcpp_tl_key* __key, _Func&& __at_exit)
+{
----------------
This signature needs to work in C++03. Make the signature `__libcpp_tl_create(__libcpp_tl_key*, _Func*)` since the function must be a pointer.

================
Comment at: include/__threading_support:194
@@ +193,2 @@
+
+#endif // _LIBCPP_OS_SUPPORT
----------------
`_LIBCPP_THREADING_SUPPORT`

================
Comment at: src/mutex.cpp:228
@@ -249,3 +227,3 @@
 #else // !_LIBCPP_HAS_NO_THREADS
-    pthread_mutex_lock(&mut);
+    unique_lock<mutex> lk(mut);
     while (flag == 1)
----------------
This change seems incorrect. There are some paths below where we manually unlock `mut` before a `throw` or `return`. Using `unique_lock` will result in a double unlock.

I think the fix is to change all `mut.lock()` and `mut.unlock()` calls into `lk.lock()`/`lk.unlock()` calls.


http://reviews.llvm.org/D19412





More information about the cfe-commits mailing list