Changeset 249378 in webkit
- Timestamp:
- Sep 2, 2019 2:31:14 AM (5 years ago)
- Location:
- trunk/Source
- Files:
-
- 1 added
- 22 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r249374 r249378 1 2019-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 1 60 2019-09-01 Myles C. Maxfield <mmaxfield@apple.com> 2 61 -
trunk/Source/WebCore/Sources.txt
r249351 r249378 973 973 dom/messageports/MessagePortChannelRegistry.cpp 974 974 dom/messageports/MessageWithMessagePorts.cpp 975 dom/messageports/WorkerMessagePortChannelProvider.cpp 975 976 976 977 domjit/DOMJITHelpers.cpp -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r249351 r249378 7167 7167 41103AAA1E39790A00769F03 /* RealtimeIncomingAudioSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RealtimeIncomingAudioSource.cpp; sourceTree = "<group>"; }; 7168 7168 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>"; }; 7169 7171 4112B53F1F9F9C9B00E67875 /* ServiceWorkerThreadProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ServiceWorkerThreadProxy.h; sourceTree = "<group>"; }; 7170 7172 4112B5411F9F9C9C00E67875 /* ServiceWorkerThreadProxy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ServiceWorkerThreadProxy.cpp; sourceTree = "<group>"; }; … … 18843 18845 51A748E12005D0E00075BA68 /* MessageWithMessagePorts.cpp */, 18844 18846 51A748E02005D0E00075BA68 /* MessageWithMessagePorts.h */, 18847 41114A7C2317B39E00B56007 /* WorkerMessagePortChannelProvider.cpp */, 18848 41114A7A2317B39E00B56007 /* WorkerMessagePortChannelProvider.h */, 18845 18849 ); 18846 18850 path = messageports; -
trunk/Source/WebCore/dom/Document.cpp
r249353 r249378 8283 8283 #endif 8284 8284 8285 MessagePortChannelProvider& Document::messagePortChannelProvider() 8286 { 8287 return MessagePortChannelProvider::singleton(); 8288 } 8289 8285 8290 } // namespace WebCore -
trunk/Source/WebCore/dom/Document.h
r248846 r249378 158 158 class MediaQueryList; 159 159 class MediaQueryMatcher; 160 class MessagePortChannelProvider; 160 161 class MouseEventWithHitTestResults; 161 162 class NodeFilter; … … 1530 1531 #endif 1531 1532 1533 MessagePortChannelProvider& messagePortChannelProvider(); 1534 1532 1535 protected: 1533 1536 enum ConstructionFlags { Synthesized = 1, NonRenderedPlaceholder = 1 << 1 }; -
trunk/Source/WebCore/dom/MessageChannel.cpp
r243887 r249378 50 50 ASSERT(!m_port1->closed()); 51 51 ASSERT(!m_port2->closed()); 52 MessagePortChannelProvider:: singleton().createNewMessagePortChannel(id1, id2);52 MessagePortChannelProvider::fromContext(context).createNewMessagePortChannel(id1, id2); 53 53 } else { 54 54 ASSERT(m_port1->closed()); -
trunk/Source/WebCore/dom/MessagePort.cpp
r248148 r249378 38 38 #include <wtf/CompletionHandler.h> 39 39 #include <wtf/IsoMallocInlines.h> 40 #include <wtf/Scope.h> 40 41 41 42 namespace WebCore { … … 125 126 void MessagePort::entangle() 126 127 { 127 MessagePortChannelProvider:: singleton().entangleLocalPortInThisProcessToRemote(m_identifier, m_remoteIdentifier);128 MessagePortChannelProvider::fromContext(*m_scriptExecutionContext).entangleLocalPortInThisProcessToRemote(m_identifier, m_remoteIdentifier); 128 129 } 129 130 … … 161 162 LOG(MessagePorts, "Actually posting message to port %s (to be received by port %s)", m_identifier.logString().utf8().data(), m_remoteIdentifier.logString().utf8().data()); 162 163 163 MessagePortChannelProvider:: singleton().postMessageToRemote(WTFMove(message), m_remoteIdentifier);164 MessagePortChannelProvider::fromContext(*m_scriptExecutionContext).postMessageToRemote(message, m_remoteIdentifier); 164 165 return { }; 165 166 } … … 172 173 registerLocalActivity(); 173 174 174 MessagePortChannelProvider:: singleton().messagePortDisentangled(m_identifier);175 MessagePortChannelProvider::fromContext(*m_scriptExecutionContext).messagePortDisentangled(m_identifier); 175 176 176 177 // 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);178 178 m_scriptExecutionContext->destroyedMessagePort(*this); 179 179 m_scriptExecutionContext->willDestroyActiveDOMObject(*this); … … 226 226 m_closed = true; 227 227 228 MessagePortChannelProvider:: singleton().messagePortClosed(m_identifier);228 MessagePortChannelProvider::fromContext(*m_scriptExecutionContext).messagePortClosed(m_identifier); 229 229 removeAllEventListeners(); 230 230 } … … 247 247 return; 248 248 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()) 257 269 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())); 283 272 } 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());290 273 }; 291 274 292 MessagePortChannelProvider:: singleton().takeAllMessagesForPort(m_identifier, WTFMove(messagesTakenHandler));275 MessagePortChannelProvider::fromContext(*m_scriptExecutionContext).takeAllMessagesForPort(m_identifier, WTFMove(messagesTakenHandler)); 293 276 } 294 277 … … 329 312 workerThread = &downcast<WorkerGlobalScope>(*m_scriptExecutionContext).thread(); 330 313 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 }); 344 327 }); 345 328 m_isAskingRemoteAboutGC = true; -
trunk/Source/WebCore/dom/messageports/MessagePortChannel.cpp
r247218 r249378 148 148 } 149 149 150 void MessagePortChannel::takeAllMessagesForPort(const MessagePortIdentifier& port, Function<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&& callback)150 void MessagePortChannel::takeAllMessagesForPort(const MessagePortIdentifier& port, CompletionHandler<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&& callback) 151 151 { 152 152 ASSERT(isMainThread()); … … 183 183 } 184 184 185 void MessagePortChannel::checkRemotePortForActivity(const MessagePortIdentifier& remotePort, Function<void(MessagePortChannelProvider::HasActivity)>&& callback)185 void MessagePortChannel::checkRemotePortForActivity(const MessagePortIdentifier& remotePort, CompletionHandler<void(MessagePortChannelProvider::HasActivity)>&& callback) 186 186 { 187 187 ASSERT(isMainThread()); … … 208 208 } 209 209 210 auto outerCallback = Function<void(MessagePortChannelProvider::HasActivity)> { [this, protectedThis = makeRef(*this), callback = WTFMove(callback)] (MessagePortChannelProvider::HasActivityhasActivity) mutable {210 CompletionHandler<void(MessagePortChannelProvider::HasActivity)> outerCallback = [this, protectedThis = makeRef(*this), callback = WTFMove(callback)](auto hasActivity) mutable { 211 211 if (hasActivity == MessagePortChannelProvider::HasActivity::Yes) { 212 212 callback(hasActivity); … … 220 220 221 221 callback(hasActivity); 222 } };222 }; 223 223 224 224 m_registry.provider().checkProcessLocalPortForActivity(remotePort, *m_processes[i], WTFMove(outerCallback)); -
trunk/Source/WebCore/dom/messageports/MessagePortChannel.h
r247218 r249378 54 54 bool postMessageToRemote(MessageWithMessagePorts&&, const MessagePortIdentifier& remoteTarget); 55 55 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); 58 58 59 59 WEBCORE_EXPORT bool hasAnyMessagesPendingOrInFlight() const; -
trunk/Source/WebCore/dom/messageports/MessagePortChannelProvider.cpp
r227190 r249378 27 27 #include "MessagePortChannelProvider.h" 28 28 29 #include "Document.h" 29 30 #include "MessagePortChannelProviderImpl.h" 31 #include "WorkerGlobalScope.h" 30 32 #include <wtf/MainThread.h> 31 33 … … 36 38 MessagePortChannelProvider& MessagePortChannelProvider::singleton() 37 39 { 40 ASSERT(isMainThread()); 38 41 static std::once_flag onceFlag; 39 42 std::call_once(onceFlag, [] { … … 52 55 } 53 56 57 MessagePortChannelProvider& 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 54 65 } // namespace WebCore -
trunk/Source/WebCore/dom/messageports/MessagePortChannelProvider.h
r247218 r249378 27 27 28 28 #include "ProcessIdentifier.h" 29 #include <wtf/ Function.h>29 #include <wtf/CompletionHandler.h> 30 30 #include <wtf/Vector.h> 31 31 32 32 namespace WebCore { 33 33 34 class ScriptExecutionContext; 34 35 struct MessagePortIdentifier; 35 36 struct MessageWithMessagePorts; … … 37 38 class MessagePortChannelProvider { 38 39 public: 40 static MessagePortChannelProvider& fromContext(ScriptExecutionContext&); 39 41 static MessagePortChannelProvider& singleton(); 40 42 WEBCORE_EXPORT static void setSharedProvider(MessagePortChannelProvider&); … … 48 50 virtual void messagePortClosed(const MessagePortIdentifier& local) = 0; 49 51 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; 53 53 54 virtual void postMessageToRemote( MessageWithMessagePorts&&, const MessagePortIdentifier& remoteTarget) = 0;54 virtual void postMessageToRemote(const MessageWithMessagePorts&, const MessagePortIdentifier& remoteTarget) = 0; 55 55 56 56 enum class HasActivity { … … 58 58 No, 59 59 }; 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; 63 61 64 62 // Operations that the coordinating process performs (e.g. the UIProcess) -
trunk/Source/WebCore/dom/messageports/MessagePortChannelProviderImpl.cpp
r247218 r249378 28 28 29 29 #include "MessagePort.h" 30 #include <wtf/CompletionHandler.h>31 30 #include <wtf/MainThread.h> 32 31 #include <wtf/RunLoop.h> … … 80 79 } 81 80 82 void MessagePortChannelProviderImpl::postMessageToRemote( MessageWithMessagePorts&& message, const MessagePortIdentifier& remoteTarget)81 void MessagePortChannelProviderImpl::postMessageToRemote(const MessageWithMessagePorts& message, const MessagePortIdentifier& remoteTarget) 83 82 { 84 performActionOnMainThread([registry = &m_registry, message = WTFMove(message), remoteTarget]() mutable {83 performActionOnMainThread([registry = &m_registry, message = MessageWithMessagePorts { message }, remoteTarget]() mutable { 85 84 if (registry->didPostMessageToRemote(WTFMove(message), remoteTarget)) 86 85 MessagePort::notifyMessageAvailable(remoteTarget); … … 88 87 } 89 88 90 void MessagePortChannelProviderImpl::takeAllMessagesForPort(const MessagePortIdentifier& port, Function<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&& outerCallback)89 void MessagePortChannelProviderImpl::takeAllMessagesForPort(const MessagePortIdentifier& port, CompletionHandler<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&& outerCallback) 91 90 { 92 91 // 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 { 94 93 ASSERT(isMainThread()); 95 94 outerCallback(WTFMove(messages), WTFMove(messageDeliveryCallback)); … … 101 100 } 102 101 103 void MessagePortChannelProviderImpl::checkRemotePortForActivity(const MessagePortIdentifier& remoteTarget, Function<void(HasActivity)>&& outerCallback)102 void MessagePortChannelProviderImpl::checkRemotePortForActivity(const MessagePortIdentifier& remoteTarget, CompletionHandler<void(HasActivity)>&& outerCallback) 104 103 { 105 104 auto callback = Function<void(HasActivity)> { [outerCallback = WTFMove(outerCallback)](HasActivity hasActivity) mutable { … … 120 119 } 121 120 122 123 121 } // namespace WebCore -
trunk/Source/WebCore/dom/messageports/MessagePortChannelProviderImpl.h
r247218 r249378 41 41 void messagePortDisentangled(const MessagePortIdentifier& local) final; 42 42 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; 46 46 47 47 void checkProcessLocalPortForActivity(const MessagePortIdentifier&, ProcessIdentifier, CompletionHandler<void(HasActivity)>&&) final; -
trunk/Source/WebCore/dom/messageports/MessagePortChannelRegistry.cpp
r247218 r249378 142 142 } 143 143 144 void MessagePortChannelRegistry::takeAllMessagesForPort(const MessagePortIdentifier& port, Function<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&& callback)144 void MessagePortChannelRegistry::takeAllMessagesForPort(const MessagePortIdentifier& port, CompletionHandler<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&& callback) 145 145 { 146 146 ASSERT(isMainThread()); … … 158 158 } 159 159 160 void MessagePortChannelRegistry::checkRemotePortForActivity(const MessagePortIdentifier& remoteTarget, Function<void(MessagePortChannelProvider::HasActivity)>&& callback)160 void MessagePortChannelRegistry::checkRemotePortForActivity(const MessagePortIdentifier& remoteTarget, CompletionHandler<void(MessagePortChannelProvider::HasActivity)>&& callback) 161 161 { 162 162 ASSERT(isMainThread()); -
trunk/Source/WebCore/dom/messageports/MessagePortChannelRegistry.h
r247218 r249378 44 44 WEBCORE_EXPORT void didCloseMessagePort(const MessagePortIdentifier& local); 45 45 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); 48 48 49 49 WEBCORE_EXPORT MessagePortChannel* existingChannelContainingPort(const MessagePortIdentifier&); -
trunk/Source/WebCore/dom/messageports/WorkerMessagePortChannelProvider.h
r249377 r249378 1 1 /* 2 * Copyright (C) 201 8Apple Inc. All rights reserved.2 * Copyright (C) 2019 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 27 27 28 28 #include "MessagePortChannelProvider.h" 29 #include "MessagePortChannelRegistry.h" 29 #include <wtf/CompletionHandler.h> 30 #include <wtf/HashMap.h> 31 #include <wtf/Vector.h> 30 32 31 33 namespace WebCore { 32 34 33 class MessagePortChannelProviderImpl : public MessagePortChannelProvider { 35 class WorkerGlobalScope; 36 37 class WorkerMessagePortChannelProvider final : public MessagePortChannelProvider { 38 WTF_MAKE_FAST_ALLOCATED; 34 39 public: 35 MessagePortChannelProviderImpl();36 ~ MessagePortChannelProviderImpl() final;40 explicit WorkerMessagePortChannelProvider(WorkerGlobalScope&); 41 ~WorkerMessagePortChannelProvider(); 37 42 38 43 private: … … 41 46 void messagePortDisentangled(const MessagePortIdentifier& local) final; 42 47 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; 46 51 47 52 void checkProcessLocalPortForActivity(const MessagePortIdentifier&, ProcessIdentifier, CompletionHandler<void(HasActivity)>&&) final; 48 53 49 void performActionOnMainThread(Function<void()>&&);54 WorkerGlobalScope& m_scope; 50 55 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; 52 59 }; 53 60 -
trunk/Source/WebCore/workers/WorkerGlobalScope.cpp
r248957 r249378 464 464 } 465 465 466 MessagePortChannelProvider& WorkerGlobalScope::messagePortChannelProvider() 467 { 468 if (!m_messagePortChannelProvider) 469 m_messagePortChannelProvider = makeUnique<WorkerMessagePortChannelProvider>(*this); 470 return *m_messagePortChannelProvider; 471 } 472 466 473 void WorkerGlobalScope::createImageBitmap(ImageBitmap::Source&& source, ImageBitmapOptions&& options, ImageBitmap::Promise&& promise) 467 474 { -
trunk/Source/WebCore/workers/WorkerGlobalScope.h
r248503 r249378 36 36 #include "WorkerCacheStorageConnection.h" 37 37 #include "WorkerEventQueue.h" 38 #include "WorkerMessagePortChannelProvider.h" 38 39 #include "WorkerScriptController.h" 39 40 #include <JavaScriptCore/ConsoleMessage.h> … … 74 75 75 76 WorkerCacheStorageConnection& cacheStorageConnection(); 77 MessagePortChannelProvider& messagePortChannelProvider(); 76 78 77 79 WorkerScriptController* script() { return m_script.get(); } … … 211 213 PAL::SessionID m_sessionID; 212 214 RefPtr<WorkerCacheStorageConnection> m_cacheStorageConnection; 213 215 std::unique_ptr<WorkerMessagePortChannelProvider> m_messagePortChannelProvider; 214 216 unsigned long m_uniqueIdentifier { 1 }; 215 217 }; -
trunk/Source/WebKit/ChangeLog
r249376 r249378 1 2019-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 1 23 2019-09-01 Youenn Fablet <youenn@apple.com> 2 24 -
trunk/Source/WebKit/UIProcess/UIMessagePortChannelProvider.cpp
r247218 r249378 29 29 #include "WebProcessMessages.h" 30 30 #include "WebProcessProxy.h" 31 #include <wtf/CompletionHandler.h>32 31 33 32 namespace WebKit { … … 74 73 } 75 74 76 void UIMessagePortChannelProvider::takeAllMessagesForPort(const MessagePortIdentifier&, Function<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&&)75 void UIMessagePortChannelProvider::takeAllMessagesForPort(const MessagePortIdentifier&, CompletionHandler<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&&) 77 76 { 78 77 // Should never be called in the UI process provider. … … 80 79 } 81 80 82 void UIMessagePortChannelProvider::postMessageToRemote( MessageWithMessagePorts&&, const MessagePortIdentifier&)81 void UIMessagePortChannelProvider::postMessageToRemote(const MessageWithMessagePorts&, const MessagePortIdentifier&) 83 82 { 84 83 // Should never be called in the UI process provider. … … 86 85 } 87 86 88 void UIMessagePortChannelProvider::checkRemotePortForActivity(const MessagePortIdentifier&, Function<void(HasActivity)>&&)87 void UIMessagePortChannelProvider::checkRemotePortForActivity(const MessagePortIdentifier&, CompletionHandler<void(HasActivity)>&&) 89 88 { 90 89 // Should never be called in the UI process provider. -
trunk/Source/WebKit/UIProcess/UIMessagePortChannelProvider.h
r247218 r249378 44 44 void messagePortDisentangled(const WebCore::MessagePortIdentifier& local) final; 45 45 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; 49 49 void checkProcessLocalPortForActivity(const WebCore::MessagePortIdentifier&, WebCore::ProcessIdentifier, CompletionHandler<void(HasActivity)>&&) final; 50 50 -
trunk/Source/WebKit/WebProcess/WebCoreSupport/WebMessagePortChannelProvider.cpp
r247218 r249378 71 71 } 72 72 73 void WebMessagePortChannelProvider::takeAllMessagesForPort(const MessagePortIdentifier& port, Function<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&& completionHandler)73 void WebMessagePortChannelProvider::takeAllMessagesForPort(const MessagePortIdentifier& port, CompletionHandler<void(Vector<MessageWithMessagePorts>&&, Function<void()>&&)>&& completionHandler) 74 74 { 75 static std::atomic<uint64_t> currentHandlerIdentifier; 75 ASSERT(isMainThread()); 76 static uint64_t currentHandlerIdentifier; 76 77 uint64_t identifier = ++currentHandlerIdentifier; 77 78 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)); 85 81 86 82 WebProcess::singleton().parentProcessConnection()->send(Messages::WebProcessProxy::TakeAllMessagesForPort(port, identifier), 0); … … 91 87 ASSERT(isMainThread()); 92 88 93 Locker<Lock> locker(m_takeAllMessagesCallbackLock);94 89 auto callback = m_takeAllMessagesCallbacks.take(messageCallbackIdentifier); 95 locker.unlockEarly();96 97 90 ASSERT(callback); 98 91 callback(WTFMove(messages), [messageBatchIdentifier] { … … 105 98 ASSERT(isMainThread()); 106 99 107 Locker<Lock> locker(m_remoteActivityCallbackLock);108 100 auto callback = m_remoteActivityCallbacks.take(callbackIdentifier); 109 locker.unlockEarly();110 111 101 ASSERT(callback); 112 102 callback(hasActivity ? HasActivity::Yes : HasActivity::No); 113 103 } 114 104 115 void WebMessagePortChannelProvider::postMessageToRemote( MessageWithMessagePorts&& message, const MessagePortIdentifier& remoteTarget)105 void WebMessagePortChannelProvider::postMessageToRemote(const MessageWithMessagePorts& message, const MessagePortIdentifier& remoteTarget) 116 106 { 117 WebProcess::singleton().parentProcessConnection()->send(Messages::WebProcessProxy::PostMessageToRemote( WTFMove(message), remoteTarget), 0);107 WebProcess::singleton().parentProcessConnection()->send(Messages::WebProcessProxy::PostMessageToRemote(message, remoteTarget), 0); 118 108 } 119 109 … … 129 119 } 130 120 131 void WebMessagePortChannelProvider::checkRemotePortForActivity(const MessagePortIdentifier& remoteTarget, Function<void(HasActivity)>&& completionHandler)121 void WebMessagePortChannelProvider::checkRemotePortForActivity(const MessagePortIdentifier& remoteTarget, CompletionHandler<void(HasActivity)>&& completionHandler) 132 122 { 133 static std::atomic<uint64_t> currentHandlerIdentifier; 123 ASSERT(isMainThread()); 124 125 static uint64_t currentHandlerIdentifier; 134 126 uint64_t identifier = ++currentHandlerIdentifier; 135 127 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)); 141 130 142 131 WebProcess::singleton().parentProcessConnection()->send(Messages::WebProcessProxy::CheckRemotePortForActivity(remoteTarget, identifier), 0); -
trunk/Source/WebKit/WebProcess/WebCoreSupport/WebMessagePortChannelProvider.h
r248762 r249378 49 49 void messagePortDisentangled(const WebCore::MessagePortIdentifier& local) final; 50 50 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; 53 53 void checkProcessLocalPortForActivity(const WebCore::MessagePortIdentifier&, WebCore::ProcessIdentifier, CompletionHandler<void(HasActivity)>&&) final; 54 54 55 55 // 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; 57 57 58 58 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; 60 60 Lock m_remoteActivityCallbackLock; 61 HashMap<uint64_t, Function<void(HasActivity)>> m_remoteActivityCallbacks;61 HashMap<uint64_t, CompletionHandler<void(HasActivity)>> m_remoteActivityCallbacks; 62 62 }; 63 63
Note: See TracChangeset
for help on using the changeset viewer.