Changeset 252897 in webkit


Ignore:
Timestamp:
Nov 27, 2019 12:55:48 AM (4 years ago)
Author:
youenn@apple.com
Message:

Protect ServiceWorkerThreadProxy while being stopped
https://bugs.webkit.org/show_bug.cgi?id=204610
<rdar://problem/57476332>

Reviewed by Chris Dumez.

Reuse stop implementation in terminateWorker for stopAllServiceWorkers.
Move the worker map value from RefPtr to Ref.
Covered by existing tests no longer crashing.

  • workers/service/context/SWContextManager.cpp:

(WebCore::SWContextManager::terminateWorker):
(WebCore::SWContextManager::stopWorker):
(WebCore::SWContextManager::forEachServiceWorkerThread):
(WebCore::SWContextManager::stopAllServiceWorkers):

  • workers/service/context/SWContextManager.h:
Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r252894 r252897  
     12019-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
    1202019-11-26  Chris Dumez  <cdumez@apple.com>
    221
  • trunk/Source/WebCore/workers/service/context/SWContextManager.cpp

    r251067 r252897  
    126126        return;
    127127    }
     128    stopWorker(*serviceWorker, timeout, WTFMove(completionHandler));
     129}
    128130
    129     serviceWorker->setAsTerminatingOrTerminated();
     131void SWContextManager::stopWorker(ServiceWorkerThreadProxy& serviceWorker, Seconds timeout, Function<void()>&& completionHandler)
     132{
     133    auto identifier = serviceWorker.identifier();
     134    serviceWorker.setAsTerminatingOrTerminated();
    130135
    131136    m_pendingServiceWorkerTerminationRequests.add(identifier, makeUnique<ServiceWorkerTerminationRequest>(*this, identifier, timeout));
    132137
    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 {
    135140        m_pendingServiceWorkerTerminationRequests.remove(identifier);
    136141
     
    150155{
    151156    for (auto& workerThread : m_workerMap.values())
    152         apply(*workerThread);
     157        apply(workerThread);
    153158}
    154159
     
    181186{
    182187    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, [] { });
    188190}
    189191
  • trunk/Source/WebCore/workers/service/context/SWContextManager.h

    r251067 r252897  
    107107    NO_RETURN_DUE_TO_CRASH void serviceWorkerFailedToTerminate(ServiceWorkerIdentifier);
    108108
    109     HashMap<ServiceWorkerIdentifier, RefPtr<ServiceWorkerThreadProxy>> m_workerMap;
     109    void stopWorker(ServiceWorkerThreadProxy&, Seconds, Function<void()>&&);
     110
     111    HashMap<ServiceWorkerIdentifier, Ref<ServiceWorkerThreadProxy>> m_workerMap;
    110112    std::unique_ptr<Connection> m_connection;
    111113    ServiceWorkerCreationCallback* m_serviceWorkerCreationCallback { nullptr };
Note: See TracChangeset for help on using the changeset viewer.