| 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 8966c10d921b29417784fb9969cec339b30ca480..93adb13be205ca7e64b9f5ce1f05983dda4d5168 100644
|
| --- a/third_party/WebKit/Source/core/workers/WorkerThread.cpp
|
| +++ b/third_party/WebKit/Source/core/workers/WorkerThread.cpp
|
| @@ -31,7 +31,6 @@
|
| #include "bindings/core/v8/Microtask.h"
|
| #include "bindings/core/v8/ScriptSourceCode.h"
|
| #include "bindings/core/v8/WorkerOrWorkletScriptController.h"
|
| -#include "core/dom/TaskRunnerHelper.h"
|
| #include "core/inspector/ConsoleMessageStorage.h"
|
| #include "core/inspector/InspectorTaskRunner.h"
|
| #include "core/inspector/WorkerInspectorController.h"
|
| @@ -50,8 +49,6 @@
|
| #include "platform/WebThreadSupportingGC.h"
|
| #include "platform/heap/SafePoint.h"
|
| #include "platform/heap/ThreadState.h"
|
| -#include "platform/scheduler/child/webthread_impl_for_worker_scheduler.h"
|
| -#include "platform/scheduler/child/worker_global_scope_scheduler.h"
|
| #include "platform/weborigin/KURL.h"
|
| #include "platform/wtf/Functional.h"
|
| #include "platform/wtf/Noncopyable.h"
|
| @@ -110,22 +107,12 @@
|
| void WorkerThread::Start(std::unique_ptr<WorkerThreadStartupData> startup_data,
|
| ParentFrameTaskRunners* parent_frame_task_runners) {
|
| DCHECK(IsMainThread());
|
| +
|
| if (requested_to_start_)
|
| return;
|
|
|
| requested_to_start_ = true;
|
| parent_frame_task_runners_ = parent_frame_task_runners;
|
| -
|
| - // Synchronously initialize the per-global-scope scheduler to prevent someone
|
| - // from posting a task to the thread before the scheduler is ready.
|
| - WaitableEvent waitable_event;
|
| - GetWorkerBackingThread().BackingThread().PostTask(
|
| - BLINK_FROM_HERE,
|
| - CrossThreadBind(&WorkerThread::InitializeSchedulerOnWorkerThread,
|
| - CrossThreadUnretained(this),
|
| - CrossThreadUnretained(&waitable_event)));
|
| - waitable_event.Wait();
|
| -
|
| GetWorkerBackingThread().BackingThread().PostTask(
|
| BLINK_FROM_HERE, CrossThreadBind(&WorkerThread::InitializeOnWorkerThread,
|
| CrossThreadUnretained(this),
|
| @@ -203,10 +190,33 @@
|
| return GetWorkerBackingThread().BackingThread().IsCurrentThread();
|
| }
|
|
|
| +void WorkerThread::PostTask(const WebTraceLocation& location,
|
| + std::unique_ptr<WTF::Closure> task) {
|
| + DCHECK(IsCurrentThread());
|
| + if (IsInShutdown())
|
| + return;
|
| + GetWorkerBackingThread().BackingThread().PostTask(
|
| + location,
|
| + WTF::Bind(
|
| + &WorkerThread::PerformTaskOnWorkerThread<WTF::kSameThreadAffinity>,
|
| + WTF::Unretained(this), WTF::Passed(std::move(task))));
|
| +}
|
| +
|
| +void WorkerThread::PostTask(const WebTraceLocation& location,
|
| + std::unique_ptr<WTF::CrossThreadClosure> task) {
|
| + if (IsInShutdown())
|
| + return;
|
| + GetWorkerBackingThread().BackingThread().PostTask(
|
| + location,
|
| + CrossThreadBind(
|
| + &WorkerThread::PerformTaskOnWorkerThread<WTF::kCrossThreadAffinity>,
|
| + CrossThreadUnretained(this), WTF::Passed(std::move(task))));
|
| +}
|
| +
|
| void WorkerThread::AppendDebuggerTask(
|
| std::unique_ptr<CrossThreadClosure> task) {
|
| DCHECK(IsMainThread());
|
| - if (requested_to_terminate_)
|
| + if (IsInShutdown())
|
| return;
|
| inspector_task_runner_->AppendTask(CrossThreadBind(
|
| &WorkerThread::PerformDebuggerTaskOnWorkerThread,
|
| @@ -216,11 +226,10 @@
|
| if (GetIsolate() && thread_state_ != ThreadState::kReadyToShutdown)
|
| inspector_task_runner_->InterruptAndRunAllTasksDontWait(GetIsolate());
|
| }
|
| - TaskRunnerHelper::Get(TaskType::kUnthrottled, this)
|
| - ->PostTask(BLINK_FROM_HERE,
|
| - CrossThreadBind(
|
| - &WorkerThread::PerformDebuggerTaskDontWaitOnWorkerThread,
|
| - CrossThreadUnretained(this)));
|
| + GetWorkerBackingThread().BackingThread().PostTask(
|
| + BLINK_FROM_HERE,
|
| + CrossThreadBind(&WorkerThread::PerformDebuggerTaskDontWaitOnWorkerThread,
|
| + CrossThreadUnretained(this)));
|
| }
|
|
|
| void WorkerThread::StartRunningDebuggerTasksOnPauseOnWorkerThread() {
|
| @@ -421,17 +430,16 @@
|
| forcible_termination_task_handle_.Cancel();
|
| }
|
|
|
| -void WorkerThread::InitializeSchedulerOnWorkerThread(
|
| - WaitableEvent* waitable_event) {
|
| - DCHECK(IsCurrentThread());
|
| - DCHECK(!global_scope_scheduler_);
|
| - scheduler::WebThreadImplForWorkerScheduler& web_thread_for_worker =
|
| - static_cast<scheduler::WebThreadImplForWorkerScheduler&>(
|
| - GetWorkerBackingThread().BackingThread().PlatformThread());
|
| - global_scope_scheduler_ =
|
| - WTF::MakeUnique<scheduler::WorkerGlobalScopeScheduler>(
|
| - web_thread_for_worker.GetWorkerScheduler());
|
| - waitable_event->Signal();
|
| +bool WorkerThread::IsInShutdown() {
|
| + // Check if we've started termination or shutdown sequence. Avoid acquiring
|
| + // a lock here to avoid introducing a risk of deadlock. Note that accessing
|
| + // |m_requestedToTerminate| on the main thread or |m_threadState| on the
|
| + // worker thread is safe as the flag is set only on the thread.
|
| + if (IsMainThread() && requested_to_terminate_)
|
| + return true;
|
| + if (IsCurrentThread() && thread_state_ == ThreadState::kReadyToShutdown)
|
| + return true;
|
| + return false;
|
| }
|
|
|
| void WorkerThread::InitializeOnWorkerThread(
|
| @@ -528,7 +536,6 @@
|
| worker_inspector_controller_.Clear();
|
| }
|
| GlobalScope()->Dispose();
|
| - global_scope_scheduler_->Dispose();
|
| console_message_storage_.Clear();
|
| GetWorkerBackingThread().BackingThread().RemoveTaskObserver(this);
|
| }
|
| @@ -555,6 +562,22 @@
|
| GetWorkerReportingProxy().DidTerminateWorkerThread();
|
|
|
| shutdown_event_->Signal();
|
| +}
|
| +
|
| +template <WTF::FunctionThreadAffinity threadAffinity>
|
| +void WorkerThread::PerformTaskOnWorkerThread(
|
| + std::unique_ptr<Function<void(), threadAffinity>> task) {
|
| + DCHECK(IsCurrentThread());
|
| + if (thread_state_ != ThreadState::kRunning)
|
| + return;
|
| +
|
| + {
|
| + DEFINE_THREAD_SAFE_STATIC_LOCAL(
|
| + CustomCountHistogram, scoped_us_counter,
|
| + new CustomCountHistogram("WorkerThread.Task.Time", 0, 10000000, 50));
|
| + ScopedUsHistogramTimer timer(scoped_us_counter);
|
| + (*task)();
|
| + }
|
| }
|
|
|
| void WorkerThread::PerformDebuggerTaskOnWorkerThread(
|
|
|