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 399a1278776ed1502b49a7cbc3bca76a7703a55f..36c0e069c0751ee45786a77e175666606f245497 100644 |
--- a/third_party/WebKit/Source/core/workers/WorkerThread.cpp |
+++ b/third_party/WebKit/Source/core/workers/WorkerThread.cpp |
@@ -30,7 +30,6 @@ |
#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/inspector/InspectorInstrumentation.h" |
#include "core/inspector/InspectorTaskRunner.h" |
#include "core/inspector/WorkerThreadDebugger.h" |
@@ -40,6 +39,7 @@ |
#include "core/workers/WorkerThreadStartupData.h" |
#include "platform/ThreadSafeFunctional.h" |
#include "platform/WaitableEvent.h" |
+#include "platform/WebThreadSupportingGC.h" |
#include "platform/heap/SafePoint.h" |
#include "platform/heap/ThreadState.h" |
#include "platform/weborigin/KURL.h" |
@@ -254,9 +254,13 @@ void WorkerThread::shutdown() |
void WorkerThread::performShutdownTask() |
{ |
- // The below assignment will destroy the context, which will in turn notify messaging proxy. |
- // We cannot let any objects survive past thread exit, because no other thread will run GC or otherwise destroy them. |
- // If Oilpan is enabled, we detach of the context/global scope, with the final heap cleanup below sweeping it out. |
+ DCHECK(isCurrentThread()); |
+ |
+ // The below assignment will destroy the context, which will in turn notify |
+ // messaging proxy. We cannot let any objects survive past thread exit, |
+ // because no other thread will run GC or otherwise destroy them. If Oilpan |
+ // is enabled, we detach of the context/global scope, with the final heap |
+ // cleanup below sweeping it out. |
m_workerGlobalScope->notifyContextDestroyed(); |
m_workerGlobalScope = nullptr; |
@@ -274,6 +278,8 @@ void WorkerThread::performShutdownTask() |
void WorkerThread::terminate() |
{ |
+ DCHECK(isMainThread()); |
+ |
// Prevent the deadlock between GC and an attempt to terminate a thread. |
SafePointScope safePointScope(BlinkGC::HeapPointersOnStack); |
terminateInternal(); |
@@ -281,6 +287,7 @@ void WorkerThread::terminate() |
void WorkerThread::terminateAndWait() |
{ |
+ DCHECK(isMainThread()); |
terminate(); |
m_terminationEvent->wait(); |
} |
@@ -301,7 +308,8 @@ void WorkerThread::terminateInternal() |
{ |
DCHECK(isMainThread()); |
- // Protect against this method, initialize() or termination via the global scope racing each other. |
+ // Protect against this method, initialize() or termination via the global |
+ // scope racing each other. |
MutexLocker lock(m_threadStateMutex); |
// If terminateInternal has already been called, just return. |
@@ -323,7 +331,9 @@ void WorkerThread::terminateInternal() |
if (!m_workerGlobalScope) |
return; |
- // 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. |
+ // 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(); |
if (workerBackingThread().workerScriptCount() == 1) { |
@@ -358,6 +368,8 @@ v8::Isolate* WorkerThread::isolate() |
void WorkerThread::terminateAndWaitForAllWorkers() |
{ |
+ DCHECK(isMainThread()); |
+ |
// Keep this lock to prevent WorkerThread instances from being destroyed. |
MutexLocker lock(threadSetMutex()); |
HashSet<WorkerThread*> threads = workerThreads(); |
@@ -380,6 +392,7 @@ void WorkerThread::postTask(const WebTraceLocation& location, PassOwnPtr<Executi |
void WorkerThread::runDebuggerTaskDontWait() |
{ |
+ DCHECK(isCurrentThread()); |
OwnPtr<CrossThreadClosure> task = m_inspectorTaskRunner->takeNextTask(InspectorTaskRunner::DontWaitForTask); |
if (task) |
(*task)(); |