Title: [89771] trunk/Source/WebKit2
Revision
89771
Author
[email protected]
Date
2011-06-26 10:17:55 -0700 (Sun, 26 Jun 2011)

Log Message

2011-06-26  Anders Carlsson  <[email protected]>

        Reviewed by Dan Bernstein.

        Don't use a Mutex for protecting access to the connection queue clients
        https://bugs.webkit.org/show_bug.cgi?id=63403

        Make sure to only access the queue client vector from the connection work queue.
        This gets rid of a lock and ensures that adding/removing clients from callbacks works correctly.

        * Platform/CoreIPC/Connection.cpp:
        (CoreIPC::Connection::addQueueClient):
        (CoreIPC::Connection::removeQueueClient):
        (CoreIPC::Connection::addQueueClientOnWorkQueue):
        (CoreIPC::Connection::removeQueueClientOnWorkQueue):
        (CoreIPC::Connection::processIncomingMessage):
        * Platform/CoreIPC/Connection.h:

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (89770 => 89771)


--- trunk/Source/WebKit2/ChangeLog	2011-06-26 17:04:34 UTC (rev 89770)
+++ trunk/Source/WebKit2/ChangeLog	2011-06-26 17:17:55 UTC (rev 89771)
@@ -1,3 +1,21 @@
+2011-06-26  Anders Carlsson  <[email protected]>
+
+        Reviewed by Dan Bernstein.
+
+        Don't use a Mutex for protecting access to the connection queue clients
+        https://bugs.webkit.org/show_bug.cgi?id=63403
+
+        Make sure to only access the queue client vector from the connection work queue.
+        This gets rid of a lock and ensures that adding/removing clients from callbacks works correctly.
+
+        * Platform/CoreIPC/Connection.cpp:
+        (CoreIPC::Connection::addQueueClient):
+        (CoreIPC::Connection::removeQueueClient):
+        (CoreIPC::Connection::addQueueClientOnWorkQueue):
+        (CoreIPC::Connection::removeQueueClientOnWorkQueue):
+        (CoreIPC::Connection::processIncomingMessage):
+        * Platform/CoreIPC/Connection.h:
+
 2011-06-25  Brent Fulgham  <[email protected]>
 
         Unreviewed build correction after r89426.

Modified: trunk/Source/WebKit2/Platform/CoreIPC/Connection.cpp (89770 => 89771)


--- trunk/Source/WebKit2/Platform/CoreIPC/Connection.cpp	2011-06-26 17:04:34 UTC (rev 89770)
+++ trunk/Source/WebKit2/Platform/CoreIPC/Connection.cpp	2011-06-26 17:17:55 UTC (rev 89771)
@@ -236,17 +236,23 @@
 
 void Connection::addQueueClient(QueueClient* queueClient)
 {
-    MutexLocker locker(m_connectionQueueClientsMutex);
+    m_connectionQueue.scheduleWork(WorkItem::create(this, &Connection::addQueueClientOnWorkQueue, queueClient));
+}
+
+void Connection::removeQueueClient(QueueClient* queueClient)
+{
+    m_connectionQueue.scheduleWork(WorkItem::create(this, &Connection::removeQueueClientOnWorkQueue, queueClient));
+}
+
+void Connection::addQueueClientOnWorkQueue(QueueClient* queueClient)
+{
     ASSERT(!m_connectionQueueClients.contains(queueClient));
-
     m_connectionQueueClients.append(queueClient);
 }
 
-void Connection::removeQueueClient(QueueClient* queueClient)
+void Connection::removeQueueClientOnWorkQueue(QueueClient* queueClient)
 {
-    MutexLocker locker(m_connectionQueueClientsMutex);
     size_t index = m_connectionQueueClients.find(queueClient);
-
     ASSERT(index != notFound);
     m_connectionQueueClients.remove(index);
 }
@@ -531,15 +537,11 @@
     }
 
     // Hand off the message to the connection queue clients.
-    {
-        MutexLocker locker(m_connectionQueueClientsMutex);
-
-        for (size_t i = 0; i < m_connectionQueueClients.size(); ++i) {
-            if (!m_connectionQueueClients[i]->willProcessMessageOnClientRunLoop(this, incomingMessage.messageID(), incomingMessage.arguments())) {
-                // A connection queue client handled the message, our work here is done.
-                incomingMessage.releaseArguments();
-                return;
-            }
+    for (size_t i = 0; i < m_connectionQueueClients.size(); ++i) {
+        if (!m_connectionQueueClients[i]->willProcessMessageOnClientRunLoop(this, incomingMessage.messageID(), incomingMessage.arguments())) {
+            // A connection queue client handled the message, our work here is done.
+            incomingMessage.releaseArguments();
+            return;
         }
     }
 

Modified: trunk/Source/WebKit2/Platform/CoreIPC/Connection.h (89770 => 89771)


--- trunk/Source/WebKit2/Platform/CoreIPC/Connection.h	2011-06-26 17:04:34 UTC (rev 89770)
+++ trunk/Source/WebKit2/Platform/CoreIPC/Connection.h	2011-06-26 17:17:55 UTC (rev 89771)
@@ -216,6 +216,9 @@
     void processIncomingMessage(MessageID, PassOwnPtr<ArgumentDecoder>);
     void processIncomingSyncReply(PassOwnPtr<ArgumentDecoder>);
 
+    void addQueueClientOnWorkQueue(QueueClient*);
+    void removeQueueClientOnWorkQueue(QueueClient*);
+    
     bool canSendOutgoingMessages() const;
     bool platformCanSendOutgoingMessages() const;
     void sendOutgoingMessages();
@@ -246,7 +249,6 @@
     WorkQueue m_connectionQueue;
     RunLoop* m_clientRunLoop;
 
-    Mutex m_connectionQueueClientsMutex;
     Vector<QueueClient*> m_connectionQueueClients;
 
     unsigned m_inDispatchMessageCount;
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to