Changeset 252897 in webkit
- Timestamp:
- Nov 27, 2019 12:55:48 AM (4 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r252894 r252897 1 2019-11-27 youenn fablet <youenn@apple.com> 2 3 Protect ServiceWorkerThreadProxy while being stopped 4 https://bugs.webkit.org/show_bug.cgi?id=204610 5 <rdar://problem/57476332> 6 7 Reviewed by Chris Dumez. 8 9 Reuse stop implementation in terminateWorker for stopAllServiceWorkers. 10 Move the worker map value from RefPtr to Ref. 11 Covered by existing tests no longer crashing. 12 13 * workers/service/context/SWContextManager.cpp: 14 (WebCore::SWContextManager::terminateWorker): 15 (WebCore::SWContextManager::stopWorker): 16 (WebCore::SWContextManager::forEachServiceWorkerThread): 17 (WebCore::SWContextManager::stopAllServiceWorkers): 18 * workers/service/context/SWContextManager.h: 19 1 20 2019-11-26 Chris Dumez <cdumez@apple.com> 2 21 -
trunk/Source/WebCore/workers/service/context/SWContextManager.cpp
r251067 r252897 126 126 return; 127 127 } 128 stopWorker(*serviceWorker, timeout, WTFMove(completionHandler)); 129 } 128 130 129 serviceWorker->setAsTerminatingOrTerminated(); 131 void SWContextManager::stopWorker(ServiceWorkerThreadProxy& serviceWorker, Seconds timeout, Function<void()>&& completionHandler) 132 { 133 auto identifier = serviceWorker.identifier(); 134 serviceWorker.setAsTerminatingOrTerminated(); 130 135 131 136 m_pendingServiceWorkerTerminationRequests.add(identifier, makeUnique<ServiceWorkerTerminationRequest>(*this, identifier, timeout)); 132 137 133 auto& thread = serviceWorker ->thread();134 thread.stop([this, identifier, serviceWorker = WTFMove(serviceWorker), completionHandler = WTFMove(completionHandler)]() mutable {138 auto& thread = serviceWorker.thread(); 139 thread.stop([this, identifier, serviceWorker = makeRef(serviceWorker), completionHandler = WTFMove(completionHandler)]() mutable { 135 140 m_pendingServiceWorkerTerminationRequests.remove(identifier); 136 141 … … 150 155 { 151 156 for (auto& workerThread : m_workerMap.values()) 152 apply( *workerThread);157 apply(workerThread); 153 158 } 154 159 … … 181 186 { 182 187 auto serviceWorkers = WTFMove(m_workerMap); 183 for (auto& serviceWorker : serviceWorkers.values()) { 184 serviceWorker->setAsTerminatingOrTerminated(); 185 m_pendingServiceWorkerTerminationRequests.add(serviceWorker->identifier(), makeUnique<ServiceWorkerTerminationRequest>(*this, serviceWorker->identifier(), workerTerminationTimeout)); 186 serviceWorker->thread().stop([] { }); 187 } 188 for (auto& serviceWorker : serviceWorkers.values()) 189 stopWorker(serviceWorker, workerTerminationTimeout, [] { }); 188 190 } 189 191 -
trunk/Source/WebCore/workers/service/context/SWContextManager.h
r251067 r252897 107 107 NO_RETURN_DUE_TO_CRASH void serviceWorkerFailedToTerminate(ServiceWorkerIdentifier); 108 108 109 HashMap<ServiceWorkerIdentifier, RefPtr<ServiceWorkerThreadProxy>> m_workerMap; 109 void stopWorker(ServiceWorkerThreadProxy&, Seconds, Function<void()>&&); 110 111 HashMap<ServiceWorkerIdentifier, Ref<ServiceWorkerThreadProxy>> m_workerMap; 110 112 std::unique_ptr<Connection> m_connection; 111 113 ServiceWorkerCreationCallback* m_serviceWorkerCreationCallback { nullptr };
Note: See TracChangeset
for help on using the changeset viewer.