Changeset 247094 in webkit
- Timestamp:
- Jul 3, 2019 10:48:41 AM (5 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r247092 r247094 1 2019-07-03 Chris Dumez <cdumez@apple.com> 2 3 Crash under WTF::RefCounted<WebKit::TaskCounter>::deref() 4 https://bugs.webkit.org/show_bug.cgi?id=199453 5 <rdar://problem/51991477> 6 7 Reviewed by Youenn Fablet. 8 9 The crash was caused by StorageManager::suspend() getting called on the main thread but calling 10 its completion handler on a background queue. The completion handler was capturing a TaskCounter 11 object which is RefCounted (not ThreadSafeRefCounted). 12 13 Address the issue by making sure StorageManager::suspend() calls its completion handler on the 14 main thread. Also get rid of TaskCounter and use a WTF::CallbackAggregator instead. 15 16 * NetworkProcess/NetworkProcess.cpp: 17 (WebKit::NetworkProcess::actualPrepareToSuspend): 18 (WebKit::TaskCounter::TaskCounter): Deleted. 19 (WebKit::TaskCounter::~TaskCounter): Deleted. 20 * NetworkProcess/WebStorage/StorageManager.cpp: 21 (WebKit::StorageManager::suspend): 22 1 23 2019-07-03 Youenn Fablet <youenn@apple.com> 2 24 -
trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp
r247072 r247094 2030 2030 } 2031 2031 2032 // FIXME: We can remove this one by adapting RefCounter.2033 class TaskCounter : public RefCounted<TaskCounter> {2034 public:2035 explicit TaskCounter(Function<void()>&& callback) : m_callback(WTFMove(callback)) { }2036 ~TaskCounter() { m_callback(); };2037 2038 private:2039 Function<void()> m_callback;2040 };2041 2042 2032 void NetworkProcess::actualPrepareToSuspend(ShouldAcknowledgeWhenReadyToSuspend shouldAcknowledgeWhenReadyToSuspend) 2043 2033 { … … 2048 2038 lowMemoryHandler(Critical::Yes); 2049 2039 2050 RefPtr< TaskCounter> delayedTaskCounter;2040 RefPtr<CallbackAggregator> callbackAggregator; 2051 2041 if (shouldAcknowledgeWhenReadyToSuspend == ShouldAcknowledgeWhenReadyToSuspend::Yes) { 2052 delayedTaskCounter = adoptRef(new TaskCounter([this] {2042 callbackAggregator = CallbackAggregator::create([this] { 2053 2043 RELEASE_LOG(ProcessSuspension, "%p - NetworkProcess::notifyProcessReadyToSuspend() Sending ProcessReadyToSuspend IPC message", this); 2054 2044 if (parentProcessConnection()) 2055 2045 parentProcessConnection()->send(Messages::NetworkProcessProxy::ProcessReadyToSuspend(), 0); 2056 }) );2057 } 2058 2059 platformPrepareToSuspend([ delayedTaskCounter] { });2060 platformSyncAllCookies([ delayedTaskCounter] { });2046 }); 2047 } 2048 2049 platformPrepareToSuspend([callbackAggregator] { }); 2050 platformSyncAllCookies([callbackAggregator] { }); 2061 2051 2062 2052 for (auto& connection : m_webProcessConnections) 2063 connection->cleanupForSuspension([ delayedTaskCounter] { });2053 connection->cleanupForSuspension([callbackAggregator] { }); 2064 2054 2065 2055 #if ENABLE(SERVICE_WORKER) 2066 2056 for (auto& server : m_swServers.values()) { 2067 2057 ASSERT(m_swServers.get(server->sessionID()) == server.get()); 2068 server->startSuspension([ delayedTaskCounter] { });2058 server->startSuspension([callbackAggregator] { }); 2069 2059 } 2070 2060 #endif 2071 2061 2072 2062 for (auto& session : m_networkSessions) 2073 session.value->storageManager().suspend([ delayedTaskCounter] { });2063 session.value->storageManager().suspend([callbackAggregator] { }); 2074 2064 } 2075 2065 -
trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.cpp
r247092 r247094 937 937 ASSERT(m_state != State::Suspended); 938 938 939 completionHandler(); 940 941 if (m_state != State::WillSuspend) 939 if (m_state != State::WillSuspend) { 940 RunLoop::main().dispatch(WTFMove(completionHandler)); 942 941 return; 942 } 943 943 944 m_state = State::Suspended; 945 RunLoop::main().dispatch(WTFMove(completionHandler)); 946 944 947 while (m_state == State::Suspended) 945 948 m_stateChangeCondition.wait(m_stateLock);
Note: See TracChangeset
for help on using the changeset viewer.