Changeset 267021 in webkit
- Timestamp:
- Sep 14, 2020 10:23:04 AM (4 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r267002 r267021 1 2020-09-14 Youenn Fablet <youenn@apple.com> 2 3 RemoteAudioMediaStreamTrackRenderer should process its IPC messages from a background thread 4 https://bugs.webkit.org/show_bug.cgi?id=216474 5 6 Reviewed by Eric Carlson. 7 8 Register RemoteAudioMediaStreamTrackRendererManager as a thread message receiver 9 for both RemoteAudioMediaStreamTrackRenderer and RemoteAudioMediaStreamTrackRendererManager messages. 10 All processing is sent to a high priority work queue. 11 Given AudioMediaStreamTrackRendererUnit is not fully thread safe, we use a single WorkQueue for the whole GPUProcess. 12 All operations will happen in this thread, while in WebProcess, create/start/stop/release are main thread. 13 14 We no longer compile the generated RemoteAudioMediaStreamTrackRendererManager::didReceiveMessage 15 and instead implement our own version to handle manager and renderer messages. 16 17 Covered by WebRTC audio tests run with GPU process enabled. 18 19 * GPUProcess/GPUConnectionToWebProcess.cpp: 20 (WebKit::GPUConnectionToWebProcess::GPUConnectionToWebProcess): 21 (WebKit::GPUConnectionToWebProcess::~GPUConnectionToWebProcess): 22 (WebKit::GPUConnectionToWebProcess::dispatchMessage): 23 * GPUProcess/GPUConnectionToWebProcess.h: 24 * GPUProcess/GPUProcess.cpp: 25 (WebKit::GPUProcess::audioMediaStreamTrackRendererQueue): 26 * GPUProcess/GPUProcess.h: 27 * GPUProcess/webrtc/RemoteAudioMediaStreamTrackRenderer.h: 28 * GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.cpp: 29 (WebKit::RemoteAudioMediaStreamTrackRendererManager::RemoteAudioMediaStreamTrackRendererManager): 30 (WebKit::RemoteAudioMediaStreamTrackRendererManager::~RemoteAudioMediaStreamTrackRendererManager): 31 (WebKit::RemoteAudioMediaStreamTrackRendererManager::close): 32 (WebKit::RemoteAudioMediaStreamTrackRendererManager::dispatchToThread): 33 (WebKit::RemoteAudioMediaStreamTrackRendererManager::didReceiveMessage): 34 * GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.h: 35 * SourcesCocoa.txt: 36 1 37 2020-09-13 Simon Fraser <simon.fraser@apple.com> 2 38 -
trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp
r266745 r267021 39 39 #include "Logging.h" 40 40 #include "RemoteAudioMediaStreamTrackRendererManager.h" 41 #include "RemoteAudioMediaStreamTrackRendererManagerMessages.h"42 #include "RemoteAudioMediaStreamTrackRendererMessages.h"43 41 #include "RemoteMediaPlayerManagerProxy.h" 44 42 #include "RemoteMediaPlayerManagerProxyMessages.h" … … 157 155 , m_webProcessIdentifier(webProcessIdentifier) 158 156 , m_sessionID(sessionID) 157 #if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM) 158 , m_audioTrackRendererManager(RemoteAudioMediaStreamTrackRendererManager::create(*this)) 159 #endif 159 160 { 160 161 RELEASE_ASSERT(RunLoop::isMain()); … … 167 168 168 169 m_connection->invalidate(); 170 171 #if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM) 172 m_audioTrackRendererManager->close(); 173 #endif 169 174 } 170 175 … … 240 245 #endif 241 246 242 RemoteAudioMediaStreamTrackRendererManager& GPUConnectionToWebProcess::audioTrackRendererManager()243 {244 if (!m_audioTrackRendererManager)245 m_audioTrackRendererManager = makeUnique<RemoteAudioMediaStreamTrackRendererManager>(*this);246 247 return *m_audioTrackRendererManager;248 }249 250 247 RemoteSampleBufferDisplayLayerManager& GPUConnectionToWebProcess::sampleBufferDisplayLayerManager() 251 248 { … … 383 380 } 384 381 #endif // HAVE(AVASSETWRITERDELEGATE) 385 if (decoder.messageReceiverName() == Messages::RemoteAudioMediaStreamTrackRendererManager::messageReceiverName()) {386 audioTrackRendererManager().didReceiveMessageFromWebProcess(connection, decoder);387 return true;388 }389 if (decoder.messageReceiverName() == Messages::RemoteAudioMediaStreamTrackRenderer::messageReceiverName()) {390 audioTrackRendererManager().didReceiveRendererMessage(connection, decoder);391 return true;392 }393 382 if (decoder.messageReceiverName() == Messages::RemoteSampleBufferDisplayLayerManager::messageReceiverName()) { 394 383 sampleBufferDisplayLayerManager().didReceiveMessageFromWebProcess(connection, decoder); -
trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h
r262933 r267021 121 121 RemoteMediaRecorderManager& mediaRecorderManager(); 122 122 #endif 123 RemoteAudioMediaStreamTrackRendererManager& audioTrackRendererManager();124 123 RemoteSampleBufferDisplayLayerManager& sampleBufferDisplayLayerManager(); 125 124 #endif … … 170 169 #if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM) 171 170 std::unique_ptr<UserMediaCaptureManagerProxy> m_userMediaCaptureManagerProxy; 171 Ref<RemoteAudioMediaStreamTrackRendererManager> m_audioTrackRendererManager; 172 172 #if HAVE(AVASSETWRITERDELEGATE) 173 173 std::unique_ptr<RemoteMediaRecorderManager> m_remoteMediaRecorderManager; 174 174 #endif 175 std::unique_ptr<RemoteAudioMediaStreamTrackRendererManager> m_audioTrackRendererManager;176 175 std::unique_ptr<RemoteSampleBufferDisplayLayerManager> m_sampleBufferDisplayLayerManager; 177 176 #endif -
trunk/Source/WebKit/GPUProcess/GPUProcess.cpp
r260899 r267021 258 258 #endif 259 259 260 #if ENABLE(MEDIA_STREAM) && PLATFORM(COCOA) 261 WorkQueue& GPUProcess::audioMediaStreamTrackRendererQueue() 262 { 263 if (!m_audioMediaStreamTrackRendererQueue) 264 m_audioMediaStreamTrackRendererQueue = WorkQueue::create("RemoteAudioMediaStreamTrackRenderer", WorkQueue::Type::Serial, WorkQueue::QOS::UserInteractive); 265 return *m_audioMediaStreamTrackRendererQueue; 266 } 267 #endif 268 260 269 } // namespace WebKit 261 270 -
trunk/Source/WebKit/GPUProcess/GPUProcess.h
r262933 r267021 76 76 WebCore::NowPlayingManager& nowPlayingManager(); 77 77 78 #if ENABLE(MEDIA_STREAM) && PLATFORM(COCOA) 79 WorkQueue& audioMediaStreamTrackRendererQueue(); 80 #endif 81 78 82 private: 79 83 void lowMemoryHandler(Critical); … … 113 117 }; 114 118 HashMap<WebCore::ProcessIdentifier, MediaCaptureAccess> m_mediaCaptureAccessMap; 119 #if PLATFORM(COCOA) 120 RefPtr<WorkQueue> m_audioMediaStreamTrackRendererQueue; 121 #endif 115 122 #endif 116 123 -
trunk/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRenderer.h
r266745 r267021 45 45 class SharedRingBufferStorage; 46 46 47 class RemoteAudioMediaStreamTrackRenderer final : private IPC::MessageReceiver{47 class RemoteAudioMediaStreamTrackRenderer { 48 48 WTF_MAKE_FAST_ALLOCATED; 49 49 public: … … 51 51 ~RemoteAudioMediaStreamTrackRenderer(); 52 52 53 void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;53 void didReceiveMessage(IPC::Connection&, IPC::Decoder&); 54 54 55 55 private: -
trunk/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.cpp
r266745 r267021 30 30 31 31 #include "Decoder.h" 32 #include "GPUProcess.h" 32 33 #include "RemoteAudioMediaStreamTrackRenderer.h" 34 #include "RemoteAudioMediaStreamTrackRendererManagerMessages.h" 35 #include "RemoteAudioMediaStreamTrackRendererMessages.h" 33 36 34 37 namespace WebKit { … … 37 40 RemoteAudioMediaStreamTrackRendererManager::RemoteAudioMediaStreamTrackRendererManager(GPUConnectionToWebProcess& connectionToWebProcess) 38 41 : m_connectionToWebProcess(connectionToWebProcess) 42 , m_queue(connectionToWebProcess.gpuProcess().audioMediaStreamTrackRendererQueue()) 39 43 { 44 m_connectionToWebProcess.connection().addThreadMessageReceiver(Messages::RemoteAudioMediaStreamTrackRenderer::messageReceiverName(), this); 45 m_connectionToWebProcess.connection().addThreadMessageReceiver(Messages::RemoteAudioMediaStreamTrackRendererManager::messageReceiverName(), this); 40 46 } 41 47 42 RemoteAudioMediaStreamTrackRendererManager::~RemoteAudioMediaStreamTrackRendererManager() = default; 48 RemoteAudioMediaStreamTrackRendererManager::~RemoteAudioMediaStreamTrackRendererManager() 49 { 50 m_connectionToWebProcess.connection().removeThreadMessageReceiver(Messages::RemoteAudioMediaStreamTrackRenderer::messageReceiverName()); 51 m_connectionToWebProcess.connection().removeThreadMessageReceiver(Messages::RemoteAudioMediaStreamTrackRendererManager::messageReceiverName()); 52 } 43 53 44 void RemoteAudioMediaStreamTrackRendererManager:: didReceiveRendererMessage(IPC::Connection& connection, IPC::Decoder& decoder)54 void RemoteAudioMediaStreamTrackRendererManager::close() 45 55 { 56 dispatchToThread([this, protectedThis = makeRef(*this)] { 57 m_renderers.clear(); 58 }); 59 } 60 61 void RemoteAudioMediaStreamTrackRendererManager::dispatchToThread(Function<void()>&& callback) 62 { 63 m_queue->dispatch(WTFMove(callback)); 64 } 65 66 void RemoteAudioMediaStreamTrackRendererManager::didReceiveMessage(IPC::Connection& connection, IPC::Decoder& decoder) 67 { 68 if (!decoder.destinationID()) { 69 if (decoder.messageName() == Messages::RemoteAudioMediaStreamTrackRendererManager::CreateRenderer::name()) { 70 IPC::handleMessage<Messages::RemoteAudioMediaStreamTrackRendererManager::CreateRenderer>(decoder, this, &RemoteAudioMediaStreamTrackRendererManager::createRenderer); 71 return; 72 } 73 if (decoder.messageName() == Messages::RemoteAudioMediaStreamTrackRendererManager::ReleaseRenderer::name()) { 74 IPC::handleMessage<Messages::RemoteAudioMediaStreamTrackRendererManager::ReleaseRenderer>(decoder, this, &RemoteAudioMediaStreamTrackRendererManager::releaseRenderer); 75 return; 76 } 77 return; 78 } 46 79 if (auto* renderer = m_renderers.get(makeObjectIdentifier<AudioMediaStreamTrackRendererIdentifierType>(decoder.destinationID()))) 47 80 renderer->didReceiveMessage(connection, decoder); -
trunk/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.h
r266745 r267021 29 29 30 30 #include "AudioMediaStreamTrackRendererIdentifier.h" 31 #include "Connection.h" 31 32 #include "GPUConnectionToWebProcess.h" 32 #include "MessageReceiver.h"33 33 #include <wtf/Forward.h> 34 34 #include <wtf/HashMap.h> … … 43 43 class RemoteAudioMediaStreamTrackRenderer; 44 44 45 class RemoteAudioMediaStreamTrackRendererManager final : p rivate IPC::MessageReceiver {45 class RemoteAudioMediaStreamTrackRendererManager final : public IPC::Connection::ThreadMessageReceiver { 46 46 WTF_MAKE_FAST_ALLOCATED; 47 47 public: 48 explicit RemoteAudioMediaStreamTrackRendererManager(GPUConnectionToWebProcess&);48 static Ref<RemoteAudioMediaStreamTrackRendererManager> create(GPUConnectionToWebProcess& process) { return adoptRef(*new RemoteAudioMediaStreamTrackRendererManager(process)); } 49 49 ~RemoteAudioMediaStreamTrackRendererManager(); 50 50 … … 54 54 IPC::Connection& connection() const { return m_connectionToWebProcess.connection(); } 55 55 56 void close(); 57 56 58 private: 59 explicit RemoteAudioMediaStreamTrackRendererManager(GPUConnectionToWebProcess&); 60 61 // IPC::Connection::ThreadMessageReceiver 62 void dispatchToThread(Function<void()>&&) final; 63 57 64 // IPC::MessageReceiver 58 65 void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final; … … 61 68 62 69 GPUConnectionToWebProcess& m_connectionToWebProcess; 70 Ref<WorkQueue> m_queue; 63 71 HashMap<AudioMediaStreamTrackRendererIdentifier, std::unique_ptr<RemoteAudioMediaStreamTrackRenderer>> m_renderers; 64 72 }; -
trunk/Source/WebKit/SourcesCocoa.txt
r266342 r267021 665 665 RemoteAudioSessionMessageReceiver.cpp 666 666 RemoteAudioSessionProxyMessageReceiver.cpp 667 RemoteAudioMediaStreamTrackRendererManagerMessageReceiver.cpp668 667 RemoteAudioMediaStreamTrackRendererMessageReceiver.cpp 669 668 RemoteMediaRecorderMessageReceiver.cpp
Note: See TracChangeset
for help on using the changeset viewer.