bmalloc: AsyncTask should use Mutex instead of std::mutex
authorggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 19 Apr 2014 03:23:03 +0000 (03:23 +0000)
committerggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 19 Apr 2014 03:23:03 +0000 (03:23 +0000)
https://bugs.webkit.org/show_bug.cgi?id=131865

Reviewed by Gavin Barraclough.

std::mutex is so slow that it makes parallelizing simple tasks through
AsyncTask a net regression. Mutex fixes this.

* bmalloc/AsyncTask.h:
(bmalloc::Function>::AsyncTask):
(bmalloc::Function>::join):
(bmalloc::Function>::runSlowCase):
(bmalloc::Function>::entryPoint):
* bmalloc/Mutex.h:
(bmalloc::Mutex::init):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@167526 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/bmalloc/ChangeLog
Source/bmalloc/bmalloc/AsyncTask.h
Source/bmalloc/bmalloc/Mutex.h

index a75bc2e..5f22b6a 100644 (file)
@@ -1,5 +1,23 @@
 2014-04-18  Geoffrey Garen  <ggaren@apple.com>
 
+        bmalloc: AsyncTask should use Mutex instead of std::mutex
+        https://bugs.webkit.org/show_bug.cgi?id=131865
+
+        Reviewed by Gavin Barraclough.
+
+        std::mutex is so slow that it makes parallelizing simple tasks through
+        AsyncTask a net regression. Mutex fixes this.
+
+        * bmalloc/AsyncTask.h:
+        (bmalloc::Function>::AsyncTask):
+        (bmalloc::Function>::join):
+        (bmalloc::Function>::runSlowCase):
+        (bmalloc::Function>::entryPoint):
+        * bmalloc/Mutex.h:
+        (bmalloc::Mutex::init):
+
+2014-04-18  Geoffrey Garen  <ggaren@apple.com>
+
         bmalloc: Added an XSmall line size
         https://bugs.webkit.org/show_bug.cgi?id=131851
 
index e7cb952..cbe0af7 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "BAssert.h"
 #include "Inline.h"
+#include "Mutex.h"
 #include <atomic>
 #include <condition_variable>
 #include <pthread.h>
@@ -55,8 +56,8 @@ private:
 
     std::atomic<State> m_state;
 
-    std::mutex m_conditionMutex;
-    std::condition_variable m_condition;
+    Mutex m_conditionMutex;
+    std::condition_variable_any m_condition;
     pthread_t m_thread;
 
     Object& m_object;
@@ -73,6 +74,7 @@ AsyncTask<Object, Function>::AsyncTask(Object& object, const Function& function)
     , m_object(object)
     , m_function(function)
 {
+    m_conditionMutex.init();
 }
 
 template<typename Object, typename Function>
@@ -81,7 +83,7 @@ void AsyncTask<Object, Function>::join()
     if (m_state == Exited)
         return;
 
-    { std::lock_guard<std::mutex> lock(m_conditionMutex); }
+    { std::lock_guard<Mutex> lock(m_conditionMutex); }
     m_condition.notify_one();
 
     while (m_state != Exited)
@@ -104,7 +106,7 @@ NO_INLINE void AsyncTask<Object, Function>::runSlowCase()
         return;
 
     if (oldState == Sleeping) {
-        { std::lock_guard<std::mutex> lock(m_conditionMutex); }
+        { std::lock_guard<Mutex> lock(m_conditionMutex); }
         m_condition.notify_one();
         return;
     }
@@ -131,7 +133,7 @@ void AsyncTask<Object, Function>::entryPoint()
 
         expectedState = Running;
         if (m_state.compare_exchange_weak(expectedState, Sleeping)) {
-            std::unique_lock<std::mutex> lock(m_conditionMutex);
+            std::unique_lock<Mutex> lock(m_conditionMutex);
             m_condition.wait_for(lock, exitDelay, [=]() { return this->m_state != Sleeping; });
         }
 
index 29c1cb3..d470035 100644 (file)
 
 namespace bmalloc {
 
-class Mutex {
+struct Mutex {
 public:
+    void init();
+
     void lock();
     bool try_lock();
     void unlock();
@@ -45,6 +47,11 @@ private:
     std::atomic_flag m_flag;
 };
 
+inline void Mutex::init()
+{
+    m_flag.clear();
+}
+
 inline bool Mutex::try_lock()
 {
     return !m_flag.test_and_set(std::memory_order_acquire);