Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(107)

Unified Diff: third_party/WebKit/Source/core/workers/InProcessWorkerMessagingProxy.cpp

Issue 2124693002: Worker: Fix broken GC logic on Dedicated Worker while DOMTimer is set (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/workers/InProcessWorkerMessagingProxy.cpp
diff --git a/third_party/WebKit/Source/core/workers/InProcessWorkerMessagingProxy.cpp b/third_party/WebKit/Source/core/workers/InProcessWorkerMessagingProxy.cpp
index 55832c5737ba4ef4edd56da2b7ca6d75afa32c74..d52aed13207ba4dd6cf56c92daf572ee64bdcab6 100644
--- a/third_party/WebKit/Source/core/workers/InProcessWorkerMessagingProxy.cpp
+++ b/third_party/WebKit/Source/core/workers/InProcessWorkerMessagingProxy.cpp
@@ -28,7 +28,6 @@
#include "core/workers/InProcessWorkerMessagingProxy.h"
-#include "bindings/core/v8/V8GCController.h"
#include "core/dom/CrossThreadTask.h"
#include "core/dom/Document.h"
#include "core/dom/SecurityContext.h"
@@ -67,7 +66,8 @@ void processMessageOnWorkerGlobalScope(PassRefPtr<SerializedScriptValue> message
WorkerGlobalScope* globalScope = toWorkerGlobalScope(scriptContext);
MessagePortArray* ports = MessagePort::entanglePorts(*scriptContext, std::move(channels));
globalScope->dispatchEvent(MessageEvent::create(ports, message));
- workerObjectProxy->confirmMessageFromWorkerObject(V8GCController::hasPendingActivity(globalScope->thread()->isolate(), scriptContext));
+ workerObjectProxy->confirmMessageFromWorkerObject();
+ workerObjectProxy->startPendingActivityTimer();
}
static int s_liveMessagingProxyCount = 0;
@@ -75,20 +75,9 @@ static int s_liveMessagingProxyCount = 0;
} // namespace
InProcessWorkerMessagingProxy::InProcessWorkerMessagingProxy(InProcessWorkerBase* workerObject, WorkerClients* workerClients)
- : m_executionContext(workerObject->getExecutionContext())
- , m_workerObjectProxy(InProcessWorkerObjectProxy::create(this))
- , m_workerObject(workerObject)
- , m_mayBeDestroyed(false)
- , m_unconfirmedMessageCount(0)
- , m_workerThreadHadPendingActivity(false)
- , m_askedToTerminate(false)
- , m_workerInspectorProxy(WorkerInspectorProxy::create())
- , m_workerClients(workerClients)
- , m_parentFrameTaskRunners(ParentFrameTaskRunners::create(toDocument(m_executionContext.get())->frame()))
+ : InProcessWorkerMessagingProxy(workerObject->getExecutionContext(), workerObject, workerClients)
{
- DCHECK(isParentContextThread());
DCHECK(m_workerObject);
- s_liveMessagingProxyCount++;
}
InProcessWorkerMessagingProxy::~InProcessWorkerMessagingProxy()
@@ -151,6 +140,8 @@ void InProcessWorkerMessagingProxy::postMessageToWorkerGlobalScope(PassRefPtr<Se
std::unique_ptr<ExecutionContextTask> task = createCrossThreadTask(&processMessageOnWorkerGlobalScope, message, passed(std::move(channels)), crossThreadUnretained(&workerObjectProxy()));
if (m_workerThread) {
+ // A message event is an activity and may initiate another activity.
+ m_workerGlobalScopeMayHavePendingActivity = true;
++m_unconfirmedMessageCount;
m_workerThread->postTask(BLINK_FROM_HERE, std::move(task));
} else {
@@ -212,13 +203,29 @@ void InProcessWorkerMessagingProxy::workerThreadCreated()
m_unconfirmedMessageCount = m_queuedEarlyTasks.size();
// Worker initialization means a pending activity.
- m_workerThreadHadPendingActivity = true;
+ m_workerGlobalScopeMayHavePendingActivity = true;
for (auto& earlyTasks : m_queuedEarlyTasks)
m_workerThread->postTask(BLINK_FROM_HERE, std::move(earlyTasks));
m_queuedEarlyTasks.clear();
}
+InProcessWorkerMessagingProxy::InProcessWorkerMessagingProxy(ExecutionContext* executionContext, InProcessWorkerBase* workerObject, WorkerClients* workerClients)
+ : m_executionContext(executionContext)
+ , m_workerObjectProxy(InProcessWorkerObjectProxy::create(this))
+ , m_workerObject(workerObject)
+ , m_mayBeDestroyed(false)
+ , m_unconfirmedMessageCount(0)
+ , m_workerGlobalScopeMayHavePendingActivity(false)
+ , m_askedToTerminate(false)
+ , m_workerInspectorProxy(WorkerInspectorProxy::create())
+ , m_workerClients(workerClients)
+ , m_parentFrameTaskRunners(ParentFrameTaskRunners::create(toDocument(m_executionContext.get())->frame()))
+{
+ DCHECK(isParentContextThread());
+ s_liveMessagingProxyCount++;
+}
+
void InProcessWorkerMessagingProxy::workerObjectDestroyed()
{
DCHECK(isParentContextThread());
@@ -276,26 +283,33 @@ void InProcessWorkerMessagingProxy::postMessageToPageInspector(const String& mes
m_workerInspectorProxy->dispatchMessageFromWorker(message);
}
-void InProcessWorkerMessagingProxy::confirmMessageFromWorkerObject(bool hasPendingActivity)
+void InProcessWorkerMessagingProxy::confirmMessageFromWorkerObject()
{
DCHECK(isParentContextThread());
- if (!m_askedToTerminate) {
- DCHECK(m_unconfirmedMessageCount);
- --m_unconfirmedMessageCount;
- }
- reportPendingActivity(hasPendingActivity);
+ if (m_askedToTerminate)
+ return;
+ DCHECK(m_unconfirmedMessageCount);
+ --m_unconfirmedMessageCount;
}
-void InProcessWorkerMessagingProxy::reportPendingActivity(bool hasPendingActivity)
+void InProcessWorkerMessagingProxy::pendingActivityFinished()
{
DCHECK(isParentContextThread());
- m_workerThreadHadPendingActivity = hasPendingActivity;
+ DCHECK(m_workerGlobalScopeMayHavePendingActivity);
+ if (m_unconfirmedMessageCount > 0) {
+ // Ignore the report because an inflight message event may initiate a
+ // new activity.
+ return;
+ }
+ m_workerGlobalScopeMayHavePendingActivity = false;
}
bool InProcessWorkerMessagingProxy::hasPendingActivity() const
{
DCHECK(isParentContextThread());
- return (m_unconfirmedMessageCount || m_workerThreadHadPendingActivity) && !m_askedToTerminate;
+ if (m_askedToTerminate)
+ return false;
+ return m_unconfirmedMessageCount || m_workerGlobalScopeMayHavePendingActivity;
}
bool InProcessWorkerMessagingProxy::isParentContextThread() const

Powered by Google App Engine
This is Rietveld 408576698