bmalloc: Miscellaneous cleanup
[WebKit-https.git] / Source / bmalloc / bmalloc / StaticMutex.h
index 3194f1c6c64c1a1b5b868b75aeab826483918266..4404e952dd46b895c0e9bd21f0b3c124b6a31d03 100644 (file)
 
 #include "BAssert.h"
 #include <atomic>
+#include <mutex>
+#include <thread>
 
-// A fast replacement for std::mutex for use in static storage, where global
-// constructors and exit-time destructors are prohibited.
+// A fast replacement for std::mutex, for use in static storage.
+
+// Use StaticMutex in static storage, where global constructors and exit-time
+// destructors are prohibited, but all memory is zero-initialized automatically.
 
 namespace bmalloc {
 
 class StaticMutex {
+protected:
+    // Subclasses that support non-static storage must use explicit initialization.
+    void init();
+
 public:
     void lock();
     bool try_lock();
     void unlock();
 
 private:
-    friend class Mutex;
-
-    // Static storage will zero-initialize us automatically, but Mutex needs an
-    // API for explicit initialization.
-    void init();
-
     void lockSlowCase();
 
     std::atomic_flag m_flag;
 };
 
+static inline void sleep(
+    std::unique_lock<StaticMutex>& lock, std::chrono::milliseconds duration)
+{
+    if (duration == std::chrono::milliseconds(0))
+        return;
+    
+    lock.unlock();
+    std::this_thread::sleep_for(duration);
+    lock.lock();
+}
+
+static inline void waitUntilFalse(
+    std::unique_lock<StaticMutex>& lock, std::chrono::milliseconds sleepDuration,
+    bool& condition)
+{
+    while (condition) {
+        condition = false;
+        sleep(lock, sleepDuration);
+    }
+}
+
 inline void StaticMutex::init()
 {
     m_flag.clear();