v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
delayed-task-queue.cc
Go to the documentation of this file.
1// Copyright 2019 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
6
8#include "src/base/logging.h"
10
11namespace v8 {
12namespace platform {
13
15 : time_function_(time_function) {}
16
21
25
26void DelayedTaskQueue::Append(std::unique_ptr<Task> task) {
28 task_queue_.push(std::move(task));
29}
30
31void DelayedTaskQueue::AppendDelayed(std::unique_ptr<Task> task,
32 double delay_in_seconds) {
33 DCHECK_GE(delay_in_seconds, 0.0);
34 double deadline = MonotonicallyIncreasingTime() + delay_in_seconds;
35 {
37 delayed_task_queue_.emplace(deadline, std::move(task));
38 }
39}
40
42 for (;;) {
43 // Move delayed tasks that have hit their deadline to the main queue.
44 double now = MonotonicallyIncreasingTime();
45 for (;;) {
46 std::unique_ptr<Task> task = PopTaskFromDelayedQueue(now);
47 if (!task) break;
48 task_queue_.push(std::move(task));
49 }
50 if (!task_queue_.empty()) {
51 std::unique_ptr<Task> task = std::move(task_queue_.front());
52 task_queue_.pop();
53 return {MaybeNextTask::kTask, std::move(task), {}};
54 }
55
56 if (terminated_) {
57 return {MaybeNextTask::kTerminated, {}, {}};
58 }
59
60 if (task_queue_.empty() && !delayed_task_queue_.empty()) {
61 // Wait for the next delayed task or a newly posted task.
62 double wait_in_seconds = delayed_task_queue_.begin()->first - now;
63 return {
65 {},
68 } else {
69 return {MaybeNextTask::kWaitIndefinite, {}, {}};
70 }
71 }
72}
73
74// Gets the next task from the delayed queue for which the deadline has passed
75// according to |now|. Returns nullptr if no such task exists.
76std::unique_ptr<Task> DelayedTaskQueue::PopTaskFromDelayedQueue(double now) {
77 if (delayed_task_queue_.empty()) return nullptr;
78
79 auto it = delayed_task_queue_.begin();
80 if (it->first > now) return nullptr;
81
82 std::unique_ptr<Task> result = std::move(it->second);
83 delayed_task_queue_.erase(it);
84 return result;
85}
86
91
92} // namespace platform
93} // namespace v8
static constexpr int64_t kMicrosecondsPerSecond
Definition time.h:49
static constexpr TimeDelta FromMicroseconds(int64_t microseconds)
Definition time.h:87
std::unique_ptr< Task > PopTaskFromDelayedQueue(double now)
DelayedTaskQueue(TimeFunction time_function)
void Append(std::unique_ptr< Task > task)
void AppendDelayed(std::unique_ptr< Task > task, double delay_in_seconds)
std::queue< std::unique_ptr< Task > > task_queue_
std::multimap< double, std::unique_ptr< Task > > delayed_task_queue_
ZoneVector< RpoNumber > & result
#define DCHECK_GE(v1, v2)
Definition logging.h:488
#define DCHECK(condition)
Definition logging.h:482