Changeset 268423 in webkit
- Timestamp:
- Oct 13, 2020 2:53:22 PM (4 years ago)
- Location:
- trunk
- Files:
-
- 21 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r268422 r268423 1 2020-10-13 Chris Dumez <cdumez@apple.com> 2 3 WebAudio tests are crashing in debug when enabling the GPU process 4 https://bugs.webkit.org/show_bug.cgi?id=217663 5 6 Reviewed by Geoff Garen. 7 8 Unskip webaudio tests when the GPU process is enabled. 9 10 * gpu-process/TestExpectations: 11 1 12 2020-10-13 Karl Rackler <rackler@apple.com> 2 13 -
trunk/LayoutTests/gpu-process/TestExpectations
r268299 r268423 307 307 imported/w3c/web-platform-tests/service-workers/service-worker/fetch-audio-tainting.https.html [ Skip ] 308 308 309 imported/w3c/web-platform-tests/webaudio [ Skip ]310 309 imported/w3c/web-platform-tests/webrtc [ Skip ] 311 310 312 webaudio [ Skip ]313 311 webrtc [ Skip ] 314 312 -
trunk/Source/WTF/ChangeLog
r268420 r268423 1 2020-10-13 Chris Dumez <cdumez@apple.com> 2 3 WebAudio tests are crashing in debug when enabling the GPU process 4 https://bugs.webkit.org/show_bug.cgi?id=217663 5 6 Reviewed by Geoff Garen. 7 8 * wtf/CrossThreadQueue.h: 9 (WTF::CrossThreadQueue<DataType>::waitForMessage): 10 If CrossThreadQueue::kill() gets called while another thread is waiting on a 11 CrossThreadQueue::waitForMessage() call, make it so that waitForMessage() 12 returns a default-constructed DataType instead of crashing trying to 13 dequeue (since the queue is empty). 14 1 15 2020-10-13 Keith Rollin <krollin@apple.com> 2 16 -
trunk/Source/WTF/wtf/CrossThreadQueue.h
r248546 r268423 81 81 m_condition.wait(m_lock); 82 82 } 83 if (m_killed) 84 return { }; 83 85 84 86 return m_queue.takeFirst(); -
trunk/Source/WebCore/ChangeLog
r268420 r268423 1 2020-10-13 Chris Dumez <cdumez@apple.com> 2 3 WebAudio tests are crashing in debug when enabling the GPU process 4 https://bugs.webkit.org/show_bug.cgi?id=217663 5 6 Reviewed by Geoff Garen. 7 8 No new tests, unskipped existing tests. 9 10 * WebCore.xcodeproj/project.pbxproj: 11 * platform/audio/PushPullFIFO.h: 12 Export PushPullFIFO so that it can be used at WebKit layer. 13 1 14 2020-10-13 Keith Rollin <krollin@apple.com> 2 15 -
trunk/Source/WebCore/Headers.cmake
r268372 r268423 1069 1069 platform/audio/AudioSourceProvider.h 1070 1070 platform/audio/AudioStreamDescription.h 1071 platform/audio/AudioUtilities.h 1071 1072 platform/audio/NowPlayingInfo.h 1072 1073 platform/audio/PlatformAudioData.h 1073 1074 platform/audio/PlatformMediaSession.h 1074 1075 platform/audio/PlatformMediaSessionManager.h 1076 platform/audio/PushPullFIFO.h 1075 1077 1076 1078 platform/encryptedmedia/CDMEncryptionScheme.h -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r268386 r268423 2543 2543 83D35AEC1C7187FA00F70D5A /* XMLHttpRequestEventTarget.h in Headers */ = {isa = PBXBuildFile; fileRef = 83D35AEA1C7187ED00F70D5A /* XMLHttpRequestEventTarget.h */; }; 2544 2544 83D35AF21C718D9000F70D5A /* JSXMLHttpRequestEventTarget.h in Headers */ = {isa = PBXBuildFile; fileRef = 83D35AF01C718D8400F70D5A /* JSXMLHttpRequestEventTarget.h */; }; 2545 83D511F6250C1CBF002EDC51 /* PushPullFIFO.h in Headers */ = {isa = PBXBuildFile; fileRef = 83D511F5250C1CA8002EDC51 /* PushPullFIFO.h */; };2545 83D511F6250C1CBF002EDC51 /* PushPullFIFO.h in Headers */ = {isa = PBXBuildFile; fileRef = 83D511F5250C1CA8002EDC51 /* PushPullFIFO.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2546 2546 83D6AAE62524EE1C00428B4B /* WorkerOrWorkletGlobalScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 83D6AAE42524EE1300428B4B /* WorkerOrWorkletGlobalScope.h */; }; 2547 2547 83DB9E0F24DA19490037B468 /* BiquadFilterType.h in Headers */ = {isa = PBXBuildFile; fileRef = 83DB9E0C24DA18B50037B468 /* BiquadFilterType.h */; }; … … 5286 5286 FD31608812B026F700C1A359 /* AudioResamplerKernel.h in Headers */ = {isa = PBXBuildFile; fileRef = FD31605212B026F700C1A359 /* AudioResamplerKernel.h */; }; 5287 5287 FD31608912B026F700C1A359 /* AudioSourceProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = FD31605312B026F700C1A359 /* AudioSourceProvider.h */; settings = {ATTRIBUTES = (Private, ); }; }; 5288 FD31608B12B026F700C1A359 /* AudioUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = FD31605512B026F700C1A359 /* AudioUtilities.h */; };5288 FD31608B12B026F700C1A359 /* AudioUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = FD31605512B026F700C1A359 /* AudioUtilities.h */; settings = {ATTRIBUTES = (Private, ); }; }; 5289 5289 FD31608D12B026F700C1A359 /* Biquad.h in Headers */ = {isa = PBXBuildFile; fileRef = FD31605712B026F700C1A359 /* Biquad.h */; }; 5290 5290 FD31608F12B026F700C1A359 /* Cone.h in Headers */ = {isa = PBXBuildFile; fileRef = FD31605912B026F700C1A359 /* Cone.h */; }; -
trunk/Source/WebCore/platform/audio/PushPullFIFO.h
r267544 r268423 46 46 47 47 // |fifoLength| cannot exceed |maxFIFOLength|. Otherwise it crashes. 48 PushPullFIFO(unsigned numberOfChannels, size_t fifoLength);49 ~PushPullFIFO();48 WEBCORE_EXPORT PushPullFIFO(unsigned numberOfChannels, size_t fifoLength); 49 WEBCORE_EXPORT ~PushPullFIFO(); 50 50 51 51 // Pushes the rendered frames by WebAudio engine. … … 54 54 // will be overwritten and |indexRead| will be forcibly moved to 55 55 // |indexWrite| to avoid reading overwritten frames. 56 void push(const AudioBus* inputBus);56 WEBCORE_EXPORT void push(const AudioBus* inputBus); 57 57 58 58 // Pulls |framesRequested| by the audio device thread and returns the actual 59 59 // number of frames to be rendered by the source. (i.e. WebAudio graph) 60 size_t pull(AudioBus* outputBus, size_t framesRequested);60 WEBCORE_EXPORT size_t pull(AudioBus* outputBus, size_t framesRequested); 61 61 62 62 size_t framesAvailable() const { return m_framesAvailable; } -
trunk/Source/WebKit/ChangeLog
r268421 r268423 1 2020-10-13 Chris Dumez <cdumez@apple.com> 2 3 WebAudio tests are crashing in debug when enabling the GPU process 4 https://bugs.webkit.org/show_bug.cgi?id=217663 5 6 Reviewed by Geoff Garen. 7 8 WebAudio tests were crashing in debug when enabling the GPU process because it did audio 9 processing on the WebContent process's main thread. To address the issue, I made 10 RemoteAudioDestinationProxy a ThreadMessageReceiver so that it receives IPC on an audio 11 thread instead of the main thread. IPC messages are processed directly on the AudioWorklet 12 thread when active or on an audio thread constructed by RemoteAudioDestinationProxy 13 otherwise. 14 15 * GPUProcess/media/RemoteAudioDestinationManager.cpp: 16 (WebKit::RemoteAudioDestination::RemoteAudioDestination): 17 Use a PushPullFIFO structure in render() to avoid hanging the audio rendering thread 18 on a semaphore. Hanging the rendering thread was terrible for performance and was also 19 a source of deadlock since the underlying framework is holding a lock while render() is 20 called. We could process a RemoteAudioDestination::CreateAudioDestination sync IPC on the 21 main thread and deadlock on that lock. 22 23 * GPUProcess/webrtc/LibWebRTCCodecsProxy.h: 24 * GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.h: 25 * GPUProcess/webrtc/RemoteSampleBufferDisplayLayerManager.h: 26 * NetworkProcess/IndexedDB/WebIDBServer.h: 27 * NetworkProcess/webrtc/NetworkRTCProvider.h: 28 * WebProcess/Network/webrtc/LibWebRTCNetwork.h: 29 * WebProcess/cocoa/RemoteCaptureSampleManager.h: 30 Use ThreadMessageReceiverRefCounted instead of ThreadMessageReceiver since those classes 31 do not provide their own RefCounting. 32 33 * Platform/IPC/Connection.cpp: 34 (IPC::Connection::addWorkQueueMessageReceiver): 35 (IPC::Connection::removeWorkQueueMessageReceiver): 36 (IPC::Connection::addThreadMessageReceiver): 37 (IPC::Connection::removeThreadMessageReceiver): 38 (IPC::Connection::processIncomingMessage): 39 (IPC::Connection::dispatchMessageToWorkQueueReceiver): 40 (IPC::Connection::dispatchMessageToThreadReceiver): 41 * Platform/IPC/Connection.h: 42 (IPC::Connection::ThreadMessageReceiver::ref): 43 (IPC::Connection::ThreadMessageReceiver::deref): 44 - Add support for passing a destinationID when registering a WorkQueueMessageReceiver or a 45 ThreadMessageReceiver, similarly to regular MessageReceivers. This was needed here since 46 The GPUProcess sends IPC messages to the RemoteAudioDestinationProxy with a given 47 destinationID and since RemoteAudioDestinationProxy is now a ThreadMessageReceiver. 48 - Stop having ThreadMessageReceiver subclass ThreadSafeRefCounted since 49 RemoteAudioDestinationProxy already subclasses ThreadSafeRefCounted indirectly. A new 50 ThreadMessageReceiverRefCounted class was added for convenience for existing code that 51 relied on its refcounting. 52 53 * WebProcess/GPU/media/RemoteAudioDestinationProxy.cpp: 54 (WebKit::RemoteAudioDestinationProxy::RemoteAudioDestinationProxy): 55 (WebKit::RemoteAudioDestinationProxy::~RemoteAudioDestinationProxy): 56 (WebKit::RemoteAudioDestinationProxy::start): 57 (WebKit::RemoteAudioDestinationProxy::stop): 58 (WebKit::RemoteAudioDestinationProxy::renderBuffer): 59 (WebKit::RemoteAudioDestinationProxy::didChangeIsPlaying): 60 (WebKit::RemoteAudioDestinationProxy::dispatchToThread): 61 * WebProcess/GPU/media/RemoteAudioDestinationProxy.h: 62 Use a PushPullFIFO container in render() to avoid handing the audio rendering thread on 63 a semaphore while the Render IPC is getting processed by the WebProcess. 64 1 65 2020-10-13 Per Arne Vollan <pvollan@apple.com> 2 66 -
trunk/Source/WebKit/GPUProcess/media/RemoteAudioDestinationManager.cpp
r268118 r268423 36 36 #include <WebCore/AudioDestination.h> 37 37 #include <WebCore/AudioIOCallback.h> 38 #include <WebCore/AudioUtilities.h> 39 #include <WebCore/PushPullFIFO.h> 38 40 #include <WebCore/SharedBuffer.h> 39 41 #include <wtf/ThreadSafeRefCounted.h> … … 41 43 42 44 namespace WebKit { 45 46 // This FIFO size matches to one in AudioDestinationCocoa.cpp and was imported from Blink. 47 constexpr size_t fifoSize = 96 * WebCore::AudioUtilities::renderQuantumSize; 43 48 44 49 class RemoteAudioDestination : public ThreadSafeRefCounted<RemoteAudioDestination>, public WebCore::AudioIOCallback { … … 77 82 , m_id(identifier) 78 83 , m_destination(AudioDestination::create(*this, inputDeviceId, numberOfInputChannels, numberOfOutputChannels, sampleRate)) 84 , m_fifo(numberOfOutputChannels, fifoSize) 79 85 { 80 86 } 81 87 82 void render(AudioBus* sourceBus, AudioBus* destinationBus, size_t framesToProcess, const WebCore::AudioIOPosition& outputPosition) override88 void render(AudioBus*, AudioBus* destinationBus, size_t framesToProcess, const WebCore::AudioIOPosition& outputPosition) override 83 89 { 90 ASSERT(!isMainThread()); 91 84 92 if (m_protectThisDuringGracefulShutdown) 85 93 return; 86 94 87 auto protectedThis = makeRef(*this); 88 BinarySemaphore renderSemaphore; 95 { 96 auto locker = holdLock(m_fifoLock); 97 framesToProcess = m_fifo.pull(destinationBus, framesToProcess); 98 } 99 if (!framesToProcess) 100 return; 89 101 90 102 Vector<Ref<SharedMemory>> buffers; … … 94 106 } 95 107 96 // FIXME: Replace this code with a ring buffer. At least this happens in audio thread.97 ASSERT(!isMainThread());98 callOnMainThread([this, framesToProcess, outputPosition, &buffers, &renderSemaphore]{108 // FIXME: It is unfortunate we have to dispatch to the main thead here. We should be able to IPC straight from the 109 // render thread but this is not supported by sendWithAsyncReply(). 110 callOnMainThread([this, protectedThis = makeRef(*this), framesToProcess, outputPosition, buffers = WTFMove(buffers)]() mutable { 99 111 RemoteAudioBusData busData { framesToProcess, outputPosition, buffers.map([](auto& memory) { return memory.copyRef(); }) }; 100 112 ASSERT(framesToProcess); 101 m_connection.connection().sendWithAsyncReply(Messages::RemoteAudioDestinationProxy::RenderBuffer(busData), [&]() { 102 renderSemaphore.signal(); 113 m_connection.connection().sendWithAsyncReply(Messages::RemoteAudioDestinationProxy::RenderBuffer(busData), [this, protectedThis = WTFMove(protectedThis), buffers = WTFMove(buffers), framesToProcess]() { 114 auto audioBus = AudioBus::create(buffers.size(), framesToProcess, false); 115 for (unsigned i = 0; i < buffers.size(); ++i) 116 audioBus->setChannelMemory(i, static_cast<float*>(buffers[i]->data()), framesToProcess); 117 auto locker = holdLock(m_fifoLock); 118 m_fifo.push(audioBus.get()); 103 119 }, m_id.toUInt64()); 104 120 }); 105 renderSemaphore.wait();106 107 auto audioBus = AudioBus::create(buffers.size(), framesToProcess, false);108 for (unsigned i = 0; i < buffers.size(); ++i)109 audioBus->setChannelMemory(i, (float*)buffers[i]->data(), framesToProcess);110 destinationBus->copyFrom(*audioBus);111 121 } 112 122 … … 128 138 RefPtr<AudioDestination> m_destination; 129 139 RefPtr<RemoteAudioDestination> m_protectThisDuringGracefulShutdown; 140 Lock m_fifoLock; 141 WebCore::PushPullFIFO m_fifo; 130 142 }; 131 143 -
trunk/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.h
r267145 r268423 52 52 class GPUConnectionToWebProcess; 53 53 54 class LibWebRTCCodecsProxy : public IPC::Connection::ThreadMessageReceiver {54 class LibWebRTCCodecsProxy : public IPC::Connection::ThreadMessageReceiverRefCounted { 55 55 WTF_MAKE_FAST_ALLOCATED; 56 56 public: -
trunk/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererManager.h
r267156 r268423 43 43 class RemoteAudioMediaStreamTrackRenderer; 44 44 45 class RemoteAudioMediaStreamTrackRendererManager final : public IPC::Connection::ThreadMessageReceiver {45 class RemoteAudioMediaStreamTrackRendererManager final : public IPC::Connection::ThreadMessageReceiverRefCounted { 46 46 WTF_MAKE_FAST_ALLOCATED; 47 47 public: -
trunk/Source/WebKit/GPUProcess/webrtc/RemoteSampleBufferDisplayLayerManager.h
r267156 r268423 47 47 class RemoteSampleBufferDisplayLayer; 48 48 49 class RemoteSampleBufferDisplayLayerManager final : public IPC::Connection::ThreadMessageReceiver {49 class RemoteSampleBufferDisplayLayerManager final : public IPC::Connection::ThreadMessageReceiverRefCounted { 50 50 WTF_MAKE_FAST_ALLOCATED; 51 51 public: -
trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h
r266742 r268423 44 44 namespace WebKit { 45 45 46 class WebIDBServer final : public CrossThreadTaskHandler, public IPC::Connection::ThreadMessageReceiver {46 class WebIDBServer final : public CrossThreadTaskHandler, public IPC::Connection::ThreadMessageReceiverRefCounted { 47 47 public: 48 48 static Ref<WebIDBServer> create(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&&); -
trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.h
r264814 r268423 61 61 struct RTCPacketOptions; 62 62 63 class NetworkRTCProvider : public rtc::MessageHandler, public IPC::Connection::ThreadMessageReceiver {63 class NetworkRTCProvider : public rtc::MessageHandler, public IPC::Connection::ThreadMessageReceiverRefCounted { 64 64 public: 65 65 static Ref<NetworkRTCProvider> create(NetworkConnectionToWebProcess& connection) { return adoptRef(*new NetworkRTCProvider(connection)); } -
trunk/Source/WebKit/Platform/IPC/Connection.cpp
r264032 r268423 312 312 } 313 313 314 void Connection::addWorkQueueMessageReceiver(ReceiverName messageReceiverName, WorkQueue& workQueue, WorkQueueMessageReceiver* workQueueMessageReceiver )314 void Connection::addWorkQueueMessageReceiver(ReceiverName messageReceiverName, WorkQueue& workQueue, WorkQueueMessageReceiver* workQueueMessageReceiver, uint64_t destinationID) 315 315 { 316 316 ASSERT(RunLoop::isMain()); 317 317 318 318 auto locker = holdLock(m_workQueueMessageReceiversMutex); 319 ASSERT(!m_workQueueMessageReceivers.contains(messageReceiverName)); 320 321 m_workQueueMessageReceivers.add(messageReceiverName, std::make_pair(&workQueue, workQueueMessageReceiver)); 322 } 323 324 void Connection::removeWorkQueueMessageReceiver(ReceiverName messageReceiverName) 319 auto key = std::make_pair(static_cast<uint8_t>(messageReceiverName), destinationID); 320 ASSERT(!m_workQueueMessageReceivers.contains(key)); 321 322 m_workQueueMessageReceivers.add(key, std::make_pair(&workQueue, workQueueMessageReceiver)); 323 } 324 325 void Connection::removeWorkQueueMessageReceiver(ReceiverName messageReceiverName, uint64_t destinationID) 325 326 { 326 327 ASSERT(RunLoop::isMain()); 327 328 328 329 auto locker = holdLock(m_workQueueMessageReceiversMutex); 329 ASSERT(m_workQueueMessageReceivers.contains(messageReceiverName)); 330 m_workQueueMessageReceivers.remove(messageReceiverName); 330 auto key = std::make_pair(static_cast<uint8_t>(messageReceiverName), destinationID); 331 ASSERT(m_workQueueMessageReceivers.contains(key)); 332 m_workQueueMessageReceivers.remove(key); 331 333 } 332 334 … … 358 360 } 359 361 360 void Connection::addThreadMessageReceiver(ReceiverName messageReceiverName, ThreadMessageReceiver* threadMessageReceiver )362 void Connection::addThreadMessageReceiver(ReceiverName messageReceiverName, ThreadMessageReceiver* threadMessageReceiver, uint64_t destinationID) 361 363 { 362 364 ASSERT(RunLoop::isMain()); 363 365 364 366 auto locker = holdLock(m_threadMessageReceiversLock); 365 ASSERT(!m_threadMessageReceivers.contains(messageReceiverName)); 366 367 m_threadMessageReceivers.add(messageReceiverName, threadMessageReceiver); 368 } 369 370 void Connection::removeThreadMessageReceiver(ReceiverName messageReceiverName) 367 auto key = std::make_pair(static_cast<uint8_t>(messageReceiverName), destinationID); 368 ASSERT(!m_threadMessageReceivers.contains(key)); 369 370 m_threadMessageReceivers.add(key, threadMessageReceiver); 371 } 372 373 void Connection::removeThreadMessageReceiver(ReceiverName messageReceiverName, uint64_t destinationID) 371 374 { 372 375 ASSERT(RunLoop::isMain()); 373 376 374 377 auto locker = holdLock(m_threadMessageReceiversLock); 375 ASSERT(m_threadMessageReceivers.contains(messageReceiverName)); 376 377 m_threadMessageReceivers.remove(messageReceiverName); 378 auto key = std::make_pair(static_cast<uint8_t>(messageReceiverName), destinationID); 379 ASSERT(m_threadMessageReceivers.contains(key)); 380 381 m_threadMessageReceivers.remove(key); 378 382 } 379 383 … … 714 718 } 715 719 716 if (!WorkQueueMessageReceiverMap::isValidKey(message->messageReceiverName()) || !ThreadMessageReceiverMap::isValidKey(message->messageReceiverName())) { 720 auto threadedReceiverKey = std::make_pair(static_cast<uint8_t>(message->messageReceiverName()), message->destinationID()); 721 if (!WorkQueueMessageReceiverMap::isValidKey(threadedReceiverKey) || !ThreadMessageReceiverMap::isValidKey(threadedReceiverKey)) { 717 722 RunLoop::main().dispatch([protectedThis = makeRef(*this), messageName = message->messageName()]() mutable { 718 723 protectedThis->dispatchDidReceiveInvalidMessage(messageName); … … 1005 1010 { 1006 1011 auto locker = holdLock(m_workQueueMessageReceiversMutex); 1007 auto it = m_workQueueMessageReceivers.find(message->messageReceiverName()); 1012 auto key = std::make_pair(static_cast<uint8_t>(message->messageReceiverName()), message->destinationID()); 1013 auto it = m_workQueueMessageReceivers.find(key); 1008 1014 if (it != m_workQueueMessageReceivers.end()) { 1009 1015 it->value.first->dispatch([protectedThis = makeRef(*this), workQueueMessageReceiver = it->value.second, decoder = WTFMove(message)]() mutable { … … 1020 1026 { 1021 1027 auto locker = holdLock(m_threadMessageReceiversLock); 1022 protectedThreadMessageReceiver = m_threadMessageReceivers.get(message->messageReceiverName()); 1028 auto key = std::make_pair(static_cast<uint8_t>(message->messageReceiverName()), message->destinationID()); 1029 protectedThreadMessageReceiver = m_threadMessageReceivers.get(key); 1023 1030 } 1024 1031 -
trunk/Source/WebKit/Platform/IPC/Connection.h
r264740 r268423 118 118 }; 119 119 120 class ThreadMessageReceiver : public MessageReceiver , public ThreadSafeRefCounted<ThreadMessageReceiver>{120 class ThreadMessageReceiver : public MessageReceiver { 121 121 public: 122 virtual void dispatchToThread(WTF::Function<void()>&&) { }; 122 virtual void dispatchToThread(WTF::Function<void()>&&) = 0; 123 124 void ref() { refMessageReceiver(); } 125 void deref() { derefMessageReceiver(); } 126 127 protected: 128 virtual void refMessageReceiver() = 0; 129 virtual void derefMessageReceiver() = 0; 130 }; 131 132 class ThreadMessageReceiverRefCounted : public ThreadMessageReceiver, public ThreadSafeRefCounted<ThreadMessageReceiverRefCounted> { 133 public: 134 using ThreadSafeRefCounted::ref; 135 using ThreadSafeRefCounted::deref; 136 137 private: 138 void refMessageReceiver() final { ThreadSafeRefCounted::ref(); } 139 void derefMessageReceiver() final { ThreadSafeRefCounted::deref(); } 123 140 }; 124 141 … … 191 208 void setDidCloseOnConnectionWorkQueueCallback(DidCloseOnConnectionWorkQueueCallback); 192 209 193 void addWorkQueueMessageReceiver(ReceiverName, WorkQueue&, WorkQueueMessageReceiver* );194 void removeWorkQueueMessageReceiver(ReceiverName );195 196 void addThreadMessageReceiver(ReceiverName, ThreadMessageReceiver* );197 void removeThreadMessageReceiver(ReceiverName );210 void addWorkQueueMessageReceiver(ReceiverName, WorkQueue&, WorkQueueMessageReceiver*, uint64_t destinationID = 0); 211 void removeWorkQueueMessageReceiver(ReceiverName, uint64_t destinationID = 0); 212 213 void addThreadMessageReceiver(ReceiverName, ThreadMessageReceiver*, uint64_t destinationID = 0); 214 void removeThreadMessageReceiver(ReceiverName, uint64_t destinationID = 0); 198 215 199 216 bool open(); … … 350 367 351 368 Lock m_workQueueMessageReceiversMutex; 352 using WorkQueueMessageReceiverMap = HashMap< ReceiverName, std::pair<RefPtr<WorkQueue>, RefPtr<WorkQueueMessageReceiver>>, WTF::IntHash<ReceiverName>, WTF::StrongEnumHashTraits<ReceiverName>>;369 using WorkQueueMessageReceiverMap = HashMap<std::pair<uint8_t, uint64_t>, std::pair<RefPtr<WorkQueue>, RefPtr<WorkQueueMessageReceiver>>>; 353 370 WorkQueueMessageReceiverMap m_workQueueMessageReceivers; 354 371 355 372 Lock m_threadMessageReceiversLock; 356 using ThreadMessageReceiverMap = HashMap< ReceiverName, RefPtr<ThreadMessageReceiver>, WTF::IntHash<ReceiverName>, WTF::StrongEnumHashTraits<ReceiverName>>;373 using ThreadMessageReceiverMap = HashMap<std::pair<uint8_t, uint64_t>, RefPtr<ThreadMessageReceiver>>; 357 374 ThreadMessageReceiverMap m_threadMessageReceivers; 358 375 -
trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioDestinationProxy.cpp
r267859 r268423 61 61 Messages::RemoteAudioDestinationManager::CreateAudioDestination(inputDeviceId, numberOfInputChannels, numberOfOutputChannels, sampleRate), 62 62 Messages::RemoteAudioDestinationManager::CreateAudioDestination::Reply(destinationID, framesPerBuffer), 0); 63 connection.messageReceiverMap().addMessageReceiver(Messages::RemoteAudioDestinationProxy::messageReceiverName(), destinationID.toUInt64(), *this); 63 64 auto offThreadRendering = [this, protectedThis = makeRef(*this)]() mutable { 65 while (!m_threadTaskQueue.isKilled()) { 66 if (auto task = m_threadTaskQueue.waitForMessage()) 67 task(); 68 } 69 }; 70 m_renderThread = Thread::create("RemoteAudioDestinationProxy render thread", WTFMove(offThreadRendering), ThreadType::Audio); 71 72 connection.connection().addThreadMessageReceiver(Messages::RemoteAudioDestinationProxy::messageReceiverName(), this, destinationID.toUInt64()); 64 73 65 74 m_destinationID = destinationID; … … 70 79 { 71 80 auto& connection = WebProcess::singleton().ensureGPUProcessConnection(); 72 connection. messageReceiverMap().removeMessageReceiver(Messages::RemoteAudioDestinationProxy::messageReceiverName(), m_destinationID.toUInt64());81 connection.connection().removeThreadMessageReceiver(Messages::RemoteAudioDestinationProxy::messageReceiverName(), m_destinationID.toUInt64()); 73 82 74 83 connection.connection().sendWithAsyncReply( … … 76 85 // Can't remove this from proxyMap() here because the object would have been already deleted. 77 86 }); 87 88 m_threadTaskQueue.kill(); 89 m_renderThread->waitForCompletion(); 78 90 } 79 91 … … 96 108 void RemoteAudioDestinationProxy::renderBuffer(const WebKit::RemoteAudioBusData& audioBusData, CompletionHandler<void()>&& completionHandler) 97 109 { 98 // FIXME: This does rendering on the main thread when AudioWorklet is not active, which is likely not a good idea. 99 ASSERT(isMainThread()); 110 ASSERT(!isMainThread()); 100 111 ASSERT(audioBusData.framesToProcess); 101 112 ASSERT(audioBusData.channelBuffers.size()); … … 104 115 audioBus->setChannelMemory(i, (float*)audioBusData.channelBuffers[i]->data(), audioBusData.framesToProcess); 105 116 106 auto doRender = [this, protectedThis = makeRef(*this), audioBus = WTFMove(audioBus), framesToProcess = audioBusData.framesToProcess, outputPosition = audioBusData.outputPosition] { 107 m_callback.render(0, audioBus.get(), framesToProcess, outputPosition); 108 }; 109 if (m_dispatchToRenderThread) { 110 m_dispatchToRenderThread([doRender = WTFMove(doRender), completionHandler = WTFMove(completionHandler)]() mutable { 111 doRender(); 112 callOnMainThread(WTFMove(completionHandler)); 113 }); 114 } else { 115 doRender(); 116 completionHandler(); 117 } 117 m_callback.render(0, audioBus.get(), audioBusData.framesToProcess, audioBusData.outputPosition); 118 completionHandler(); 118 119 } 119 120 120 121 void RemoteAudioDestinationProxy::didChangeIsPlaying(bool isPlaying) 121 122 { 123 ASSERT(!isMainThread()); 124 } 125 126 // IPC::Connection::ThreadMessageReceiver 127 void RemoteAudioDestinationProxy::dispatchToThread(Function<void()>&& task) 128 { 129 if (m_dispatchToRenderThread) { 130 m_dispatchToRenderThread(WTFMove(task)); 131 return; 132 } 133 m_threadTaskQueue.append(WTFMove(task)); 122 134 } 123 135 -
trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioDestinationProxy.h
r267859 r268423 34 34 #include <WebCore/AudioDestination.h> 35 35 #include <WebCore/AudioIOCallback.h> 36 #include <wtf/CrossThreadQueue.h> 37 #include <wtf/Threading.h> 36 38 37 39 #if PLATFORM(COCOA) … … 41 43 namespace WebKit { 42 44 43 class RemoteAudioDestinationProxy : public WebCore::AudioDestination, private IPC::MessageReceiver { 44 WTF_MAKE_FAST_ALLOCATED; 45 class RemoteAudioDestinationProxy : public WebCore::AudioDestination, public IPC::Connection::ThreadMessageReceiver { 45 46 WTF_MAKE_NONCOPYABLE(RemoteAudioDestinationProxy); 46 47 public: 47 48 using AudioBus = WebCore::AudioBus; 48 49 using AudioIOCallback = WebCore::AudioIOCallback; 50 using WebCore::AudioDestination::ref; 51 using WebCore::AudioDestination::deref; 49 52 50 53 static Ref<AudioDestination> create(AudioIOCallback&, const String& inputDeviceId, unsigned numberOfInputChannels, unsigned numberOfOutputChannels, float sampleRate); … … 69 72 void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final; 70 73 74 // IPC::Connection::ThreadMessageReceiver 75 void dispatchToThread(Function<void()>&&) final; 76 void refMessageReceiver() final { WebCore::AudioDestination::ref(); } 77 void derefMessageReceiver() final { WebCore::AudioDestination::deref(); } 78 71 79 AudioIOCallback& m_callback; 72 80 float m_sampleRate { 0. }; … … 75 83 bool m_isPlaying { false }; 76 84 Function<void(Function<void()>&&)> m_dispatchToRenderThread; 85 RefPtr<Thread> m_renderThread; 86 CrossThreadQueue<Function<void()>> m_threadTaskQueue; 77 87 }; 78 88 -
trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetwork.h
r264665 r268423 36 36 namespace WebKit { 37 37 38 class LibWebRTCNetwork : public IPC::Connection::ThreadMessageReceiver {38 class LibWebRTCNetwork : public IPC::Connection::ThreadMessageReceiverRefCounted { 39 39 WTF_MAKE_FAST_ALLOCATED; 40 40 public: -
trunk/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.h
r265725 r268423 40 40 namespace WebKit { 41 41 42 class RemoteCaptureSampleManager : public IPC::Connection::ThreadMessageReceiver {42 class RemoteCaptureSampleManager : public IPC::Connection::ThreadMessageReceiverRefCounted { 43 43 WTF_MAKE_FAST_ALLOCATED; 44 44 public:
Note: See TracChangeset
for help on using the changeset viewer.