- 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) {