5 #include "src/libplatform/default-foreground-task-runner.h" 7 #include "src/base/platform/mutex.h" 8 #include "src/libplatform/default-platform.h" 13 DefaultForegroundTaskRunner::DefaultForegroundTaskRunner(
14 IdleTaskSupport idle_task_support, TimeFunction time_function)
15 : idle_task_support_(idle_task_support), time_function_(time_function) {}
17 void DefaultForegroundTaskRunner::Terminate() {
18 base::MutexGuard guard(&lock_);
22 while (!task_queue_.empty()) task_queue_.pop();
23 while (!delayed_task_queue_.empty()) delayed_task_queue_.pop();
24 while (!idle_task_queue_.empty()) idle_task_queue_.pop();
27 void DefaultForegroundTaskRunner::PostTaskLocked(std::unique_ptr<Task> task,
28 const base::MutexGuard&) {
29 if (terminated_)
return;
30 task_queue_.push(std::move(task));
31 event_loop_control_.NotifyOne();
34 void DefaultForegroundTaskRunner::PostTask(std::unique_ptr<Task> task) {
35 base::MutexGuard guard(&lock_);
36 PostTaskLocked(std::move(task), guard);
39 double DefaultForegroundTaskRunner::MonotonicallyIncreasingTime() {
40 return time_function_();
43 void DefaultForegroundTaskRunner::PostDelayedTask(std::unique_ptr<Task> task,
44 double delay_in_seconds) {
45 DCHECK_GE(delay_in_seconds, 0.0);
46 base::MutexGuard guard(&lock_);
47 if (terminated_)
return;
48 double deadline = MonotonicallyIncreasingTime() + delay_in_seconds;
49 delayed_task_queue_.push(std::make_pair(deadline, std::move(task)));
52 void DefaultForegroundTaskRunner::PostIdleTask(std::unique_ptr<IdleTask> task) {
53 CHECK_EQ(IdleTaskSupport::kEnabled, idle_task_support_);
54 base::MutexGuard guard(&lock_);
55 if (terminated_)
return;
56 idle_task_queue_.push(std::move(task));
59 bool DefaultForegroundTaskRunner::IdleTasksEnabled() {
60 return idle_task_support_ == IdleTaskSupport::kEnabled;
63 std::unique_ptr<Task> DefaultForegroundTaskRunner::PopTaskFromQueue(
64 MessageLoopBehavior wait_for_work) {
65 base::MutexGuard guard(&lock_);
67 std::unique_ptr<Task> task = PopTaskFromDelayedQueueLocked(guard);
69 PostTaskLocked(std::move(task), guard);
70 task = PopTaskFromDelayedQueueLocked(guard);
73 while (task_queue_.empty()) {
74 if (wait_for_work == MessageLoopBehavior::kDoNotWait)
return {};
75 WaitForTaskLocked(guard);
78 task = std::move(task_queue_.front());
85 DefaultForegroundTaskRunner::PopTaskFromDelayedQueueLocked(
86 const base::MutexGuard&) {
87 if (delayed_task_queue_.empty())
return {};
89 double now = MonotonicallyIncreasingTime();
90 const DelayedEntry& deadline_and_task = delayed_task_queue_.top();
91 if (deadline_and_task.first > now)
return {};
98 std::unique_ptr<Task> result =
99 std::move(const_cast<DelayedEntry&>(deadline_and_task).second);
100 delayed_task_queue_.pop();
104 std::unique_ptr<IdleTask> DefaultForegroundTaskRunner::PopTaskFromIdleQueue() {
105 base::MutexGuard guard(&lock_);
106 if (idle_task_queue_.empty())
return {};
108 std::unique_ptr<IdleTask> task = std::move(idle_task_queue_.front());
109 idle_task_queue_.pop();
114 void DefaultForegroundTaskRunner::WaitForTaskLocked(
const base::MutexGuard&) {
115 event_loop_control_.Wait(&lock_);