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

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

Issue 1733353004: Introduce WorkerBackingThread (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 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/WorkerThread.cpp
diff --git a/third_party/WebKit/Source/core/workers/WorkerThread.cpp b/third_party/WebKit/Source/core/workers/WorkerThread.cpp
index bb5bb46c7708830080177d81d4d618f2c919daf0..f4aa897af0dab13d80b1eb9f82de4e4c4452dc01 100644
--- a/third_party/WebKit/Source/core/workers/WorkerThread.cpp
+++ b/third_party/WebKit/Source/core/workers/WorkerThread.cpp
@@ -27,13 +27,11 @@
#include "core/workers/WorkerThread.h"
#include "bindings/core/v8/ScriptSourceCode.h"
-#include "bindings/core/v8/V8GCController.h"
-#include "bindings/core/v8/V8IdleTaskRunner.h"
-#include "bindings/core/v8/V8Initializer.h"
#include "core/dom/Microtask.h"
#include "core/inspector/InspectorInstrumentation.h"
#include "core/inspector/WorkerInspectorController.h"
#include "core/workers/DedicatedWorkerGlobalScope.h"
+#include "core/workers/WorkerBackingThread.h"
#include "core/workers/WorkerClients.h"
#include "core/workers/WorkerReportingProxy.h"
#include "core/workers/WorkerThreadStartupData.h"
@@ -42,7 +40,6 @@
#include "platform/heap/SafePoint.h"
#include "platform/heap/ThreadState.h"
#include "platform/weborigin/KURL.h"
-#include "public/platform/Platform.h"
#include "public/platform/WebScheduler.h"
#include "public/platform/WebThread.h"
#include "wtf/Functional.h"
@@ -194,7 +191,7 @@ private:
bool m_killed = false;
};
-WorkerThread::WorkerThread(PassRefPtr<WorkerLoaderProxy> workerLoaderProxy, WorkerReportingProxy& workerReportingProxy)
+WorkerThread::WorkerThread(PassRefPtr<WorkerLoaderProxy> workerLoaderProxy, WorkerReportingProxy& workerReportingProxy, PassRefPtr<WorkerBackingThread> thread)
: m_started(false)
, m_terminated(false)
, m_shutdown(false)
@@ -202,7 +199,7 @@ WorkerThread::WorkerThread(PassRefPtr<WorkerLoaderProxy> workerLoaderProxy, Work
, m_workerLoaderProxy(workerLoaderProxy)
, m_workerReportingProxy(workerReportingProxy)
, m_webScheduler(nullptr)
- , m_isolate(nullptr)
+ , m_workerBackingThread(thread)
, m_shutdownEvent(adoptPtr(new WaitableEvent(
WaitableEvent::ResetPolicy::Manual,
WaitableEvent::InitialState::NonSignaled)))
@@ -268,18 +265,16 @@ void WorkerThread::initialize(PassOwnPtr<WorkerThreadStartupData> startupData)
return;
}
+ m_workerBackingThread->attach();
+
m_microtaskRunner = adoptPtr(new WorkerMicrotaskRunner(this));
- initializeBackingThread();
backingThread().addTaskObserver(m_microtaskRunner.get());
- m_isolate = initializeIsolate();
// Optimize for memory usage instead of latency for the worker isolate.
- m_isolate->IsolateInBackgroundNotification();
+ isolate()->IsolateInBackgroundNotification();
m_workerGlobalScope = createWorkerGlobalScope(startupData);
m_workerGlobalScope->scriptLoaded(sourceCode.length(), cachedMetaData.get() ? cachedMetaData->size() : 0);
- didStartWorkerThread();
-
// Notify proxy that a new WorkerGlobalScope has been created and started.
m_workerReportingProxy.workerGlobalScopeStarted(m_workerGlobalScope.get());
@@ -316,10 +311,6 @@ void WorkerThread::shutdown()
workerGlobalScope()->dispose();
- // This should be called after the WorkerGlobalScope's disposed (which may
- // trigger some last-minutes cleanups) and before the thread actually stops.
- willStopWorkerThread();
-
backingThread().removeTaskObserver(m_microtaskRunner.get());
postTask(BLINK_FROM_HERE, createSameThreadTask(&WorkerThread::performShutdownTask, this));
}
@@ -335,11 +326,8 @@ void WorkerThread::performShutdownTask()
m_workerGlobalScope->notifyContextDestroyed();
m_workerGlobalScope = nullptr;
- willDestroyIsolate();
- shutdownBackingThread();
- destroyIsolate();
- m_isolate = nullptr;
-
+ m_workerBackingThread->detach();
+ m_workerBackingThread = nullptr;
m_microtaskRunner = nullptr;
// Notify the proxy that the WorkerGlobalScope has been disposed of.
@@ -402,23 +390,36 @@ void WorkerThread::terminateInternal()
// Ensure that tasks are being handled by thread event loop. If script execution weren't forbidden, a while(1) loop in JS could keep the thread alive forever.
m_workerGlobalScope->scriptController()->willScheduleExecutionTermination();
- terminateV8Execution();
+
+ if (1 == m_workerBackingThread->workerScriptCount()) {
+ // This condition is not entirely correct because other scripts
+ // can be being initialized or terminated simuletaneously. Though this
+ // function itself is protected by a mutex, it is possible that
+ // |workerScriptCount()| here is not consistent with that in
+ // |initialize| and |shutdown|.
+ isolate()->TerminateExecution();
+ }
kinuko 2016/02/29 09:32:53 The comment just leaves readers unsure if this cod
yhirano 2016/02/29 23:47:32 Imagine there are two WorkerThread x and y attache
yhirano 2016/03/01 00:04:52 Correction: before x->shutdown() on the worker th
InspectorInstrumentation::didKillAllExecutionContextTasks(m_workerGlobalScope.get());
m_debuggerTaskQueue->kill();
backingThread().postTask(BLINK_FROM_HERE, threadSafeBind(&WorkerThread::shutdown, AllowCrossThreadAccess(this)));
}
-void WorkerThread::didStartWorkerThread()
+WorkerBackingThread& WorkerThread::workerBackingThread()
{
- ASSERT(isCurrentThread());
- Platform::current()->didStartWorkerThread();
+ ASSERT(m_workerBackingThread);
+ return *m_workerBackingThread;
}
-void WorkerThread::willStopWorkerThread()
+WebThreadSupportingGC& WorkerThread::backingThread()
{
- ASSERT(isCurrentThread());
- Platform::current()->willStopWorkerThread();
+ ASSERT(m_workerBackingThread);
+ return m_workerBackingThread->backingThread();
+}
+
+v8::Isolate* WorkerThread::isolate() const
+{
+ return m_workerBackingThread->isolate();
}
void WorkerThread::terminateAndWaitForAllWorkers()
@@ -448,52 +449,6 @@ void WorkerThread::postDelayedTask(const WebTraceLocation& location, PassOwnPtr<
backingThread().postDelayedTask(location, createWorkerThreadTask(task, true), delayMs);
}
-void WorkerThread::initializeBackingThread()
-{
- ASSERT(isCurrentThread());
- backingThread().initialize();
-}
-
-void WorkerThread::shutdownBackingThread()
-{
- ASSERT(isCurrentThread());
- backingThread().shutdown();
-}
-
-v8::Isolate* WorkerThread::initializeIsolate()
-{
- ASSERT(isCurrentThread());
- ASSERT(!m_isolate);
- v8::Isolate* isolate = V8PerIsolateData::initialize();
- V8Initializer::initializeWorker(isolate);
-
- OwnPtr<V8IsolateInterruptor> interruptor = adoptPtr(new V8IsolateInterruptor(isolate));
- ThreadState::current()->addInterruptor(interruptor.release());
- ThreadState::current()->registerTraceDOMWrappers(isolate, V8GCController::traceDOMWrappers);
- if (RuntimeEnabledFeatures::v8IdleTasksEnabled())
- V8PerIsolateData::enableIdleTasks(isolate, adoptPtr(new V8IdleTaskRunner(m_webScheduler)));
- return isolate;
-}
-
-void WorkerThread::willDestroyIsolate()
-{
- ASSERT(isCurrentThread());
- ASSERT(m_isolate);
- V8PerIsolateData::willBeDestroyed(m_isolate);
-}
-
-void WorkerThread::destroyIsolate()
-{
- ASSERT(isCurrentThread());
- V8PerIsolateData::destroy(m_isolate);
-}
-
-void WorkerThread::terminateV8Execution()
-{
- ASSERT(isMainThread());
- m_isolate->TerminateExecution();
-}
-
void WorkerThread::appendDebuggerTask(PassOwnPtr<Closure> task)
{
{

Powered by Google App Engine
This is Rietveld 408576698