Use WordLock instead of std::mutex for Threading
[WebKit-https.git] / Source / WTF / wtf / Condition.h
index bb0c9a5..75c8ea5 100644 (file)
@@ -26,8 +26,6 @@
 #ifndef WTF_Condition_h
 #define WTF_Condition_h
 
-#include <functional>
-#include <wtf/CurrentTime.h>
 #include <wtf/Noncopyable.h>
 #include <wtf/ParkingLot.h>
 #include <wtf/TimeWithDynamicClockType.h>
@@ -37,20 +35,21 @@ namespace WTF {
 // This is a condition variable that is suitable for use with any lock-like object, including
 // our own WTF::Lock. It features standard wait()/notifyOne()/notifyAll() methods in addition to
 // a variety of wait-with-timeout methods. This includes methods that use WTF's own notion of
-// time, like wall-clock time (i.e. currentTime()) and monotonic time (i.e.
-// monotonicallyIncreasingTime()). This is a very efficient condition variable. It only requires
-// one byte of memory. notifyOne() and notifyAll() require just a load and branch for the fast
-// case where no thread is waiting. This condition variable, when used with WTF::Lock, can
-// outperform a system condition variable and lock by up to 58x.
-
-// This is a struct without a constructor or destructor so that it can be statically initialized.
-// Use Lock in instance variables.
-struct ConditionBase {
+// time, like wall-clock time (i.e. WallTime) and monotonic time (i.e. MonotonicTime). This is
+// a very efficient condition variable. It only requires one byte of memory. notifyOne() and
+// notifyAll() require just a load and branch for the fast case where no thread is waiting.
+// This condition variable, when used with WTF::Lock, can outperform a system condition variable
+// and lock by up to 58x.
+class Condition {
+    WTF_MAKE_NONCOPYABLE(Condition);
+public:
     // Condition will accept any kind of time and convert it internally, but this typedef tells
     // you what kind of time Condition would be able to use without conversions. However, if you
     // are unlikely to be affected by the cost of conversions, it is better to use MonotonicTime.
-    typedef ParkingLot::Time Time;
-    
+    using Time = ParkingLot::Time;
+
+    constexpr Condition() = default;
+
     // Wait on a parking queue while releasing the given lock. It will unlock the lock just before
     // parking, and relock it upon wakeup. Returns true if we woke up due to some call to
     // notifyOne() or notifyAll(). Returns false if we woke up due to a timeout. Note that this form
@@ -169,20 +168,11 @@ struct ConditionBase {
         ParkingLot::unparkAll(&m_hasWaiters);
     }
     
-protected:
-    Atomic<bool> m_hasWaiters;
-};
-
-class Condition : public ConditionBase {
-    WTF_MAKE_NONCOPYABLE(Condition);
-public:
-    Condition()
-    {
-        m_hasWaiters.store(false);
-    }
+private:
+    Atomic<bool> m_hasWaiters { false };
 };
 
-typedef ConditionBase StaticCondition;
+using StaticCondition = Condition;
 
 } // namespace WTF