| // Copyright 2020 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. |
| |
| #ifndef INCLUDE_CPPGC_DEFAULT_PLATFORM_H_ |
| #define INCLUDE_CPPGC_DEFAULT_PLATFORM_H_ |
| |
| #include <memory> |
| #include <thread> // NOLINT(build/c++11) |
| #include <vector> |
| |
| #include "cppgc/platform.h" |
| #include "v8config.h" // NOLINT(build/include_directory) |
| |
| namespace cppgc { |
| |
| /** |
| * Default task runner implementation. Keep posted tasks in a list that can be |
| * processed by calling RunSingleTask() or RunUntilIdle(). |
| */ |
| class V8_EXPORT DefaultTaskRunner final : public cppgc::TaskRunner { |
| public: |
| DefaultTaskRunner() = default; |
| |
| DefaultTaskRunner(const DefaultTaskRunner&) = delete; |
| DefaultTaskRunner& operator=(const DefaultTaskRunner&) = delete; |
| |
| void PostTask(std::unique_ptr<cppgc::Task> task) override; |
| void PostNonNestableTask(std::unique_ptr<cppgc::Task> task) override; |
| void PostDelayedTask(std::unique_ptr<cppgc::Task> task, double) override; |
| void PostNonNestableDelayedTask(std::unique_ptr<cppgc::Task> task, |
| double) override; |
| |
| void PostIdleTask(std::unique_ptr<cppgc::IdleTask> task) override; |
| bool IdleTasksEnabled() override { return true; } |
| |
| bool RunSingleTask(); |
| bool RunSingleIdleTask(double duration_in_seconds); |
| |
| void RunUntilIdle(); |
| |
| private: |
| std::vector<std::unique_ptr<cppgc::Task>> tasks_; |
| std::vector<std::unique_ptr<cppgc::IdleTask>> idle_tasks_; |
| }; |
| |
| /** |
| * Default platform implementation that uses std::thread for spawning job tasks. |
| */ |
| class V8_EXPORT DefaultPlatform final : public Platform { |
| public: |
| DefaultPlatform(); |
| ~DefaultPlatform() noexcept override; |
| |
| cppgc::PageAllocator* GetPageAllocator() final; |
| |
| double MonotonicallyIncreasingTime() final; |
| |
| std::shared_ptr<cppgc::TaskRunner> GetForegroundTaskRunner() final; |
| |
| std::unique_ptr<cppgc::JobHandle> PostJob( |
| cppgc::TaskPriority priority, |
| std::unique_ptr<cppgc::JobTask> job_task) final; |
| |
| void WaitAllForegroundTasks(); |
| void WaitAllBackgroundTasks(); |
| |
| private: |
| std::unique_ptr<PageAllocator> page_allocator_; |
| std::shared_ptr<DefaultTaskRunner> foreground_task_runner_; |
| std::vector<std::shared_ptr<std::thread>> job_threads_; |
| }; |
| |
| } // namespace cppgc |
| |
| #endif // INCLUDE_CPPGC_DEFAULT_PLATFORM_H_ |