Fix thread comparison by making sure we never pass our special 'not a thread' value...
authorMarshall Clow <mclow.lists@gmail.com>
Wed, 14 Aug 2019 20:54:56 +0000 (20:54 +0000)
committerMarshall Clow <mclow.lists@gmail.com>
Wed, 14 Aug 2019 20:54:56 +0000 (20:54 +0000)
llvm-svn: 368916

libcxx/include/__threading_support
libcxx/src/mutex.cpp

index 29a2907..0331b7c 100644 (file)
@@ -420,13 +420,21 @@ public:
 
     friend _LIBCPP_INLINE_VISIBILITY
         bool operator==(__thread_id __x, __thread_id __y) _NOEXCEPT
-        {return __libcpp_thread_id_equal(__x.__id_, __y.__id_);}
+        { // don't pass id==0 to underlying routines
+        if (__x.__id_ == 0) return __y.__id_ == 0;
+        if (__y.__id_ == 0) return false;
+        return __libcpp_thread_id_equal(__x.__id_, __y.__id_);
+        }
     friend _LIBCPP_INLINE_VISIBILITY
         bool operator!=(__thread_id __x, __thread_id __y) _NOEXCEPT
         {return !(__x == __y);}
     friend _LIBCPP_INLINE_VISIBILITY
         bool operator< (__thread_id __x, __thread_id __y) _NOEXCEPT
-        {return  __libcpp_thread_id_less(__x.__id_, __y.__id_);}
+        { // id==0 is always less than any other thread_id
+        if (__x.__id_ == 0) return __y.__id_ != 0;
+        if (__y.__id_ == 0) return false;
+        return  __libcpp_thread_id_less(__x.__id_, __y.__id_);
+        }
     friend _LIBCPP_INLINE_VISIBILITY
         bool operator<=(__thread_id __x, __thread_id __y) _NOEXCEPT
         {return !(__y < __x);}
@@ -438,7 +446,7 @@ public:
         {return !(__x < __y);}
 
     _LIBCPP_INLINE_VISIBILITY
-    void reset() { __id_ = 0; }
+    void __reset() { __id_ = 0; }
     
     template<class _CharT, class _Traits>
     friend
index ddd36b4..1827857 100644 (file)
@@ -181,7 +181,7 @@ recursive_timed_mutex::unlock() _NOEXCEPT
     unique_lock<mutex> lk(__m_);
     if (--__count_ == 0)
     {
-        __id_.reset();
+        __id_.__reset();
         lk.unlock();
         __cv_.notify_one();
     }