Title: [267021] trunk/Source/WebKit
Revision
267021
Author
[email protected]
Date
2020-09-14 10:23:04 -0700 (Mon, 14 Sep 2020)

Log Message

RemoteAudioMediaStreamTrackRenderer should process its IPC messages from a background thread
https://bugs.webkit.org/show_bug.cgi?id=216474

Reviewed by Eric Carlson.

Register RemoteAudioMediaStreamTrackRendererManager as a thread message receiver
for both RemoteAudioMediaStreamTrackRenderer and RemoteAudioMediaStreamTrackRendererManager messages.
All processing is sent to a high priority work queue.
Given AudioMediaStreamTrackRendererUnit is not fully thread safe, we use a single WorkQueue for the whole GPUProcess.
All operations will happen in this thread, while in WebProcess, create/start/stop/release are main thread.

We no longer compile the generated RemoteAudioMediaStreamTrackRendererManager::didReceiveMessage
and instead implement our own version to handle manager and renderer messages.

Covered by WebRTC audio tests run with GPU process enabled.

* GPUProcess/GPUConnectionToWebProcess.cpp:
(WebKit::GPUConnectionToWebProcess::GPUConnectionToWebProcess):
(WebKit::GPUConnectionToWebProcess::~GPUConnectionToWebProcess):
(WebKit::GPUConnectionToWebProcess::dispatchMessage):
* GPUProcess/GPUConnectionToWebProcess.h:
* GPUProcess/GPUProcess.cpp:
(WebKit::GPUProcess::audioMediaStreamTrackRendererQueue):
* GPUProcess/GPUProcess.h:
* GPUProcess/webrtc/RemoteAudioMediaStreamTrackRenderer.h:
* GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.cpp:
(WebKit::RemoteAudioMediaStreamTrackRendererManager::RemoteAudioMediaStreamTrackRendererManager):
(WebKit::RemoteAudioMediaStreamTrackRendererManager::~RemoteAudioMediaStreamTrackRendererManager):
(WebKit::RemoteAudioMediaStreamTrackRendererManager::close):
(WebKit::RemoteAudioMediaStreamTrackRendererManager::dispatchToThread):
(WebKit::RemoteAudioMediaStreamTrackRendererManager::didReceiveMessage):
* GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.h:
* SourcesCocoa.txt:

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (267020 => 267021)


--- trunk/Source/WebKit/ChangeLog	2020-09-14 17:21:50 UTC (rev 267020)
+++ trunk/Source/WebKit/ChangeLog	2020-09-14 17:23:04 UTC (rev 267021)
@@ -1,3 +1,39 @@
+2020-09-14  Youenn Fablet  <[email protected]>
+
+        RemoteAudioMediaStreamTrackRenderer should process its IPC messages from a background thread
+        https://bugs.webkit.org/show_bug.cgi?id=216474
+
+        Reviewed by Eric Carlson.
+
+        Register RemoteAudioMediaStreamTrackRendererManager as a thread message receiver
+        for both RemoteAudioMediaStreamTrackRenderer and RemoteAudioMediaStreamTrackRendererManager messages.
+        All processing is sent to a high priority work queue.
+        Given AudioMediaStreamTrackRendererUnit is not fully thread safe, we use a single WorkQueue for the whole GPUProcess.
+        All operations will happen in this thread, while in WebProcess, create/start/stop/release are main thread.
+
+        We no longer compile the generated RemoteAudioMediaStreamTrackRendererManager::didReceiveMessage
+        and instead implement our own version to handle manager and renderer messages.
+
+        Covered by WebRTC audio tests run with GPU process enabled.
+
+        * GPUProcess/GPUConnectionToWebProcess.cpp:
+        (WebKit::GPUConnectionToWebProcess::GPUConnectionToWebProcess):
+        (WebKit::GPUConnectionToWebProcess::~GPUConnectionToWebProcess):
+        (WebKit::GPUConnectionToWebProcess::dispatchMessage):
+        * GPUProcess/GPUConnectionToWebProcess.h:
+        * GPUProcess/GPUProcess.cpp:
+        (WebKit::GPUProcess::audioMediaStreamTrackRendererQueue):
+        * GPUProcess/GPUProcess.h:
+        * GPUProcess/webrtc/RemoteAudioMediaStreamTrackRenderer.h:
+        * GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.cpp:
+        (WebKit::RemoteAudioMediaStreamTrackRendererManager::RemoteAudioMediaStreamTrackRendererManager):
+        (WebKit::RemoteAudioMediaStreamTrackRendererManager::~RemoteAudioMediaStreamTrackRendererManager):
+        (WebKit::RemoteAudioMediaStreamTrackRendererManager::close):
+        (WebKit::RemoteAudioMediaStreamTrackRendererManager::dispatchToThread):
+        (WebKit::RemoteAudioMediaStreamTrackRendererManager::didReceiveMessage):
+        * GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.h:
+        * SourcesCocoa.txt:
+
 2020-09-13  Simon Fraser  <[email protected]>
 
         Overflow:scroll rubberbanding is interrupted by post-layout scrolling

Modified: trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp (267020 => 267021)


--- trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp	2020-09-14 17:21:50 UTC (rev 267020)
+++ trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp	2020-09-14 17:23:04 UTC (rev 267021)
@@ -38,8 +38,6 @@
 #include "LibWebRTCCodecsProxyMessages.h"
 #include "Logging.h"
 #include "RemoteAudioMediaStreamTrackRendererManager.h"
-#include "RemoteAudioMediaStreamTrackRendererManagerMessages.h"
-#include "RemoteAudioMediaStreamTrackRendererMessages.h"
 #include "RemoteMediaPlayerManagerProxy.h"
 #include "RemoteMediaPlayerManagerProxyMessages.h"
 #include "RemoteMediaPlayerProxy.h"
@@ -156,6 +154,9 @@
     , m_gpuProcess(gpuProcess)
     , m_webProcessIdentifier(webProcessIdentifier)
     , m_sessionID(sessionID)
+#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
+    , m_audioTrackRendererManager(RemoteAudioMediaStreamTrackRendererManager::create(*this))
+#endif
 {
     RELEASE_ASSERT(RunLoop::isMain());
     m_connection->open();
@@ -166,6 +167,10 @@
     RELEASE_ASSERT(RunLoop::isMain());
 
     m_connection->invalidate();
+
+#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
+    m_audioTrackRendererManager->close();
+#endif
 }
 
 void GPUConnectionToWebProcess::didClose(IPC::Connection&)
@@ -239,14 +244,6 @@
 }
 #endif
 
-RemoteAudioMediaStreamTrackRendererManager& GPUConnectionToWebProcess::audioTrackRendererManager()
-{
-    if (!m_audioTrackRendererManager)
-        m_audioTrackRendererManager = makeUnique<RemoteAudioMediaStreamTrackRendererManager>(*this);
-
-    return *m_audioTrackRendererManager;
-}
-
 RemoteSampleBufferDisplayLayerManager& GPUConnectionToWebProcess::sampleBufferDisplayLayerManager()
 {
     if (!m_sampleBufferDisplayLayerManager)
@@ -382,14 +379,6 @@
         return true;
     }
 #endif // HAVE(AVASSETWRITERDELEGATE)
-    if (decoder.messageReceiverName() == Messages::RemoteAudioMediaStreamTrackRendererManager::messageReceiverName()) {
-        audioTrackRendererManager().didReceiveMessageFromWebProcess(connection, decoder);
-        return true;
-    }
-    if (decoder.messageReceiverName() == Messages::RemoteAudioMediaStreamTrackRenderer::messageReceiverName()) {
-        audioTrackRendererManager().didReceiveRendererMessage(connection, decoder);
-        return true;
-    }
     if (decoder.messageReceiverName() == Messages::RemoteSampleBufferDisplayLayerManager::messageReceiverName()) {
         sampleBufferDisplayLayerManager().didReceiveMessageFromWebProcess(connection, decoder);
         return true;

Modified: trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h (267020 => 267021)


--- trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h	2020-09-14 17:21:50 UTC (rev 267020)
+++ trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h	2020-09-14 17:23:04 UTC (rev 267021)
@@ -120,7 +120,6 @@
 #if HAVE(AVASSETWRITERDELEGATE)
     RemoteMediaRecorderManager& mediaRecorderManager();
 #endif
-    RemoteAudioMediaStreamTrackRendererManager& audioTrackRendererManager();
     RemoteSampleBufferDisplayLayerManager& sampleBufferDisplayLayerManager();
 #endif
 
@@ -169,10 +168,10 @@
     PAL::SessionID m_sessionID;
 #if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
     std::unique_ptr<UserMediaCaptureManagerProxy> m_userMediaCaptureManagerProxy;
+    Ref<RemoteAudioMediaStreamTrackRendererManager> m_audioTrackRendererManager;
 #if HAVE(AVASSETWRITERDELEGATE)
     std::unique_ptr<RemoteMediaRecorderManager> m_remoteMediaRecorderManager;
 #endif
-    std::unique_ptr<RemoteAudioMediaStreamTrackRendererManager> m_audioTrackRendererManager;
     std::unique_ptr<RemoteSampleBufferDisplayLayerManager> m_sampleBufferDisplayLayerManager;
 #endif
 #if ENABLE(MEDIA_STREAM)

Modified: trunk/Source/WebKit/GPUProcess/GPUProcess.cpp (267020 => 267021)


--- trunk/Source/WebKit/GPUProcess/GPUProcess.cpp	2020-09-14 17:21:50 UTC (rev 267020)
+++ trunk/Source/WebKit/GPUProcess/GPUProcess.cpp	2020-09-14 17:23:04 UTC (rev 267021)
@@ -257,6 +257,15 @@
 }
 #endif
 
+#if ENABLE(MEDIA_STREAM) && PLATFORM(COCOA)
+WorkQueue& GPUProcess::audioMediaStreamTrackRendererQueue()
+{
+    if (!m_audioMediaStreamTrackRendererQueue)
+        m_audioMediaStreamTrackRendererQueue = WorkQueue::create("RemoteAudioMediaStreamTrackRenderer", WorkQueue::Type::Serial, WorkQueue::QOS::UserInteractive);
+    return *m_audioMediaStreamTrackRendererQueue;
+}
+#endif
+
 } // namespace WebKit
 
 #endif // ENABLE(GPU_PROCESS)

Modified: trunk/Source/WebKit/GPUProcess/GPUProcess.h (267020 => 267021)


--- trunk/Source/WebKit/GPUProcess/GPUProcess.h	2020-09-14 17:21:50 UTC (rev 267020)
+++ trunk/Source/WebKit/GPUProcess/GPUProcess.h	2020-09-14 17:23:04 UTC (rev 267021)
@@ -75,6 +75,10 @@
 
     WebCore::NowPlayingManager& nowPlayingManager();
 
+#if ENABLE(MEDIA_STREAM) && PLATFORM(COCOA)
+    WorkQueue& audioMediaStreamTrackRendererQueue();
+#endif
+
 private:
     void lowMemoryHandler(Critical);
 
@@ -112,7 +116,10 @@
         bool allowDisplayCapture { false };
     };
     HashMap<WebCore::ProcessIdentifier, MediaCaptureAccess> m_mediaCaptureAccessMap;
+#if PLATFORM(COCOA)
+    RefPtr<WorkQueue> m_audioMediaStreamTrackRendererQueue;
 #endif
+#endif
 
     struct GPUSession {
         String mediaCacheDirectory;

Modified: trunk/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRenderer.h (267020 => 267021)


--- trunk/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRenderer.h	2020-09-14 17:21:50 UTC (rev 267020)
+++ trunk/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRenderer.h	2020-09-14 17:23:04 UTC (rev 267021)
@@ -44,13 +44,13 @@
 class RemoteAudioMediaStreamTrackRendererManager;
 class SharedRingBufferStorage;
 
-class RemoteAudioMediaStreamTrackRenderer final : private IPC::MessageReceiver {
+class RemoteAudioMediaStreamTrackRenderer {
     WTF_MAKE_FAST_ALLOCATED;
 public:
     explicit RemoteAudioMediaStreamTrackRenderer(RemoteAudioMediaStreamTrackRendererManager&);
     ~RemoteAudioMediaStreamTrackRenderer();
 
-    void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
+    void didReceiveMessage(IPC::Connection&, IPC::Decoder&);
 
 private:
     // IPC::MessageReceiver

Modified: trunk/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.cpp (267020 => 267021)


--- trunk/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.cpp	2020-09-14 17:21:50 UTC (rev 267020)
+++ trunk/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.cpp	2020-09-14 17:23:04 UTC (rev 267021)
@@ -29,7 +29,10 @@
 #if PLATFORM(COCOA) && ENABLE(GPU_PROCESS) && ENABLE(MEDIA_STREAM)
 
 #include "Decoder.h"
+#include "GPUProcess.h"
 #include "RemoteAudioMediaStreamTrackRenderer.h"
+#include "RemoteAudioMediaStreamTrackRendererManagerMessages.h"
+#include "RemoteAudioMediaStreamTrackRendererMessages.h"
 
 namespace WebKit {
 
@@ -36,13 +39,43 @@
 
 RemoteAudioMediaStreamTrackRendererManager::RemoteAudioMediaStreamTrackRendererManager(GPUConnectionToWebProcess& connectionToWebProcess)
     : m_connectionToWebProcess(connectionToWebProcess)
+    , m_queue(connectionToWebProcess.gpuProcess().audioMediaStreamTrackRendererQueue())
 {
+    m_connectionToWebProcess.connection().addThreadMessageReceiver(Messages::RemoteAudioMediaStreamTrackRenderer::messageReceiverName(), this);
+    m_connectionToWebProcess.connection().addThreadMessageReceiver(Messages::RemoteAudioMediaStreamTrackRendererManager::messageReceiverName(), this);
 }
 
-RemoteAudioMediaStreamTrackRendererManager::~RemoteAudioMediaStreamTrackRendererManager() = default;
+RemoteAudioMediaStreamTrackRendererManager::~RemoteAudioMediaStreamTrackRendererManager()
+{
+    m_connectionToWebProcess.connection().removeThreadMessageReceiver(Messages::RemoteAudioMediaStreamTrackRenderer::messageReceiverName());
+    m_connectionToWebProcess.connection().removeThreadMessageReceiver(Messages::RemoteAudioMediaStreamTrackRendererManager::messageReceiverName());
+}
 
-void RemoteAudioMediaStreamTrackRendererManager::didReceiveRendererMessage(IPC::Connection& connection, IPC::Decoder& decoder)
+void RemoteAudioMediaStreamTrackRendererManager::close()
 {
+    dispatchToThread([this, protectedThis = makeRef(*this)] {
+        m_renderers.clear();
+    });
+}
+
+void RemoteAudioMediaStreamTrackRendererManager::dispatchToThread(Function<void()>&& callback)
+{
+    m_queue->dispatch(WTFMove(callback));
+}
+
+void RemoteAudioMediaStreamTrackRendererManager::didReceiveMessage(IPC::Connection& connection, IPC::Decoder& decoder)
+{
+    if (!decoder.destinationID()) {
+        if (decoder.messageName() == Messages::RemoteAudioMediaStreamTrackRendererManager::CreateRenderer::name()) {
+            IPC::handleMessage<Messages::RemoteAudioMediaStreamTrackRendererManager::CreateRenderer>(decoder, this, &RemoteAudioMediaStreamTrackRendererManager::createRenderer);
+            return;
+        }
+        if (decoder.messageName() == Messages::RemoteAudioMediaStreamTrackRendererManager::ReleaseRenderer::name()) {
+            IPC::handleMessage<Messages::RemoteAudioMediaStreamTrackRendererManager::ReleaseRenderer>(decoder, this, &RemoteAudioMediaStreamTrackRendererManager::releaseRenderer);
+            return;
+        }
+        return;
+    }
     if (auto* renderer = m_renderers.get(makeObjectIdentifier<AudioMediaStreamTrackRendererIdentifierType>(decoder.destinationID())))
         renderer->didReceiveMessage(connection, decoder);
 }

Modified: trunk/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.h (267020 => 267021)


--- trunk/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.h	2020-09-14 17:21:50 UTC (rev 267020)
+++ trunk/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.h	2020-09-14 17:23:04 UTC (rev 267021)
@@ -28,8 +28,8 @@
 #if PLATFORM(COCOA) && ENABLE(GPU_PROCESS) && ENABLE(MEDIA_STREAM)
 
 #include "AudioMediaStreamTrackRendererIdentifier.h"
+#include "Connection.h"
 #include "GPUConnectionToWebProcess.h"
-#include "MessageReceiver.h"
 #include <wtf/Forward.h>
 #include <wtf/HashMap.h>
 
@@ -42,10 +42,10 @@
 
 class RemoteAudioMediaStreamTrackRenderer;
 
-class RemoteAudioMediaStreamTrackRendererManager final : private IPC::MessageReceiver {
+class RemoteAudioMediaStreamTrackRendererManager final : public IPC::Connection::ThreadMessageReceiver {
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    explicit RemoteAudioMediaStreamTrackRendererManager(GPUConnectionToWebProcess&);
+    static Ref<RemoteAudioMediaStreamTrackRendererManager> create(GPUConnectionToWebProcess& process) { return adoptRef(*new RemoteAudioMediaStreamTrackRendererManager(process)); }
     ~RemoteAudioMediaStreamTrackRendererManager();
 
     void didReceiveRendererMessage(IPC::Connection&, IPC::Decoder&);
@@ -53,7 +53,14 @@
 
     IPC::Connection& connection() const { return m_connectionToWebProcess.connection(); }
 
+    void close();
+
 private:
+    explicit RemoteAudioMediaStreamTrackRendererManager(GPUConnectionToWebProcess&);
+
+    // IPC::Connection::ThreadMessageReceiver
+    void dispatchToThread(Function<void()>&&) final;
+
     // IPC::MessageReceiver
     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
     void createRenderer(AudioMediaStreamTrackRendererIdentifier);
@@ -60,6 +67,7 @@
     void releaseRenderer(AudioMediaStreamTrackRendererIdentifier);
 
     GPUConnectionToWebProcess& m_connectionToWebProcess;
+    Ref<WorkQueue> m_queue;
     HashMap<AudioMediaStreamTrackRendererIdentifier, std::unique_ptr<RemoteAudioMediaStreamTrackRenderer>> m_renderers;
 };
 

Modified: trunk/Source/WebKit/SourcesCocoa.txt (267020 => 267021)


--- trunk/Source/WebKit/SourcesCocoa.txt	2020-09-14 17:21:50 UTC (rev 267020)
+++ trunk/Source/WebKit/SourcesCocoa.txt	2020-09-14 17:23:04 UTC (rev 267021)
@@ -664,7 +664,6 @@
 RemoteAudioDestinationProxyMessageReceiver.cpp
 RemoteAudioSessionMessageReceiver.cpp
 RemoteAudioSessionProxyMessageReceiver.cpp
-RemoteAudioMediaStreamTrackRendererManagerMessageReceiver.cpp
 RemoteAudioMediaStreamTrackRendererMessageReceiver.cpp
 RemoteMediaRecorderMessageReceiver.cpp
 RemoteMediaRecorderManagerMessageReceiver.cpp
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to