Title: [276300] trunk/Source/WebKit
Revision
276300
Author
[email protected]
Date
2021-04-20 04:29:33 -0700 (Tue, 20 Apr 2021)

Log Message

WebGL GPU Process implementation should use thread safety annotations
https://bugs.webkit.org/show_bug.cgi?id=224752

Patch by Kimmo Kinnunen <[email protected]> on 2021-04-20
Reviewed by Kenneth Russell.

Make WebGL GPU process implementation use thread safety analysis.

Mark up the guarded variables in IPC Stream implementation using
clang thread safety analysis annotations.

* GPUProcess/graphics/RemoteGraphicsContextGL.cpp:
(WebKit::RemoteGraphicsContextGL::paintImageDataToImageBuffer):
* Platform/IPC/StreamConnectionWorkQueue.cpp:
(IPC::StreamConnectionWorkQueue::dispatch):
(IPC::StreamConnectionWorkQueue::addStreamConnection):
(IPC::StreamConnectionWorkQueue::removeStreamConnection):
(IPC::StreamConnectionWorkQueue::processStreams):
* Platform/IPC/StreamConnectionWorkQueue.h:
* Platform/IPC/StreamServerConnection.cpp:
(IPC::StreamServerConnectionBase::enqueueMessage):
* Platform/IPC/StreamServerConnection.h:
(IPC::StreamServerConnection<Receiver>::startReceivingMessages):
(IPC::StreamServerConnection<Receiver>::stopReceivingMessages):
(IPC::StreamServerConnection<Receiver>::dispatchStreamMessages):
(IPC::StreamServerConnection<Receiver>::dispatchOutOfStreamMessage):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (276299 => 276300)


--- trunk/Source/WebKit/ChangeLog	2021-04-20 10:54:38 UTC (rev 276299)
+++ trunk/Source/WebKit/ChangeLog	2021-04-20 11:29:33 UTC (rev 276300)
@@ -1,5 +1,33 @@
 2021-04-20  Kimmo Kinnunen  <[email protected]>
 
+        WebGL GPU Process implementation should use thread safety annotations
+        https://bugs.webkit.org/show_bug.cgi?id=224752
+
+        Reviewed by Kenneth Russell.
+
+        Make WebGL GPU process implementation use thread safety analysis.
+
+        Mark up the guarded variables in IPC Stream implementation using
+        clang thread safety analysis annotations.
+
+        * GPUProcess/graphics/RemoteGraphicsContextGL.cpp:
+        (WebKit::RemoteGraphicsContextGL::paintImageDataToImageBuffer):
+        * Platform/IPC/StreamConnectionWorkQueue.cpp:
+        (IPC::StreamConnectionWorkQueue::dispatch):
+        (IPC::StreamConnectionWorkQueue::addStreamConnection):
+        (IPC::StreamConnectionWorkQueue::removeStreamConnection):
+        (IPC::StreamConnectionWorkQueue::processStreams):
+        * Platform/IPC/StreamConnectionWorkQueue.h:
+        * Platform/IPC/StreamServerConnection.cpp:
+        (IPC::StreamServerConnectionBase::enqueueMessage):
+        * Platform/IPC/StreamServerConnection.h:
+        (IPC::StreamServerConnection<Receiver>::startReceivingMessages):
+        (IPC::StreamServerConnection<Receiver>::stopReceivingMessages):
+        (IPC::StreamServerConnection<Receiver>::dispatchStreamMessages):
+        (IPC::StreamServerConnection<Receiver>::dispatchOutOfStreamMessage):
+
+2021-04-20  Kimmo Kinnunen  <[email protected]>
+
         REGRESSION(r224516): Remote WebGL Context is not create due to RemoteRenderingBackend not being created
         https://bugs.webkit.org/show_bug.cgi?id=224751
 

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.cpp (276299 => 276300)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.cpp	2021-04-20 10:54:38 UTC (rev 276299)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.cpp	2021-04-20 11:29:33 UTC (rev 276300)
@@ -207,7 +207,7 @@
             // Unfortunately "flush" implementation in RemoteRenderingBackend overloads ordering and effects.
             imageBuffer->flushContext();
         }
-        auto locker = holdLock(mutex);
+        Locker locker { mutex };
         isFinished = true;
         conditionVariable.notifyOne();
     });

Modified: trunk/Source/WebKit/Platform/IPC/StreamConnectionWorkQueue.cpp (276299 => 276300)


--- trunk/Source/WebKit/Platform/IPC/StreamConnectionWorkQueue.cpp	2021-04-20 10:54:38 UTC (rev 276299)
+++ trunk/Source/WebKit/Platform/IPC/StreamConnectionWorkQueue.cpp	2021-04-20 11:29:33 UTC (rev 276300)
@@ -36,7 +36,7 @@
 void StreamConnectionWorkQueue::dispatch(WTF::Function<void()>&& function)
 {
     {
-        Locker locker(m_lock);
+        Locker locker { m_lock };
         m_functions.append(WTFMove(function));
         ASSERT(!m_shouldQuit); // Re-entering during shutdown not supported.
     }
@@ -46,7 +46,7 @@
 void StreamConnectionWorkQueue::addStreamConnection(StreamServerConnectionBase& connection)
 {
     {
-        Locker locker(m_lock);
+        Locker locker { m_lock };
         m_connections.add(connection);
         ASSERT(!m_shouldQuit); // Re-entering during shutdown not supported.
     }
@@ -57,7 +57,7 @@
 {
     ASSERT(m_processingThread);
     {
-        Locker locker(m_lock);
+        Locker locker { m_lock };
         m_connections.remove(connection);
         ASSERT(!m_shouldQuit); // Re-entering during shutdown not supported.
     }
@@ -112,7 +112,7 @@
         Deque<WTF::Function<void()>> functions;
         HashSet<Ref<StreamServerConnectionBase>> connections;
         {
-            auto locker = holdLock(m_lock);
+            Locker locker { m_lock };
             functions.swap(m_functions);
             connections = m_connections;
         }

Modified: trunk/Source/WebKit/Platform/IPC/StreamConnectionWorkQueue.h (276299 => 276300)


--- trunk/Source/WebKit/Platform/IPC/StreamConnectionWorkQueue.h	2021-04-20 10:54:38 UTC (rev 276299)
+++ trunk/Source/WebKit/Platform/IPC/StreamConnectionWorkQueue.h	2021-04-20 11:29:33 UTC (rev 276300)
@@ -28,10 +28,10 @@
 #include "IPCSemaphore.h"
 #include "StreamServerConnection.h"
 #include <atomic>
+#include <wtf/CheckedLock.h>
 #include <wtf/Deque.h>
 #include <wtf/FunctionDispatcher.h>
 #include <wtf/HashSet.h>
-#include <wtf/Lock.h>
 #include <wtf/Threading.h>
 
 namespace IPC {
@@ -60,9 +60,9 @@
 
     std::atomic<bool> m_shouldQuit { false };
 
-    Lock m_lock;
-    Deque<Function<void()>> m_functions;
-    HashSet<Ref<StreamServerConnectionBase>> m_connections;
+    CheckedLock m_lock;
+    Deque<Function<void()>> m_functions WTF_GUARDED_BY_LOCK(m_lock);
+    HashSet<Ref<StreamServerConnectionBase>> m_connections WTF_GUARDED_BY_LOCK(m_lock);
 };
 
 }

Modified: trunk/Source/WebKit/Platform/IPC/StreamServerConnection.cpp (276299 => 276300)


--- trunk/Source/WebKit/Platform/IPC/StreamServerConnection.cpp	2021-04-20 10:54:38 UTC (rev 276299)
+++ trunk/Source/WebKit/Platform/IPC/StreamServerConnection.cpp	2021-04-20 11:29:33 UTC (rev 276300)
@@ -53,7 +53,7 @@
 void StreamServerConnectionBase::enqueueMessage(Connection&, std::unique_ptr<Decoder>&& message)
 {
     {
-        auto locker = holdLock(m_outOfStreamMessagesLock);
+        Locker locker { m_outOfStreamMessagesLock };
         m_outOfStreamMessages.append(WTFMove(message));
     }
     m_workQueue.wakeUp();

Modified: trunk/Source/WebKit/Platform/IPC/StreamServerConnection.h (276299 => 276300)


--- trunk/Source/WebKit/Platform/IPC/StreamServerConnection.h	2021-04-20 10:54:38 UTC (rev 276299)
+++ trunk/Source/WebKit/Platform/IPC/StreamServerConnection.h	2021-04-20 11:29:33 UTC (rev 276300)
@@ -31,6 +31,7 @@
 #include "MessageNames.h"
 #include "StreamConnectionBuffer.h"
 #include "StreamConnectionEncoder.h"
+#include <wtf/CheckedLock.h>
 #include <wtf/Deque.h>
 #include <wtf/Threading.h>
 
@@ -92,8 +93,9 @@
     size_t m_serverOffset { 0 };
     StreamConnectionBuffer m_buffer;
 
-    Lock m_outOfStreamMessagesLock;
-    Deque<std::unique_ptr<Decoder>> m_outOfStreamMessages;
+    CheckedLock m_outOfStreamMessagesLock;
+    Deque<std::unique_ptr<Decoder>> m_outOfStreamMessages WTF_GUARDED_BY_LOCK(m_outOfStreamMessagesLock);
+
     bool m_isDispatchingStreamMessage { false };
 
     friend class StreamConnectionWorkQueue;
@@ -153,9 +155,9 @@
     bool processSetStreamDestinationID(Decoder&&, RefPtr<Receiver>& currentReceiver);
     bool dispatchStreamMessage(Decoder&&, Receiver&);
     bool dispatchOutOfStreamMessage(Decoder&&);
-    Lock m_receiversLock;
+    CheckedLock m_receiversLock;
     using ReceiversMap = HashMap<std::pair<uint8_t, uint64_t>, Ref<Receiver>>;
-    ReceiversMap m_receivers;
+    ReceiversMap m_receivers WTF_GUARDED_BY_LOCK(m_receiversLock);
     uint64_t m_currentDestinationID { 0 };
 };
 
@@ -164,7 +166,7 @@
 {
     {
         auto key = std::make_pair(static_cast<uint8_t>(receiverName), destinationID);
-        auto locker = holdLock(m_receiversLock);
+        Locker locker { m_receiversLock };
         ASSERT(!m_receivers.contains(key));
         m_receivers.add(key, makeRef(receiver));
     }
@@ -176,7 +178,7 @@
 {
     StreamServerConnectionBase::stopReceivingMessagesImpl(receiverName, destinationID);
     auto key = std::make_pair(static_cast<uint8_t>(receiverName), destinationID);
-    auto locker = holdLock(m_receiversLock);
+    Locker locker { m_receiversLock };
     ASSERT(m_receivers.contains(key));
     m_receivers.remove(key);
 }
@@ -217,7 +219,7 @@
                 m_connection->dispatchDidReceiveInvalidMessage(decoder.messageName());
                 return DispatchResult::HasNoMessages;
             }
-            auto locker = holdLock(m_receiversLock);
+            Locker locker { m_receiversLock };
             currentReceiver = m_receivers.get(key);
         }
         if (!currentReceiver) {
@@ -226,7 +228,7 @@
             // This means we must timeout every receiver in the stream connection.
             // Currently we assert that the receivers are empty, as we only have up to one receiver in
             // a stream connection until possibility of skipping is implemented properly.
-            auto locker = holdLock(m_receiversLock);
+            Locker locker { m_receiversLock };
             ASSERT(m_receivers.isEmpty());
             return DispatchResult::HasNoMessages;
         }
@@ -275,7 +277,7 @@
 {
     std::unique_ptr<Decoder> message;
     {
-        auto locker = holdLock(m_outOfStreamMessagesLock);
+        Locker locker { m_outOfStreamMessagesLock };
         if (m_outOfStreamMessages.isEmpty())
             return false;
         message = m_outOfStreamMessages.takeFirst();
@@ -286,7 +288,7 @@
     RefPtr<Receiver> receiver;
     {
         auto key = std::make_pair(static_cast<uint8_t>(message->messageReceiverName()), message->destinationID());
-        auto locker = holdLock(m_receiversLock);
+        Locker locker { m_receiversLock };
         receiver = m_receivers.get(key);
     }
     if (receiver) {
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to