| // Copyright 2017 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/libplatform/default-worker-threads-task-runner.h" |
| |
| #include "src/libplatform/delayed-task-queue.h" |
| |
| namespace v8 { |
| namespace platform { |
| |
| DefaultWorkerThreadsTaskRunner::DefaultWorkerThreadsTaskRunner( |
| uint32_t thread_pool_size, TimeFunction time_function) |
| : queue_(time_function), time_function_(time_function) { |
| for (uint32_t i = 0; i < thread_pool_size; ++i) { |
| thread_pool_.push_back(std::make_unique<WorkerThread>(this)); |
| } |
| } |
| |
| DefaultWorkerThreadsTaskRunner::~DefaultWorkerThreadsTaskRunner() = default; |
| |
| double DefaultWorkerThreadsTaskRunner::MonotonicallyIncreasingTime() { |
| return time_function_(); |
| } |
| |
| void DefaultWorkerThreadsTaskRunner::Terminate() { |
| base::MutexGuard guard(&lock_); |
| terminated_ = true; |
| queue_.Terminate(); |
| // Clearing the thread pool lets all worker threads join. |
| thread_pool_.clear(); |
| } |
| |
| void DefaultWorkerThreadsTaskRunner::PostTask(std::unique_ptr<Task> task) { |
| base::MutexGuard guard(&lock_); |
| if (terminated_) return; |
| queue_.Append(std::move(task)); |
| } |
| |
| void DefaultWorkerThreadsTaskRunner::PostDelayedTask(std::unique_ptr<Task> task, |
| double delay_in_seconds) { |
| base::MutexGuard guard(&lock_); |
| if (terminated_) return; |
| queue_.AppendDelayed(std::move(task), delay_in_seconds); |
| } |
| |
| void DefaultWorkerThreadsTaskRunner::PostIdleTask( |
| std::unique_ptr<IdleTask> task) { |
| // There are no idle worker tasks. |
| UNREACHABLE(); |
| } |
| |
| bool DefaultWorkerThreadsTaskRunner::IdleTasksEnabled() { |
| // There are no idle worker tasks. |
| return false; |
| } |
| |
| std::unique_ptr<Task> DefaultWorkerThreadsTaskRunner::GetNext() { |
| return queue_.GetNext(); |
| } |
| |
| DefaultWorkerThreadsTaskRunner::WorkerThread::WorkerThread( |
| DefaultWorkerThreadsTaskRunner* runner) |
| : Thread(Options("V8 DefaultWorkerThreadsTaskRunner WorkerThread")), |
| runner_(runner) { |
| CHECK(Start()); |
| } |
| |
| DefaultWorkerThreadsTaskRunner::WorkerThread::~WorkerThread() { Join(); } |
| |
| void DefaultWorkerThreadsTaskRunner::WorkerThread::Run() { |
| while (std::unique_ptr<Task> task = runner_->GetNext()) { |
| task->Run(); |
| } |
| } |
| |
| } // namespace platform |
| } // namespace v8 |