Chromium Code Reviews| 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 09d432d27e07d2e84d786d659f64ba7650f45ca3..c735446fdf8da8e18e90434375acec4c42317a48 100644 |
| --- a/third_party/WebKit/Source/core/workers/WorkerThread.cpp |
| +++ b/third_party/WebKit/Source/core/workers/WorkerThread.cpp |
| @@ -143,36 +143,32 @@ void WorkerThread::terminate() |
| if (!m_workerGlobalScope) |
| return; |
| - if (!m_readyToShutdown) { |
| - // 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. |
| - // If |m_readyToShutdown| is set, the worker thread has already noticed |
| - // that the thread is about to be terminated and the worker global scope |
| - // is already disposed, so we don't have to explicitly terminate the |
| - // execution. |
| + // Determine if we should terminate the isolate so that the task can |
| + // be handled by thread event loop. If script execution weren't forbidden, |
| + // a while(1) loop in JS could keep the thread alive forever. |
| + // |
| + // (1) |m_readyToShutdown|: It this is set, the worker thread has already |
| + // noticed that the thread is about to be terminated and the worker global |
| + // scope is already disposed, so we don't have to explicitly terminate the |
| + // isolate. |
| + // |
| + // (2) |workerScriptCount() == 1|: If other WorkerGlobalScopes are running |
| + // on the worker thread, we should not terminate the isolate. 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|. |
| + // |
| + // (3) |m_runningDebuggerTask|: Terminating during debugger task may lead to |
| + // crash due to heavy use of v8 api in debugger. Any debugger task is |
| + // guaranteed to finish, so we can wait for the completion. |
| + bool shouldTerminateIsolate = !m_readyToShutdown && (workerBackingThread().workerScriptCount() == 1) && !m_runningDebuggerTask; |
| + |
| + if (shouldTerminateIsolate) { |
| + // TODO(yhirano): TerminateExecution should be called more |
| + // carefully (https://crbug.com/413518). |
| m_workerGlobalScope->scriptController()->willScheduleExecutionTermination(); |
| - |
| - // 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|. |
| - if (workerBackingThread().workerScriptCount() == 1) { |
| - if (m_runningDebuggerTask) { |
| - // Terminating during debugger task may lead to crash due to |
| - // heavy use of v8 api in debugger. Any debugger task is |
| - // guaranteed to finish, so we can postpone termination after |
| - // task has finished. |
| - // Note: m_runningDebuggerTask and m_shouldTerminateV8Execution |
| - // access must be guarded by the lock. |
| - m_shouldTerminateV8Execution = true; |
| - } else { |
| - // TODO(yhirano): TerminateExecution should be called more |
| - // carefully (https://crbug.com/413518). |
| - isolate()->TerminateExecution(); |
| - } |
| - } |
| + isolate()->TerminateExecution(); |
| } |
| m_inspectorTaskRunner->kill(); |
| @@ -448,10 +444,16 @@ void WorkerThread::runDebuggerTaskOnWorkerThread(std::unique_ptr<CrossThreadClos |
| { |
| MutexLocker lock(m_threadStateMutex); |
| m_runningDebuggerTask = false; |
| - if (m_shouldTerminateV8Execution) { |
| - m_shouldTerminateV8Execution = false; |
| - isolate()->TerminateExecution(); |
| - } |
| + |
| + if (!m_terminated) |
| + return; |
| + // terminate() was called. Shutdown sequence will start soon. |
| + |
| + if (m_readyToShutdown) |
| + return; |
| + // Disposes WorkerGlobalScope to stop associated ActiveDOMObjects and |
| + // close the event queue. |
| + prepareForShutdownOnWorkerThread(); |
|
yhirano
2016/05/26 07:57:38
m_threadStateMutex is not recursive, so you should
yhirano
2016/05/26 07:57:38
I'm not sure why this is needed, because we've alr
nhiroki
2016/05/26 08:13:52
Good point. Moved this to out of the critical sect
nhiroki
2016/05/26 08:13:52
Other tasks that may block the worker thread could
|
| } |
| } |