Title: [161002] trunk/Source/WebKit2
Revision
161002
Author
[email protected]
Date
2013-12-23 10:36:54 -0800 (Mon, 23 Dec 2013)

Log Message

Convert ThreadCondition in WebKit2 over to std::condition_variable
https://bugs.webkit.org/show_bug.cgi?id=126161

Reviewed by Sam Weinig.

* Platform/CoreIPC/Connection.cpp:
(CoreIPC::Connection::waitForMessage):
(CoreIPC::Connection::processIncomingMessage):
* Platform/CoreIPC/Connection.h:
* Shared/BlockingResponseMap.h:
(BlockingResponseMap::waitForResponse):
(BlockingResponseMap::didReceiveResponse):
(BlockingResponseMap::cancel):
* UIProcess/API/mac/WKPrintingView.h:
* UIProcess/API/mac/WKPrintingView.mm:
(pageDidDrawToPDF):
(-[WKPrintingView _preparePDFDataForPrintingOnSecondaryThread]):
(prepareDataForPrintingOnSecondaryThread):
(-[WKPrintingView knowsPageRange:]):

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (161001 => 161002)


--- trunk/Source/WebKit2/ChangeLog	2013-12-23 18:27:20 UTC (rev 161001)
+++ trunk/Source/WebKit2/ChangeLog	2013-12-23 18:36:54 UTC (rev 161002)
@@ -1,3 +1,25 @@
+2013-12-23  Anders Carlsson  <[email protected]>
+
+        Convert ThreadCondition in WebKit2 over to std::condition_variable
+        https://bugs.webkit.org/show_bug.cgi?id=126161
+
+        Reviewed by Sam Weinig.
+
+        * Platform/CoreIPC/Connection.cpp:
+        (CoreIPC::Connection::waitForMessage):
+        (CoreIPC::Connection::processIncomingMessage):
+        * Platform/CoreIPC/Connection.h:
+        * Shared/BlockingResponseMap.h:
+        (BlockingResponseMap::waitForResponse):
+        (BlockingResponseMap::didReceiveResponse):
+        (BlockingResponseMap::cancel):
+        * UIProcess/API/mac/WKPrintingView.h:
+        * UIProcess/API/mac/WKPrintingView.mm:
+        (pageDidDrawToPDF):
+        (-[WKPrintingView _preparePDFDataForPrintingOnSecondaryThread]):
+        (prepareDataForPrintingOnSecondaryThread):
+        (-[WKPrintingView knowsPageRange:]):
+
 2013-12-22  Martin Robinson  <[email protected]>
 
         [GTK][CMake] libtool-compatible soversion calculation

Modified: trunk/Source/WebKit2/Platform/CoreIPC/Connection.cpp (161001 => 161002)


--- trunk/Source/WebKit2/Platform/CoreIPC/Connection.cpp	2013-12-23 18:27:20 UTC (rev 161001)
+++ trunk/Source/WebKit2/Platform/CoreIPC/Connection.cpp	2013-12-23 18:36:54 UTC (rev 161002)
@@ -393,12 +393,10 @@
         }
     }
 
-    double absoluteTime = currentTime() + timeout;
-    
     std::pair<std::pair<StringReference, StringReference>, uint64_t> messageAndDestination(std::make_pair(std::make_pair(messageReceiverName, messageName), destinationID));
     
     {
-        MutexLocker locker(m_waitForMessageMutex);
+        std::lock_guard<std::mutex> lock(m_waitForMessageMutex);
 
         // We don't support having multiple clients wait for the same message.
         ASSERT(!m_waitForMessageMap.contains(messageAndDestination));
@@ -409,7 +407,7 @@
     
     // Now wait for it to be set.
     while (true) {
-        MutexLocker locker(m_waitForMessageMutex);
+        std::unique_lock<std::mutex> lock(m_waitForMessageMutex);
 
         auto it = m_waitForMessageMap.find(messageAndDestination);
         if (it->value) {
@@ -420,7 +418,9 @@
         }
 
         // Now we wait.
-        if (!m_waitForMessageCondition.timedWait(m_waitForMessageMutex, absoluteTime)) {
+        // FIXME: It would be better if Connection::waitForMessage took an std::chrono::milliseconds instead of a double.
+        std::chrono::milliseconds timeoutInMilliseconds(static_cast<std::chrono::milliseconds::rep>(timeout * 1000));
+        if (m_waitForMessageCondition.wait_for(lock, timeoutInMilliseconds) == std::cv_status::timeout) {
             // We timed out, now remove the pending wait.
             m_waitForMessageMap.remove(messageAndDestination);
 
@@ -645,14 +645,14 @@
 
     // Check if we're waiting for this message.
     {
-        MutexLocker locker(m_waitForMessageMutex);
+        std::lock_guard<std::mutex> lock(m_waitForMessageMutex);
 
         auto it = m_waitForMessageMap.find(std::make_pair(std::make_pair(message->messageReceiverName(), message->messageName()), message->destinationID()));
         if (it != m_waitForMessageMap.end()) {
             it->value = std::move(message);
             ASSERT(it->value);
         
-            m_waitForMessageCondition.signal();
+            m_waitForMessageCondition.notify_one();
             return;
         }
     }

Modified: trunk/Source/WebKit2/Platform/CoreIPC/Connection.h (161001 => 161002)


--- trunk/Source/WebKit2/Platform/CoreIPC/Connection.h	2013-12-23 18:27:20 UTC (rev 161001)
+++ trunk/Source/WebKit2/Platform/CoreIPC/Connection.h	2013-12-23 18:36:54 UTC (rev 161002)
@@ -34,11 +34,11 @@
 #include "MessageReceiver.h"
 #include "WorkQueue.h"
 #include <atomic>
+#include <thread>
 #include <wtf/Deque.h>
 #include <wtf/Forward.h>
 #include <wtf/PassRefPtr.h>
 #include <wtf/OwnPtr.h>
-#include <wtf/Threading.h>
 #include <wtf/text/CString.h>
 
 #if OS(DARWIN)
@@ -238,8 +238,8 @@
     Mutex m_outgoingMessagesLock;
     Deque<std::unique_ptr<MessageEncoder>> m_outgoingMessages;
     
-    ThreadCondition m_waitForMessageCondition;
-    Mutex m_waitForMessageMutex;
+    std::condition_variable m_waitForMessageCondition;
+    std::mutex m_waitForMessageMutex;
     HashMap<std::pair<std::pair<StringReference, StringReference>, uint64_t>, std::unique_ptr<MessageDecoder>> m_waitForMessageMap;
 
     // Represents a sync request for which we're waiting on a reply.

Modified: trunk/Source/WebKit2/Shared/BlockingResponseMap.h (161001 => 161002)


--- trunk/Source/WebKit2/Shared/BlockingResponseMap.h	2013-12-23 18:27:20 UTC (rev 161001)
+++ trunk/Source/WebKit2/Shared/BlockingResponseMap.h	2013-12-23 18:36:54 UTC (rev 161002)
@@ -26,9 +26,8 @@
 #ifndef BlockingResponseMap_h
 #define BlockingResponseMap_h
 
+#include <thread>
 #include <wtf/HashMap.h>
-#include <wtf/OwnPtr.h>
-#include <wtf/ThreadingPrimitives.h>
 
 template<typename T>
 class BlockingResponseMap {
@@ -40,7 +39,7 @@
     std::unique_ptr<T> waitForResponse(uint64_t requestID)
     {
         while (true) {
-            MutexLocker locker(m_mutex);
+            std::unique_lock<std::mutex> lock(m_mutex);
 
             if (m_canceled)
                 return nullptr;
@@ -48,7 +47,7 @@
             if (std::unique_ptr<T> response = m_responses.take(requestID))
                 return response;
 
-            m_condition.wait(m_mutex);
+            m_condition.wait(lock);
         }
 
         return nullptr;
@@ -56,12 +55,13 @@
 
     void didReceiveResponse(uint64_t requestID, std::unique_ptr<T> response)
     {
-        MutexLocker locker(m_mutex);
+        std::lock_guard<std::mutex> lock(m_mutex);
         ASSERT(!m_responses.contains(requestID));
 
         m_responses.set(requestID, std::move(response));
+
         // FIXME: Waking up all threads is quite inefficient.
-        m_condition.broadcast();
+        m_condition.notify_all();
     }
 
     void cancel()
@@ -69,12 +69,12 @@
         m_canceled = true;
 
         // FIXME: Waking up all threads is quite inefficient.
-        m_condition.broadcast();
+        m_condition.notify_all();
     }
 
 private:
-    Mutex m_mutex;
-    ThreadCondition m_condition;
+    std::mutex m_mutex;
+    std::condition_variable m_condition;
 
     HashMap<uint64_t, std::unique_ptr<T>> m_responses;
     bool m_canceled;

Modified: trunk/Source/WebKit2/UIProcess/API/mac/WKPrintingView.h (161001 => 161002)


--- trunk/Source/WebKit2/UIProcess/API/mac/WKPrintingView.h	2013-12-23 18:27:20 UTC (rev 161001)
+++ trunk/Source/WebKit2/UIProcess/API/mac/WKPrintingView.h	2013-12-23 18:36:54 UTC (rev 161002)
@@ -24,6 +24,7 @@
  */
 
 #import <WebCore/IntRectHash.h>
+#import <thread>
 #import <wtf/RetainPtr.h>
 
 @class WKPrintingViewData;
@@ -53,8 +54,8 @@
     uint64_t _expectedPrintCallback;
 
     BOOL _isPrintingFromSecondaryThread;
-    Mutex _printingCallbackMutex;
-    ThreadCondition _printingCallbackCondition;
+    std::mutex _printingCallbackMutex;
+    std::condition_variable _printingCallbackCondition;
 
     NSTimer *_autodisplayResumeTimer;
 }

Modified: trunk/Source/WebKit2/UIProcess/API/mac/WKPrintingView.mm (161001 => 161002)


--- trunk/Source/WebKit2/UIProcess/API/mac/WKPrintingView.mm	2013-12-23 18:27:20 UTC (rev 161001)
+++ trunk/Source/WebKit2/UIProcess/API/mac/WKPrintingView.mm	2013-12-23 18:36:54 UTC (rev 161002)
@@ -251,7 +251,7 @@
         if (data)
             view->_printedPagesData.append(data->bytes(), data->size());
         view->_expectedPrintCallback = 0;
-        view->_printingCallbackCondition.signal();
+        view->_printingCallbackCondition.notify_one();
     }
 }
 
@@ -260,11 +260,11 @@
     ASSERT(RunLoop::isMain());
 
     if (!_webFrame->page()) {
-        _printingCallbackCondition.signal();
+        _printingCallbackCondition.notify_one();
         return;
     }
 
-    MutexLocker lock(_printingCallbackMutex);
+    std::lock_guard<std::mutex> lock(_printingCallbackMutex);
 
     ASSERT([self _hasPageRects]);
     ASSERT(_printedPagesData.isEmpty());
@@ -358,7 +358,7 @@
     ASSERT(RunLoop::isMain());
 
     WKPrintingView *view = static_cast<WKPrintingView *>(untypedContext);
-    MutexLocker lock(view->_printingCallbackMutex);
+    std::lock_guard<std::mutex> lock(view->_printingCallbackMutex);
 
     // We may have received page rects while a message to call this function traveled from secondary thread to main one.
     if ([view _hasPageRects]) {
@@ -396,9 +396,9 @@
         *range = NSMakeRange(1, _printingPageRects.size());
     else if (!RunLoop::isMain()) {
         ASSERT(![self _isPrintingPreview]);
-        MutexLocker lock(_printingCallbackMutex);
+        std::unique_lock<std::mutex> lock(_printingCallbackMutex);
         callOnMainThread(prepareDataForPrintingOnSecondaryThread, self);
-        _printingCallbackCondition.wait(_printingCallbackMutex);
+        _printingCallbackCondition.wait(lock);
         *range = NSMakeRange(1, _printingPageRects.size());
     } else {
         ASSERT([self _isPrintingPreview]);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to