- 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