Changeset 284768 in webkit
- Timestamp:
- Oct 24, 2021, 1:57:44 PM (5 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 3 edited
-
ChangeLog (modified) (1 diff)
-
GPUProcess/graphics/RemoteRenderingBackend.cpp (modified) (5 diffs)
-
GPUProcess/graphics/RemoteRenderingBackend.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r284766 r284768 1 2021-10-24 Wenson Hsieh <wenson_hsieh@apple.com> 2 3 RemoteRenderingBackend should not send IPC in the middle of destruction 4 https://bugs.webkit.org/show_bug.cgi?id=232179 5 6 Reviewed by Darin Adler. 7 8 Make a couple of minor adjustments to RemoteRenderingBackend (see below for more details). This is necessary in 9 order to avoid flaky crashes after fixing bug #232113, after which the RemoteRenderingBackend will no longer be 10 leaked in the GPU process. 11 12 * GPUProcess/graphics/RemoteRenderingBackend.cpp: 13 (WebKit::RemoteRenderingBackend::startListeningForIPC): 14 (WebKit::RemoteRenderingBackend::stopListeningForIPC): 15 (WebKit::RemoteRenderingBackend::didCreateImageBufferBackend): 16 (WebKit::RemoteRenderingBackend::releaseRemoteResourceWithQualifiedIdentifier): 17 (WebKit::RemoteRenderingBackend::~RemoteRenderingBackend): Deleted. 18 19 Move logic to flush remaining incoming IPC messages in the GPU process out of the destructor, and into 20 `stopListeningForIPC()` instead. This is because the act of processing certain stream IPC messages (such as 21 CreateImageBuffer or FlushContext) may cause RemoteRenderingBackend to try and send IPC back to the web process. 22 However, if RemoteRenderingBackend is in the middle of destruction, it will crash when attempting to do so (when 23 attempting to call into IPC::MessageSender). 24 25 To avoid this, we need to do this work earlier, after we've already stopped listening for further IPC messages. 26 27 * GPUProcess/graphics/RemoteRenderingBackend.h: 28 29 Turn `m_remoteDisplayLists` into a regular hash map containing RemoteDisplayListRecorders by their process- 30 qualified rendering resource identifiers. Since this map may be modified from different threads, we (1) don't 31 want to be using weak pointers here, and (2) need to ensure that access to this table is guarded behind a lock. 32 To avoid reference cycles, entries in this table are cleared out when the remote image buffer corresponding to 33 each RemoteDisplayListRecorder is released in the GPU process. 34 1 35 2021-10-24 Wenson Hsieh <wenson_hsieh@apple.com> 2 36 -
trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp
r284695 r284768 90 90 } 91 91 92 RemoteRenderingBackend::~RemoteRenderingBackend() = default; 93 92 94 void RemoteRenderingBackend::startListeningForIPC() 93 95 { 96 { 97 Locker locker { m_remoteDisplayListsLock }; 98 m_canRegisterRemoteDisplayLists = true; 99 } 100 94 101 m_streamConnection->startReceivingMessages(*this, Messages::RemoteRenderingBackend::messageReceiverName(), m_renderingBackendIdentifier.toUInt64()); 95 102 // RemoteDisplayListRecorder messages depend on RemoteRenderingBackend, because RemoteRenderingBackend creates RemoteDisplayListRecorder and … … 99 106 } 100 107 101 RemoteRenderingBackend::~RemoteRenderingBackend() 102 { 108 void RemoteRenderingBackend::stopListeningForIPC() 109 { 110 ASSERT(RunLoop::isMain()); 111 m_streamConnection->stopReceivingMessages(Messages::RemoteRenderingBackend::messageReceiverName(), m_renderingBackendIdentifier.toUInt64()); 112 m_streamConnection->stopReceivingMessages(Messages::RemoteDisplayListRecorder::messageReceiverName()); 113 114 { 115 Locker locker { m_remoteDisplayListsLock }; 116 m_canRegisterRemoteDisplayLists = false; 117 for (auto& remoteContext : std::exchange(m_remoteDisplayLists, { })) 118 remoteContext.value->stopListeningForIPC(); 119 } 120 103 121 // Make sure we destroy the ResourceCache on the WorkQueue since it gets populated on the WorkQueue. 104 122 // Make sure rendering resource request is released after destroying the cache. … … 107 125 } 108 126 109 void RemoteRenderingBackend::stopListeningForIPC()110 {111 ASSERT(RunLoop::isMain());112 m_streamConnection->stopReceivingMessages(Messages::RemoteRenderingBackend::messageReceiverName(), m_renderingBackendIdentifier.toUInt64());113 m_streamConnection->stopReceivingMessages(Messages::RemoteDisplayListRecorder::messageReceiverName());114 for (auto& remoteContext : std::exchange(m_remoteDisplayLists, { }))115 remoteContext.stopListeningForIPC();116 }117 118 127 void RemoteRenderingBackend::dispatch(Function<void()>&& task) 119 128 { … … 133 142 void RemoteRenderingBackend::didCreateImageBufferBackend(ImageBufferBackendHandle handle, QualifiedRenderingResourceIdentifier renderingResourceIdentifier, RemoteDisplayListRecorder& remoteDisplayList) 134 143 { 135 m_remoteDisplayLists.add(remoteDisplayList); 144 { 145 Locker locker { m_remoteDisplayListsLock }; 146 if (m_canRegisterRemoteDisplayLists) 147 m_remoteDisplayLists.add(renderingResourceIdentifier, remoteDisplayList); 148 } 136 149 MESSAGE_CHECK(renderingResourceIdentifier.processIdentifier() == m_gpuConnectionToWebProcess->webProcessIdentifier(), "Sending didCreateImageBufferBackend() message to the wrong web process."); 137 150 send(Messages::RemoteRenderingBackendProxy::DidCreateImageBufferBackend(WTFMove(handle), renderingResourceIdentifier.object()), m_renderingBackendIdentifier); … … 364 377 MESSAGE_CHECK(success, "Resource is being released before being cached."); 365 378 updateRenderingResourceRequest(); 379 380 Locker locker { m_remoteDisplayListsLock }; 381 m_remoteDisplayLists.remove(renderingResourceIdentifier); 366 382 } 367 383 -
trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h
r284695 r284768 134 134 RefPtr<SharedMemory> m_getPixelBufferSharedMemory; 135 135 ScopedRenderingResourcesRequest m_renderingResourcesRequest; 136 WeakHashSet<RemoteDisplayListRecorder> m_remoteDisplayLists; 136 137 Lock m_remoteDisplayListsLock; 138 bool m_canRegisterRemoteDisplayLists WTF_GUARDED_BY_LOCK(m_remoteDisplayListsLock) { false }; 139 HashMap<QualifiedRenderingResourceIdentifier, Ref<RemoteDisplayListRecorder>> m_remoteDisplayLists WTF_GUARDED_BY_LOCK(m_remoteDisplayListsLock); 137 140 }; 138 141
Note:
See TracChangeset
for help on using the changeset viewer.