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

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

Issue 2011763002: Worker: Attempt to gracefully terminate WorkerThread as much as possible (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@reorder_functions
Patch Set: EXPECT_EQ Created 4 years, 7 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
« no previous file with comments | « no previous file | third_party/WebKit/Source/core/workers/WorkerThread.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/core/workers/WorkerThread.h
diff --git a/third_party/WebKit/Source/core/workers/WorkerThread.h b/third_party/WebKit/Source/core/workers/WorkerThread.h
index 192f206027341e9a5ec4eed72d485acfea2120ae..92c7dbe30e5e2029efd02695376b526fe3649d85 100644
--- a/third_party/WebKit/Source/core/workers/WorkerThread.h
+++ b/third_party/WebKit/Source/core/workers/WorkerThread.h
@@ -62,15 +62,22 @@ enum WorkerThreadStartMode {
// an actual task is executed on the worker thread.
class CORE_EXPORT WorkerThread {
public:
+ // Represents how this thread is terminated.
+ enum class ExitCode {
+ NotTerminated,
+ GracefullyTerminated,
+ SyncForciblyTerminated,
+ AsyncForciblyTerminated,
+ };
+
virtual ~WorkerThread();
// Called on the main thread.
void start(PassOwnPtr<WorkerThreadStartupData>);
void terminate();
- // Called in shutdown sequence on the main thread. Internally calls
- // terminate() and wait (by *blocking* the calling thread) until the
- // worker(s) is/are shut down.
+ // Called on the main thread. Internally calls terminateInternal() and wait
+ // (by *blocking* the calling thread) until the worker(s) is/are shut down.
void terminateAndWait();
static void terminateAndWaitForAllWorkers();
@@ -114,6 +121,8 @@ public:
PlatformThreadId platformThreadId();
+ ExitCode getExitCode();
+
protected:
WorkerThread(PassRefPtr<WorkerLoaderProxy>, WorkerReportingProxy&);
@@ -125,10 +134,28 @@ protected:
virtual void postInitialize() { }
private:
+ friend class WorkerThreadTest;
+
+ class ForceTerminationTask;
class WorkerMicrotaskRunner;
+ enum class TerminationMode {
+ // Synchronously terminate the worker execution. Please be careful to
+ // use this mode, because after the synchronous termination any V8 APIs
+ // may suddenly start to return empty handles and it may cause crashes.
+ Forcible,
+
+ // Don't synchronously terminate the worker execution. Instead, schedule
+ // a task to terminate it in case that the shutdown sequence does not
+ // start on the worker thread in a certain time period.
+ Graceful,
+ };
+
std::unique_ptr<CrossThreadClosure> createWorkerThreadTask(std::unique_ptr<ExecutionContextTask>, bool isInstrumented);
+ void terminateInternal(TerminationMode);
+ void forciblyTerminateExecution();
+
void initializeOnWorkerThread(PassOwnPtr<WorkerThreadStartupData>);
void prepareForShutdownOnWorkerThread();
void performShutdownOnWorkerThread();
@@ -136,11 +163,16 @@ private:
void runDebuggerTaskOnWorkerThread(std::unique_ptr<CrossThreadClosure>);
void runDebuggerTaskDontWaitOnWorkerThread();
+ void setForceTerminationDelayInMsForTesting(long long forceTerminationDelayInMs) { m_forceTerminationDelayInMs = forceTerminationDelayInMs; }
+
bool m_started = false;
bool m_terminated = false;
bool m_readyToShutdown = false;
bool m_pausedInDebugger = false;
bool m_runningDebuggerTask = false;
+ ExitCode m_exitCode = ExitCode::NotTerminated;
+
+ long long m_forceTerminationDelayInMs;
OwnPtr<InspectorTaskRunner> m_inspectorTaskRunner;
OwnPtr<WorkerMicrotaskRunner> m_microtaskRunner;
@@ -149,7 +181,8 @@ private:
WorkerReportingProxy& m_workerReportingProxy;
// This lock protects |m_workerGlobalScope|, |m_terminated|,
- // |m_readyToShutdown|, |m_runningDebuggerTask| and |m_microtaskRunner|.
+ // |m_readyToShutdown|, |m_runningDebuggerTask|, |m_exitCode| and
+ // |m_microtaskRunner|.
Mutex m_threadStateMutex;
Persistent<WorkerGlobalScope> m_workerGlobalScope;
@@ -159,6 +192,10 @@ private:
// Signaled when the thread completes termination on the worker thread.
OwnPtr<WaitableEvent> m_shutdownEvent;
+
+ // Scheduled when termination starts with TerminationMode::Force, and
+ // cancelled when the worker thread is gracefully shut down.
+ OwnPtr<ForceTerminationTask> m_scheduledForceTerminationTask;
};
} // namespace blink
« no previous file with comments | « no previous file | third_party/WebKit/Source/core/workers/WorkerThread.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698