Changeset 249378 in webkit


Ignore:
Timestamp:
Sep 2, 2019 2:31:14 AM (5 years ago)
Author:
youenn@apple.com
Message:

Introduce WorkerMessagePortChannelRegistry
https://bugs.webkit.org/show_bug.cgi?id=201333

Reviewed by Alex Christensen.

Source/WebCore:

This patch introduces a dedicated registry for workers.
This registry will hop to the main thread and use the
regular main thread registry to do the actual processing.

Covered by existing tests.

  • Sources.txt:
  • WebCore.xcodeproj/project.pbxproj:
  • dom/Document.cpp:

(WebCore::Document::messagePortChannelProvider):

  • dom/Document.h:
  • dom/MessageChannel.cpp:

(WebCore::MessageChannel::MessageChannel):

  • dom/MessagePort.cpp:

(WebCore::MessagePort::entangle):
(WebCore::MessagePort::postMessage):
(WebCore::MessagePort::disentangle):
(WebCore::MessagePort::close):
(WebCore::MessagePort::dispatchMessages):
(WebCore::MessagePort::hasPendingActivity const):

  • dom/messageports/MessagePortChannel.cpp:

(WebCore::MessagePortChannel::takeAllMessagesForPort):
(WebCore::MessagePortChannel::checkRemotePortForActivity):

  • dom/messageports/MessagePortChannel.h:
  • dom/messageports/MessagePortChannelProvider.cpp:

(WebCore::MessagePortChannelProvider::singleton):
(WebCore::MessagePortChannelProvider::fromContext):

  • dom/messageports/MessagePortChannelProvider.h:
  • dom/messageports/MessagePortChannelProviderImpl.cpp:

(WebCore::MessagePortChannelProviderImpl::takeAllMessagesForPort):
(WebCore::MessagePortChannelProviderImpl::checkRemotePortForActivity):

  • dom/messageports/MessagePortChannelProviderImpl.h:
  • dom/messageports/MessagePortChannelRegistry.cpp:

(WebCore::MessagePortChannelRegistry::takeAllMessagesForPort):
(WebCore::MessagePortChannelRegistry::checkRemotePortForActivity):

  • dom/messageports/MessagePortChannelRegistry.h:
  • dom/messageports/WorkerMessagePortChannelProvider.cpp: Added.

(WebCore::WorkerMessagePortChannelProvider::WorkerMessagePortChannelProvider):
(WebCore::WorkerMessagePortChannelProvider::~WorkerMessagePortChannelProvider):
(WebCore::WorkerMessagePortChannelProvider::createNewMessagePortChannel):
(WebCore::WorkerMessagePortChannelProvider::entangleLocalPortInThisProcessToRemote):
(WebCore::WorkerMessagePortChannelProvider::messagePortDisentangled):
(WebCore::WorkerMessagePortChannelProvider::messagePortClosed):
(WebCore::WorkerMessagePortChannelProvider::postMessageToRemote):
(WebCore::WorkerMessagePortChannelProvider::takeAllMessagesForPort):
(WebCore::WorkerMessagePortChannelProvider::checkRemotePortForActivity):
(WebCore::WorkerMessagePortChannelProvider::checkProcessLocalPortForActivity):

  • dom/messageports/WorkerMessagePortChannelProvider.h: Added.
  • workers/WorkerGlobalScope.cpp:

(WebCore::WorkerGlobalScope::messagePortChannelProvider):

  • workers/WorkerGlobalScope.h:

Source/WebKit:

By introducing WorkerMessagePortChannelRegistry, we are making
sure UIMessagePortChannelProvider is only called from the main thread.
This will help when moving the registry to network process.

  • UIProcess/UIMessagePortChannelProvider.cpp:

(WebKit::UIMessagePortChannelProvider::takeAllMessagesForPort):
(WebKit::UIMessagePortChannelProvider::checkRemotePortForActivity):

  • UIProcess/UIMessagePortChannelProvider.h:
  • WebProcess/WebCoreSupport/WebMessagePortChannelProvider.cpp:

(WebKit::WebMessagePortChannelProvider::takeAllMessagesForPort):
(WebKit::WebMessagePortChannelProvider::didTakeAllMessagesForPort):
(WebKit::WebMessagePortChannelProvider::didCheckRemotePortForActivity):
(WebKit::WebMessagePortChannelProvider::checkRemotePortForActivity):

  • WebProcess/WebCoreSupport/WebMessagePortChannelProvider.h:
Location:
trunk/Source
Files:
1 added
22 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r249374 r249378  
     12019-09-02  Youenn Fablet  <youenn@apple.com>
     2
     3        Introduce WorkerMessagePortChannelRegistry
     4        https://bugs.webkit.org/show_bug.cgi?id=201333
     5
     6        Reviewed by Alex Christensen.
     7
     8        This patch introduces a dedicated registry for workers.
     9        This registry will hop to the main thread and use the
     10        regular main thread registry to do the actual processing.
     11
     12        Covered by existing tests.
     13
     14        * Sources.txt:
     15        * WebCore.xcodeproj/project.pbxproj:
     16        * dom/Document.cpp:
     17        (WebCore::Document::messagePortChannelProvider):
     18        * dom/Document.h:
     19        * dom/MessageChannel.cpp:
     20        (WebCore::MessageChannel::MessageChannel):
     21        * dom/MessagePort.cpp:
     22        (WebCore::MessagePort::entangle):
     23        (WebCore::MessagePort::postMessage):
     24        (WebCore::MessagePort::disentangle):
     25        (WebCore::MessagePort::close):
     26        (WebCore::MessagePort::dispatchMessages):
     27        (WebCore::MessagePort::hasPendingActivity const):
     28        * dom/messageports/MessagePortChannel.cpp:
     29        (WebCore::MessagePortChannel::takeAllMessagesForPort):
     30        (WebCore::MessagePortChannel::checkRemotePortForActivity):
     31        * dom/messageports/MessagePortChannel.h:
     32        * dom/messageports/MessagePortChannelProvider.cpp:
     33        (WebCore::MessagePortChannelProvider::singleton):
     34        (WebCore::MessagePortChannelProvider::fromContext):
     35        * dom/messageports/MessagePortChannelProvider.h:
     36        * dom/messageports/MessagePortChannelProviderImpl.cpp:
     37        (WebCore::MessagePortChannelProviderImpl::takeAllMessagesForPort):
     38        (WebCore::MessagePortChannelProviderImpl::checkRemotePortForActivity):
     39        * dom/messageports/MessagePortChannelProviderImpl.h:
     40        * dom/messageports/MessagePortChannelRegistry.cpp:
     41        (WebCore::MessagePortChannelRegistry::takeAllMessagesForPort):
     42        (WebCore::MessagePortChannelRegistry::checkRemotePortForActivity):
     43        * dom/messageports/MessagePortChannelRegistry.h:
     44        * dom/messageports/WorkerMessagePortChannelProvider.cpp: Added.
     45        (WebCore::WorkerMessagePortChannelProvider::WorkerMessagePortChannelProvider):
     46        (WebCore::WorkerMessagePortChannelProvider::~WorkerMessagePortChannelProvider):
     47        (WebCore::WorkerMessagePortChannelProvider::createNewMessagePortChannel):
     48        (WebCore::WorkerMessagePortChannelProvider::entangleLocalPortInThisProcessToRemote):
     49        (WebCore::WorkerMessagePortChannelProvider::messagePortDisentangled):
     50        (WebCore::WorkerMessagePortChannelProvider::messagePortClosed):
     51        (WebCore::WorkerMessagePortChannelProvider::postMessageToRemote):
     52        (WebCore::WorkerMessagePortChannelProvider::takeAllMessagesForPort):
     53        (WebCore::WorkerMessagePortChannelProvider::checkRemotePortForActivity):
     54        (WebCore::WorkerMessagePortChannelProvider::checkProcessLocalPortForActivity):
     55        * dom/messageports/WorkerMessagePortChannelProvider.h: Added.
     56        * workers/WorkerGlobalScope.cpp:
     57        (WebCore::WorkerGlobalScope::messagePortChannelProvider):
     58        * workers/WorkerGlobalScope.h:
     59
    1602019-09-01  Myles C. Maxfield  <mmaxfield@apple.com>
    261
  • trunk/Source/WebCore/Sources.txt

    r249351 r249378  
    973973dom/messageports/MessagePortChannelRegistry.cpp
    974974dom/messageports/MessageWithMessagePorts.cpp
     975dom/messageports/WorkerMessagePortChannelProvider.cpp
    975976
    976977domjit/DOMJITHelpers.cpp
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r249351 r249378  
    71677167                41103AAA1E39790A00769F03 /* RealtimeIncomingAudioSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RealtimeIncomingAudioSource.cpp; sourceTree = "<group>"; };
    71687168                41103AAA1E39790A00769F14 /* RealtimeIncomingAudioSourceCocoa.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RealtimeIncomingAudioSourceCocoa.cpp; sourceTree = "<group>"; };
     7169                41114A7A2317B39E00B56007 /* WorkerMessagePortChannelProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WorkerMessagePortChannelProvider.h; sourceTree = "<group>"; };
     7170                41114A7C2317B39E00B56007 /* WorkerMessagePortChannelProvider.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WorkerMessagePortChannelProvider.cpp; sourceTree = "<group>"; };
    71697171                4112B53F1F9F9C9B00E67875 /* ServiceWorkerThreadProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ServiceWorkerThreadProxy.h; sourceTree = "<group>"; };
    71707172                4112B5411F9F9C9C00E67875 /* ServiceWorkerThreadProxy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ServiceWorkerThreadProxy.cpp; sourceTree = "<group>"; };
     
    1884318845                                51A748E12005D0E00075BA68 /* MessageWithMessagePorts.cpp */,
    1884418846                                51A748E02005D0E00075BA68 /* MessageWithMessagePorts.h */,
     18847                                41114A7C2317B39E00B56007 /* WorkerMessagePortChannelProvider.cpp */,
     18848                                41114A7A2317B39E00B56007 /* WorkerMessagePortChannelProvider.h */,
    1884518849                        );
    1884618850                        path = messageports;
  • trunk/Source/WebCore/dom/Document.cpp

    r249353 r249378  
    82838283#endif
    82848284
     8285MessagePortChannelProvider& Document::messagePortChannelProvider()
     8286{
     8287    return MessagePortChannelProvider::singleton();
     8288}
     8289
    82858290} // namespace WebCore
  • trunk/Source/WebCore/dom/Document.h

    r248846 r249378  
    158158class MediaQueryList;
    159159class MediaQueryMatcher;
     160class MessagePortChannelProvider;
    160161class MouseEventWithHitTestResults;
    161162class NodeFilter;
     
    15301531#endif
    15311532
     1533    MessagePortChannelProvider& messagePortChannelProvider();
     1534
    15321535protected:
    15331536    enum ConstructionFlags { Synthesized = 1, NonRenderedPlaceholder = 1 << 1 };
  • trunk/Source/WebCore/dom/MessageChannel.cpp

    r243887 r249378  
    5050        ASSERT(!m_port1->closed());
    5151        ASSERT(!m_port2->closed());
    52         MessagePortChannelProvider::singleton().createNewMessagePortChannel(id1, id2);
     52        MessagePortChannelProvider::fromContext(context).createNewMessagePortChannel(id1, id2);
    5353    } else {
    5454        ASSERT(m_port1->closed());
  • trunk/Source/WebCore/dom/MessagePort.cpp

    r248148 r249378  
    3838#include <wtf/CompletionHandler.h>
    3939#include <wtf/IsoMallocInlines.h>
     40#include <wtf/Scope.h>
    4041
    4142namespace WebCore {
     
    125126void MessagePort::entangle()
    126127{
    127     MessagePortChannelProvider::singleton().entangleLocalPortInThisProcessToRemote(m_identifier, m_remoteIdentifier);
     128    MessagePortChannelProvider::fromContext(*m_scriptExecutionContext).entangleLocalPortInThisProcessToRemote(m_identifier, m_remoteIdentifier);
    128129}
    129130
     
    161162    LOG(MessagePorts, "Actually posting message to port %s (to be received by port %s)", m_identifier.logString().utf8().data(), m_remoteIdentifier.logString().utf8().data());
    162163
    163     MessagePortChannelProvider::singleton().postMessageToRemote(WTFMove(message), m_remoteIdentifier);
     164    MessagePortChannelProvider::fromContext(*m_scriptExecutionContext).postMessageToRemote(message, m_remoteIdentifier);
    164165    return { };
    165166}
     
    172173    registerLocalActivity();
    173174
    174     MessagePortChannelProvider::singleton().messagePortDisentangled(m_identifier);
     175    MessagePortChannelProvider::fromContext(*m_scriptExecutionContext).messagePortDisentangled(m_identifier);
    175176
    176177    // We can't receive any messages or generate any events after this, so remove ourselves from the list of active ports.
    177     ASSERT(m_scriptExecutionContext);
    178178    m_scriptExecutionContext->destroyedMessagePort(*this);
    179179    m_scriptExecutionContext->willDestroyActiveDOMObject(*this);
     
    226226    m_closed = true;
    227227
    228     MessagePortChannelProvider::singleton().messagePortClosed(m_identifier);
     228    MessagePortChannelProvider::fromContext(*m_scriptExecutionContext).messagePortClosed(m_identifier);
    229229    removeAllEventListeners();
    230230}
     
    247247        return;
    248248
    249     RefPtr<WorkerThread> workerThread;
    250     if (is<WorkerGlobalScope>(*m_scriptExecutionContext))
    251         workerThread = &downcast<WorkerGlobalScope>(*m_scriptExecutionContext).thread();
    252 
    253     auto messagesTakenHandler = [this, weakThis = makeWeakPtr(this), workerThread = WTFMove(workerThread)](Vector<MessageWithMessagePorts>&& messages, Function<void()>&& completionCallback) mutable {
    254         ASSERT(isMainThread());
    255         auto innerHandler = [this, weakThis = WTFMove(weakThis)](auto&& messages) {
    256             if (!weakThis)
     249    auto messagesTakenHandler = [this, weakThis = makeWeakPtr(this)](Vector<MessageWithMessagePorts>&& messages, Function<void()>&& completionCallback) mutable {
     250        auto scopeExit = makeScopeExit(WTFMove(completionCallback));
     251
     252        if (!weakThis)
     253            return;
     254
     255        LOG(MessagePorts, "MessagePort %s (%p) dispatching %zu messages", m_identifier.logString().utf8().data(), this, messages.size());
     256
     257        if (!m_scriptExecutionContext)
     258            return;
     259
     260        if (!messages.isEmpty())
     261            registerLocalActivity();
     262
     263        ASSERT(m_scriptExecutionContext->isContextThread());
     264
     265        bool contextIsWorker = is<WorkerGlobalScope>(*m_scriptExecutionContext);
     266        for (auto& message : messages) {
     267            // close() in Worker onmessage handler should prevent next message from dispatching.
     268            if (contextIsWorker && downcast<WorkerGlobalScope>(*m_scriptExecutionContext).isClosing())
    257269                return;
    258 
    259             LOG(MessagePorts, "MessagePort %s (%p) dispatching %zu messages", m_identifier.logString().utf8().data(), this, messages.size());
    260 
    261             if (!m_scriptExecutionContext)
    262                 return;
    263 
    264             if (!messages.isEmpty())
    265                 registerLocalActivity();
    266 
    267             ASSERT(m_scriptExecutionContext->isContextThread());
    268 
    269             bool contextIsWorker = is<WorkerGlobalScope>(*m_scriptExecutionContext);
    270             for (auto& message : messages) {
    271                 // close() in Worker onmessage handler should prevent next message from dispatching.
    272                 if (contextIsWorker && downcast<WorkerGlobalScope>(*m_scriptExecutionContext).isClosing())
    273                     return;
    274                 auto ports = MessagePort::entanglePorts(*m_scriptExecutionContext, WTFMove(message.transferredPorts));
    275                 dispatchEvent(MessageEvent::create(WTFMove(ports), message.message.releaseNonNull()));
    276             }
    277         };
    278 
    279         if (!workerThread) {
    280             innerHandler(WTFMove(messages));
    281             completionCallback();
    282             return;
     270            auto ports = MessagePort::entanglePorts(*m_scriptExecutionContext, WTFMove(message.transferredPorts));
     271            dispatchEvent(MessageEvent::create(WTFMove(ports), message.message.releaseNonNull()));
    283272        }
    284         workerThread->runLoop().postTaskForMode([innerHandler = WTFMove(innerHandler), messages = WTFMove(messages), completionCallback = WTFMove(completionCallback)](auto&) mutable {
    285             innerHandler(WTFMove(messages));
    286             callOnMainThread([completionCallback = WTFMove(completionCallback)] {
    287                 completionCallback();
    288             });
    289         }, WorkerRunLoop::defaultMode());
    290273    };
    291274
    292     MessagePortChannelProvider::singleton().takeAllMessagesForPort(m_identifier, WTFMove(messagesTakenHandler));
     275    MessagePortChannelProvider::fromContext(*m_scriptExecutionContext).takeAllMessagesForPort(m_identifier, WTFMove(messagesTakenHandler));
    293276}
    294277
     
    329312            workerThread = &downcast<WorkerGlobalScope>(*m_scriptExecutionContext).thread();
    330313
    331         MessagePortChannelProvider::singleton().checkRemotePortForActivity(m_remoteIdentifier, [weakThis = makeWeakPtr(const_cast<MessagePort*>(this)), workerThread = WTFMove(workerThread)](MessagePortChannelProvider::HasActivity hasActivity) mutable {
    332 
    333             ASSERT(isMainThread());
    334             if (!workerThread) {
    335                 if (weakThis)
    336                     weakThis->updateActivity(hasActivity);
    337                 return;
    338             }
    339 
    340             workerThread->runLoop().postTaskForMode([weakThis = WTFMove(weakThis), hasActivity](auto&) mutable {
    341                 if (weakThis)
    342                     weakThis->updateActivity(hasActivity);
    343             }, WorkerRunLoop::defaultMode());
     314        callOnMainThread([remoteIdentifier = m_remoteIdentifier, weakThis = makeWeakPtr(const_cast<MessagePort*>(this)), workerThread = WTFMove(workerThread)]() mutable {
     315            MessagePortChannelProvider::singleton().checkRemotePortForActivity(remoteIdentifier, [weakThis = WTFMove(weakThis), workerThread = WTFMove(workerThread)](auto hasActivity) mutable {
     316                if (!workerThread) {
     317                    if (weakThis)
     318                        weakThis->updateActivity(hasActivity);
     319                    return;
     320                }
     321
     322                workerThread->runLoop().postTaskForMode([weakThis = WTFMove(weakThis), hasActivity](auto&) mutable {
     323                    if (weakThis)
     324                        weakThis->updateActivity(hasActivity);
     325                }, WorkerRunLoop::defaultMode());
     326            });
    344327        });
    345328        m_isAskingRemoteAboutGC = true;
  • trunk/Source/WebCore/dom/messageports/MessagePortChannel.cpp

    r247218 r249378  
    148148}
    149149
    150 void MessagePortChannel::takeAllMessagesForPort(const MessagePortIdentifier& port, Function<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&& callback)
     150void MessagePortChannel::takeAllMessagesForPort(const MessagePortIdentifier& port, CompletionHandler<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&& callback)
    151151{
    152152    ASSERT(isMainThread());
     
    183183}
    184184
    185 void MessagePortChannel::checkRemotePortForActivity(const MessagePortIdentifier& remotePort, Function<void(MessagePortChannelProvider::HasActivity)>&& callback)
     185void MessagePortChannel::checkRemotePortForActivity(const MessagePortIdentifier& remotePort, CompletionHandler<void(MessagePortChannelProvider::HasActivity)>&& callback)
    186186{
    187187    ASSERT(isMainThread());
     
    208208    }
    209209
    210     auto outerCallback = Function<void(MessagePortChannelProvider::HasActivity)> { [this, protectedThis = makeRef(*this), callback = WTFMove(callback)] (MessagePortChannelProvider::HasActivity hasActivity) mutable {
     210    CompletionHandler<void(MessagePortChannelProvider::HasActivity)> outerCallback = [this, protectedThis = makeRef(*this), callback = WTFMove(callback)](auto hasActivity) mutable {
    211211        if (hasActivity == MessagePortChannelProvider::HasActivity::Yes) {
    212212            callback(hasActivity);
     
    220220
    221221        callback(hasActivity);
    222     } };
     222    };
    223223
    224224    m_registry.provider().checkProcessLocalPortForActivity(remotePort, *m_processes[i], WTFMove(outerCallback));
  • trunk/Source/WebCore/dom/messageports/MessagePortChannel.h

    r247218 r249378  
    5454    bool postMessageToRemote(MessageWithMessagePorts&&, const MessagePortIdentifier& remoteTarget);
    5555
    56     void takeAllMessagesForPort(const MessagePortIdentifier&, Function<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&&);
    57     void checkRemotePortForActivity(const MessagePortIdentifier&, Function<void(MessagePortChannelProvider::HasActivity)>&& callback);
     56    void takeAllMessagesForPort(const MessagePortIdentifier&, CompletionHandler<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&&);
     57    void checkRemotePortForActivity(const MessagePortIdentifier&, CompletionHandler<void(MessagePortChannelProvider::HasActivity)>&& callback);
    5858
    5959    WEBCORE_EXPORT bool hasAnyMessagesPendingOrInFlight() const;
  • trunk/Source/WebCore/dom/messageports/MessagePortChannelProvider.cpp

    r227190 r249378  
    2727#include "MessagePortChannelProvider.h"
    2828
     29#include "Document.h"
    2930#include "MessagePortChannelProviderImpl.h"
     31#include "WorkerGlobalScope.h"
    3032#include <wtf/MainThread.h>
    3133
     
    3638MessagePortChannelProvider& MessagePortChannelProvider::singleton()
    3739{
     40    ASSERT(isMainThread());
    3841    static std::once_flag onceFlag;
    3942    std::call_once(onceFlag, [] {
     
    5255}
    5356
     57MessagePortChannelProvider& MessagePortChannelProvider::fromContext(ScriptExecutionContext& context)
     58{
     59    if (is<Document>(context))
     60        return downcast<Document>(context).messagePortChannelProvider();
     61
     62    return downcast<WorkerGlobalScope>(context).messagePortChannelProvider();
     63}
     64
    5465} // namespace WebCore
  • trunk/Source/WebCore/dom/messageports/MessagePortChannelProvider.h

    r247218 r249378  
    2727
    2828#include "ProcessIdentifier.h"
    29 #include <wtf/Function.h>
     29#include <wtf/CompletionHandler.h>
    3030#include <wtf/Vector.h>
    3131
    3232namespace WebCore {
    3333
     34class ScriptExecutionContext;
    3435struct MessagePortIdentifier;
    3536struct MessageWithMessagePorts;
     
    3738class MessagePortChannelProvider {
    3839public:
     40    static MessagePortChannelProvider& fromContext(ScriptExecutionContext&);
    3941    static MessagePortChannelProvider& singleton();
    4042    WEBCORE_EXPORT static void setSharedProvider(MessagePortChannelProvider&);
     
    4850    virtual void messagePortClosed(const MessagePortIdentifier& local) = 0;
    4951   
    50     // FIXME: Ideally the callback would be a CompletionHandler but it is always called on the caller's
    51     // thread at the moment.
    52     virtual void takeAllMessagesForPort(const MessagePortIdentifier&, Function<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&&) = 0;
     52    virtual void takeAllMessagesForPort(const MessagePortIdentifier&, CompletionHandler<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&&) = 0;
    5353
    54     virtual void postMessageToRemote(MessageWithMessagePorts&&, const MessagePortIdentifier& remoteTarget) = 0;
     54    virtual void postMessageToRemote(const MessageWithMessagePorts&, const MessagePortIdentifier& remoteTarget) = 0;
    5555
    5656    enum class HasActivity {
     
    5858        No,
    5959    };
    60     // FIXME: Ideally the callback would be a CompletionHandler but it is always called on the caller's
    61     // thread at the moment.
    62     virtual void checkRemotePortForActivity(const MessagePortIdentifier& remoteTarget, Function<void(HasActivity)>&& callback) = 0;
     60    virtual void checkRemotePortForActivity(const MessagePortIdentifier& remoteTarget, CompletionHandler<void(HasActivity)>&& callback) = 0;
    6361
    6462    // Operations that the coordinating process performs (e.g. the UIProcess)
  • trunk/Source/WebCore/dom/messageports/MessagePortChannelProviderImpl.cpp

    r247218 r249378  
    2828
    2929#include "MessagePort.h"
    30 #include <wtf/CompletionHandler.h>
    3130#include <wtf/MainThread.h>
    3231#include <wtf/RunLoop.h>
     
    8079}
    8180
    82 void MessagePortChannelProviderImpl::postMessageToRemote(MessageWithMessagePorts&& message, const MessagePortIdentifier& remoteTarget)
     81void MessagePortChannelProviderImpl::postMessageToRemote(const MessageWithMessagePorts& message, const MessagePortIdentifier& remoteTarget)
    8382{
    84     performActionOnMainThread([registry = &m_registry, message = WTFMove(message), remoteTarget]() mutable {
     83    performActionOnMainThread([registry = &m_registry, message = MessageWithMessagePorts { message }, remoteTarget]() mutable {
    8584        if (registry->didPostMessageToRemote(WTFMove(message), remoteTarget))
    8685            MessagePort::notifyMessageAvailable(remoteTarget);
     
    8887}
    8988
    90 void MessagePortChannelProviderImpl::takeAllMessagesForPort(const MessagePortIdentifier& port, Function<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&& outerCallback)
     89void MessagePortChannelProviderImpl::takeAllMessagesForPort(const MessagePortIdentifier& port, CompletionHandler<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&& outerCallback)
    9190{
    9291    // It is the responsibility of outerCallback to get itself to the appropriate thread (e.g. WebWorker thread)
    93     auto callback = [outerCallback = WTFMove(outerCallback)](Vector<MessageWithMessagePorts>&& messages, Function<void()>&& messageDeliveryCallback) {
     92    auto callback = [outerCallback = WTFMove(outerCallback)](Vector<MessageWithMessagePorts>&& messages, Function<void()>&& messageDeliveryCallback) mutable {
    9493        ASSERT(isMainThread());
    9594        outerCallback(WTFMove(messages), WTFMove(messageDeliveryCallback));
     
    101100}
    102101
    103 void MessagePortChannelProviderImpl::checkRemotePortForActivity(const MessagePortIdentifier& remoteTarget, Function<void(HasActivity)>&& outerCallback)
     102void MessagePortChannelProviderImpl::checkRemotePortForActivity(const MessagePortIdentifier& remoteTarget, CompletionHandler<void(HasActivity)>&& outerCallback)
    104103{
    105104    auto callback = Function<void(HasActivity)> { [outerCallback = WTFMove(outerCallback)](HasActivity hasActivity) mutable {
     
    120119}
    121120
    122 
    123121} // namespace WebCore
  • trunk/Source/WebCore/dom/messageports/MessagePortChannelProviderImpl.h

    r247218 r249378  
    4141    void messagePortDisentangled(const MessagePortIdentifier& local) final;
    4242    void messagePortClosed(const MessagePortIdentifier& local) final;
    43     void postMessageToRemote(MessageWithMessagePorts&&, const MessagePortIdentifier& remoteTarget) final;
    44     void takeAllMessagesForPort(const MessagePortIdentifier&, Function<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&&) final;
    45     void checkRemotePortForActivity(const MessagePortIdentifier& remoteTarget, Function<void(HasActivity)>&& callback) final;
     43    void postMessageToRemote(const MessageWithMessagePorts&, const MessagePortIdentifier& remoteTarget) final;
     44    void takeAllMessagesForPort(const MessagePortIdentifier&, CompletionHandler<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&&) final;
     45    void checkRemotePortForActivity(const MessagePortIdentifier& remoteTarget, CompletionHandler<void(HasActivity)>&& callback) final;
    4646
    4747    void checkProcessLocalPortForActivity(const MessagePortIdentifier&, ProcessIdentifier, CompletionHandler<void(HasActivity)>&&) final;
  • trunk/Source/WebCore/dom/messageports/MessagePortChannelRegistry.cpp

    r247218 r249378  
    142142}
    143143
    144 void MessagePortChannelRegistry::takeAllMessagesForPort(const MessagePortIdentifier& port, Function<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&& callback)
     144void MessagePortChannelRegistry::takeAllMessagesForPort(const MessagePortIdentifier& port, CompletionHandler<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&& callback)
    145145{
    146146    ASSERT(isMainThread());
     
    158158}
    159159
    160 void MessagePortChannelRegistry::checkRemotePortForActivity(const MessagePortIdentifier& remoteTarget, Function<void(MessagePortChannelProvider::HasActivity)>&& callback)
     160void MessagePortChannelRegistry::checkRemotePortForActivity(const MessagePortIdentifier& remoteTarget, CompletionHandler<void(MessagePortChannelProvider::HasActivity)>&& callback)
    161161{
    162162    ASSERT(isMainThread());
  • trunk/Source/WebCore/dom/messageports/MessagePortChannelRegistry.h

    r247218 r249378  
    4444    WEBCORE_EXPORT void didCloseMessagePort(const MessagePortIdentifier& local);
    4545    WEBCORE_EXPORT bool didPostMessageToRemote(MessageWithMessagePorts&&, const MessagePortIdentifier& remoteTarget);
    46     WEBCORE_EXPORT void takeAllMessagesForPort(const MessagePortIdentifier&, Function<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&&);
    47     WEBCORE_EXPORT void checkRemotePortForActivity(const MessagePortIdentifier& remoteTarget, Function<void(MessagePortChannelProvider::HasActivity)>&& callback);
     46    WEBCORE_EXPORT void takeAllMessagesForPort(const MessagePortIdentifier&, CompletionHandler<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&&);
     47    WEBCORE_EXPORT void checkRemotePortForActivity(const MessagePortIdentifier& remoteTarget, CompletionHandler<void(MessagePortChannelProvider::HasActivity)>&& callback);
    4848
    4949    WEBCORE_EXPORT MessagePortChannel* existingChannelContainingPort(const MessagePortIdentifier&);
  • trunk/Source/WebCore/dom/messageports/WorkerMessagePortChannelProvider.h

    r249377 r249378  
    11/*
    2  * Copyright (C) 2018 Apple Inc. All rights reserved.
     2 * Copyright (C) 2019 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2727
    2828#include "MessagePortChannelProvider.h"
    29 #include "MessagePortChannelRegistry.h"
     29#include <wtf/CompletionHandler.h>
     30#include <wtf/HashMap.h>
     31#include <wtf/Vector.h>
    3032
    3133namespace WebCore {
    3234
    33 class MessagePortChannelProviderImpl : public MessagePortChannelProvider {
     35class WorkerGlobalScope;
     36
     37class WorkerMessagePortChannelProvider final : public MessagePortChannelProvider {
     38    WTF_MAKE_FAST_ALLOCATED;
    3439public:
    35     MessagePortChannelProviderImpl();
    36     ~MessagePortChannelProviderImpl() final;
     40    explicit WorkerMessagePortChannelProvider(WorkerGlobalScope&);
     41    ~WorkerMessagePortChannelProvider();
    3742
    3843private:
     
    4146    void messagePortDisentangled(const MessagePortIdentifier& local) final;
    4247    void messagePortClosed(const MessagePortIdentifier& local) final;
    43     void postMessageToRemote(MessageWithMessagePorts&&, const MessagePortIdentifier& remoteTarget) final;
    44     void takeAllMessagesForPort(const MessagePortIdentifier&, Function<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&&) final;
    45     void checkRemotePortForActivity(const MessagePortIdentifier& remoteTarget, Function<void(HasActivity)>&& callback) final;
     48    void postMessageToRemote(const MessageWithMessagePorts&, const MessagePortIdentifier& remoteTarget) final;
     49    void takeAllMessagesForPort(const MessagePortIdentifier&, CompletionHandler<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&&) final;
     50    void checkRemotePortForActivity(const MessagePortIdentifier& remoteTarget, CompletionHandler<void(HasActivity)>&& callback) final;
    4651
    4752    void checkProcessLocalPortForActivity(const MessagePortIdentifier&, ProcessIdentifier, CompletionHandler<void(HasActivity)>&&) final;
    4853
    49     void performActionOnMainThread(Function<void()>&&);
     54    WorkerGlobalScope& m_scope;
    5055
    51     MessagePortChannelRegistry m_registry;
     56    uint64_t m_lastCallbackIdentifier { 0 };
     57    HashMap<uint64_t, CompletionHandler<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>> m_takeAllMessagesCallbacks;
     58    HashMap<uint64_t, CompletionHandler<void(HasActivity)>> m_activityCallbacks;
    5259};
    5360
  • trunk/Source/WebCore/workers/WorkerGlobalScope.cpp

    r248957 r249378  
    464464}
    465465
     466MessagePortChannelProvider& WorkerGlobalScope::messagePortChannelProvider()
     467{
     468    if (!m_messagePortChannelProvider)
     469        m_messagePortChannelProvider = makeUnique<WorkerMessagePortChannelProvider>(*this);
     470    return *m_messagePortChannelProvider;
     471}
     472
    466473void WorkerGlobalScope::createImageBitmap(ImageBitmap::Source&& source, ImageBitmapOptions&& options, ImageBitmap::Promise&& promise)
    467474{
  • trunk/Source/WebCore/workers/WorkerGlobalScope.h

    r248503 r249378  
    3636#include "WorkerCacheStorageConnection.h"
    3737#include "WorkerEventQueue.h"
     38#include "WorkerMessagePortChannelProvider.h"
    3839#include "WorkerScriptController.h"
    3940#include <JavaScriptCore/ConsoleMessage.h>
     
    7475
    7576    WorkerCacheStorageConnection& cacheStorageConnection();
     77    MessagePortChannelProvider& messagePortChannelProvider();
    7678
    7779    WorkerScriptController* script() { return m_script.get(); }
     
    211213    PAL::SessionID m_sessionID;
    212214    RefPtr<WorkerCacheStorageConnection> m_cacheStorageConnection;
    213 
     215    std::unique_ptr<WorkerMessagePortChannelProvider> m_messagePortChannelProvider;
    214216    unsigned long m_uniqueIdentifier { 1 };
    215217};
  • trunk/Source/WebKit/ChangeLog

    r249376 r249378  
     12019-09-02  Youenn Fablet  <youenn@apple.com>
     2
     3        Introduce WorkerMessagePortChannelRegistry
     4        https://bugs.webkit.org/show_bug.cgi?id=201333
     5
     6        Reviewed by Alex Christensen.
     7
     8        By introducing WorkerMessagePortChannelRegistry, we are making
     9        sure UIMessagePortChannelProvider is only called from the main thread.
     10        This will help when moving the registry to network process.
     11
     12        * UIProcess/UIMessagePortChannelProvider.cpp:
     13        (WebKit::UIMessagePortChannelProvider::takeAllMessagesForPort):
     14        (WebKit::UIMessagePortChannelProvider::checkRemotePortForActivity):
     15        * UIProcess/UIMessagePortChannelProvider.h:
     16        * WebProcess/WebCoreSupport/WebMessagePortChannelProvider.cpp:
     17        (WebKit::WebMessagePortChannelProvider::takeAllMessagesForPort):
     18        (WebKit::WebMessagePortChannelProvider::didTakeAllMessagesForPort):
     19        (WebKit::WebMessagePortChannelProvider::didCheckRemotePortForActivity):
     20        (WebKit::WebMessagePortChannelProvider::checkRemotePortForActivity):
     21        * WebProcess/WebCoreSupport/WebMessagePortChannelProvider.h:
     22
    1232019-09-01  Youenn Fablet  <youenn@apple.com>
    224
  • trunk/Source/WebKit/UIProcess/UIMessagePortChannelProvider.cpp

    r247218 r249378  
    2929#include "WebProcessMessages.h"
    3030#include "WebProcessProxy.h"
    31 #include <wtf/CompletionHandler.h>
    3231
    3332namespace WebKit {
     
    7473}
    7574
    76 void UIMessagePortChannelProvider::takeAllMessagesForPort(const MessagePortIdentifier&, Function<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&&)
     75void UIMessagePortChannelProvider::takeAllMessagesForPort(const MessagePortIdentifier&, CompletionHandler<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&&)
    7776{
    7877    // Should never be called in the UI process provider.
     
    8079}
    8180
    82 void UIMessagePortChannelProvider::postMessageToRemote(MessageWithMessagePorts&&, const MessagePortIdentifier&)
     81void UIMessagePortChannelProvider::postMessageToRemote(const MessageWithMessagePorts&, const MessagePortIdentifier&)
    8382{
    8483    // Should never be called in the UI process provider.
     
    8685}
    8786
    88 void UIMessagePortChannelProvider::checkRemotePortForActivity(const MessagePortIdentifier&, Function<void(HasActivity)>&&)
     87void UIMessagePortChannelProvider::checkRemotePortForActivity(const MessagePortIdentifier&, CompletionHandler<void(HasActivity)>&&)
    8988{
    9089    // Should never be called in the UI process provider.
  • trunk/Source/WebKit/UIProcess/UIMessagePortChannelProvider.h

    r247218 r249378  
    4444    void messagePortDisentangled(const WebCore::MessagePortIdentifier& local) final;
    4545    void messagePortClosed(const WebCore::MessagePortIdentifier& local) final;
    46     void takeAllMessagesForPort(const WebCore::MessagePortIdentifier&, Function<void(Vector<WebCore::MessageWithMessagePorts>&&, Function<void()>&&)>&&) final;
    47     void postMessageToRemote(WebCore::MessageWithMessagePorts&&, const WebCore::MessagePortIdentifier& remoteTarget) final;
    48     void checkRemotePortForActivity(const WebCore::MessagePortIdentifier& remoteTarget, Function<void(HasActivity)>&& callback) final;
     46    void takeAllMessagesForPort(const WebCore::MessagePortIdentifier&, CompletionHandler<void(Vector<WebCore::MessageWithMessagePorts>&&, Function<void()>&&)>&&) final;
     47    void postMessageToRemote(const WebCore::MessageWithMessagePorts&, const WebCore::MessagePortIdentifier& remoteTarget) final;
     48    void checkRemotePortForActivity(const WebCore::MessagePortIdentifier& remoteTarget, CompletionHandler<void(HasActivity)>&& callback) final;
    4949    void checkProcessLocalPortForActivity(const WebCore::MessagePortIdentifier&, WebCore::ProcessIdentifier, CompletionHandler<void(HasActivity)>&&) final;
    5050
  • trunk/Source/WebKit/WebProcess/WebCoreSupport/WebMessagePortChannelProvider.cpp

    r247218 r249378  
    7171}
    7272
    73 void WebMessagePortChannelProvider::takeAllMessagesForPort(const MessagePortIdentifier& port, Function<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&& completionHandler)
     73void WebMessagePortChannelProvider::takeAllMessagesForPort(const MessagePortIdentifier& port, CompletionHandler<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&& completionHandler)
    7474{
    75     static std::atomic<uint64_t> currentHandlerIdentifier;
     75    ASSERT(isMainThread());
     76    static uint64_t currentHandlerIdentifier;
    7677    uint64_t identifier = ++currentHandlerIdentifier;
    7778
    78     {
    79         Locker<Lock> locker(m_takeAllMessagesCallbackLock);
    80         auto result = m_takeAllMessagesCallbacks.ensure(identifier, [completionHandler = WTFMove(completionHandler)]() mutable {
    81             return WTFMove(completionHandler);
    82         });
    83         ASSERT_UNUSED(result, result.isNewEntry);
    84     }
     79    ASSERT(!m_takeAllMessagesCallbacks.contains(identifier));
     80    m_takeAllMessagesCallbacks.add(identifier, WTFMove(completionHandler));
    8581
    8682    WebProcess::singleton().parentProcessConnection()->send(Messages::WebProcessProxy::TakeAllMessagesForPort(port, identifier), 0);
     
    9187    ASSERT(isMainThread());
    9288
    93     Locker<Lock> locker(m_takeAllMessagesCallbackLock);
    9489    auto callback = m_takeAllMessagesCallbacks.take(messageCallbackIdentifier);
    95     locker.unlockEarly();
    96 
    9790    ASSERT(callback);
    9891    callback(WTFMove(messages), [messageBatchIdentifier] {
     
    10598    ASSERT(isMainThread());
    10699
    107     Locker<Lock> locker(m_remoteActivityCallbackLock);
    108100    auto callback = m_remoteActivityCallbacks.take(callbackIdentifier);
    109     locker.unlockEarly();
    110 
    111101    ASSERT(callback);
    112102    callback(hasActivity ? HasActivity::Yes : HasActivity::No);
    113103}
    114104
    115 void WebMessagePortChannelProvider::postMessageToRemote(MessageWithMessagePorts&& message, const MessagePortIdentifier& remoteTarget)
     105void WebMessagePortChannelProvider::postMessageToRemote(const MessageWithMessagePorts& message, const MessagePortIdentifier& remoteTarget)
    116106{
    117     WebProcess::singleton().parentProcessConnection()->send(Messages::WebProcessProxy::PostMessageToRemote(WTFMove(message), remoteTarget), 0);
     107    WebProcess::singleton().parentProcessConnection()->send(Messages::WebProcessProxy::PostMessageToRemote(message, remoteTarget), 0);
    118108}
    119109
     
    129119}
    130120
    131 void WebMessagePortChannelProvider::checkRemotePortForActivity(const MessagePortIdentifier& remoteTarget, Function<void(HasActivity)>&& completionHandler)
     121void WebMessagePortChannelProvider::checkRemotePortForActivity(const MessagePortIdentifier& remoteTarget, CompletionHandler<void(HasActivity)>&& completionHandler)
    132122{
    133     static std::atomic<uint64_t> currentHandlerIdentifier;
     123    ASSERT(isMainThread());
     124
     125    static uint64_t currentHandlerIdentifier;
    134126    uint64_t identifier = ++currentHandlerIdentifier;
    135127
    136     {
    137         Locker<Lock> locker(m_remoteActivityCallbackLock);
    138         ASSERT(!m_remoteActivityCallbacks.contains(identifier));
    139         m_remoteActivityCallbacks.set(identifier, WTFMove(completionHandler));
    140     }
     128    ASSERT(!m_remoteActivityCallbacks.contains(identifier));
     129    m_remoteActivityCallbacks.set(identifier, WTFMove(completionHandler));
    141130
    142131    WebProcess::singleton().parentProcessConnection()->send(Messages::WebProcessProxy::CheckRemotePortForActivity(remoteTarget, identifier), 0);
  • trunk/Source/WebKit/WebProcess/WebCoreSupport/WebMessagePortChannelProvider.h

    r248762 r249378  
    4949    void messagePortDisentangled(const WebCore::MessagePortIdentifier& local) final;
    5050    void messagePortClosed(const WebCore::MessagePortIdentifier& local) final;
    51     void takeAllMessagesForPort(const WebCore::MessagePortIdentifier&, Function<void(Vector<WebCore::MessageWithMessagePorts>&&, Function<void()>&&)>&&) final;
    52     void postMessageToRemote(WebCore::MessageWithMessagePorts&&, const WebCore::MessagePortIdentifier& remoteTarget) final;
     51    void takeAllMessagesForPort(const WebCore::MessagePortIdentifier&, CompletionHandler<void(Vector<WebCore::MessageWithMessagePorts>&&, Function<void()>&&)>&&) final;
     52    void postMessageToRemote(const WebCore::MessageWithMessagePorts&, const WebCore::MessagePortIdentifier& remoteTarget) final;
    5353    void checkProcessLocalPortForActivity(const WebCore::MessagePortIdentifier&, WebCore::ProcessIdentifier, CompletionHandler<void(HasActivity)>&&) final;
    5454
    5555    // To be called only in the UI process
    56     void checkRemotePortForActivity(const WebCore::MessagePortIdentifier& remoteTarget, Function<void(HasActivity)>&& callback) final;
     56    void checkRemotePortForActivity(const WebCore::MessagePortIdentifier& remoteTarget, CompletionHandler<void(HasActivity)>&& callback) final;
    5757
    5858    Lock m_takeAllMessagesCallbackLock;
    59     HashMap<uint64_t, Function<void(Vector<WebCore::MessageWithMessagePorts>&&, Function<void()>&&)>> m_takeAllMessagesCallbacks;
     59    HashMap<uint64_t, CompletionHandler<void(Vector<WebCore::MessageWithMessagePorts>&&, Function<void()>&&)>> m_takeAllMessagesCallbacks;
    6060    Lock m_remoteActivityCallbackLock;
    61     HashMap<uint64_t, Function<void(HasActivity)>> m_remoteActivityCallbacks;
     61    HashMap<uint64_t, CompletionHandler<void(HasActivity)>> m_remoteActivityCallbacks;
    6262};
    6363
Note: See TracChangeset for help on using the changeset viewer.