V8 API Reference, 7.2.502.16 (for Deno 0.2.4)
task-queue.cc
1 // Copyright 2013 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 
5 #include "src/libplatform/task-queue.h"
6 
7 #include "include/v8-platform.h"
8 #include "src/base/logging.h"
9 #include "src/base/platform/platform.h"
10 #include "src/base/platform/time.h"
11 
12 namespace v8 {
13 namespace platform {
14 
15 TaskQueue::TaskQueue() : process_queue_semaphore_(0), terminated_(false) {}
16 
17 
18 TaskQueue::~TaskQueue() {
19  base::MutexGuard guard(&lock_);
20  DCHECK(terminated_);
21  DCHECK(task_queue_.empty());
22 }
23 
24 void TaskQueue::Append(std::unique_ptr<Task> task) {
25  base::MutexGuard guard(&lock_);
26  DCHECK(!terminated_);
27  task_queue_.push(std::move(task));
28  process_queue_semaphore_.Signal();
29 }
30 
31 std::unique_ptr<Task> TaskQueue::GetNext() {
32  for (;;) {
33  {
34  base::MutexGuard guard(&lock_);
35  if (!task_queue_.empty()) {
36  std::unique_ptr<Task> result = std::move(task_queue_.front());
37  task_queue_.pop();
38  return result;
39  }
40  if (terminated_) {
41  process_queue_semaphore_.Signal();
42  return nullptr;
43  }
44  }
45  process_queue_semaphore_.Wait();
46  }
47 }
48 
49 
50 void TaskQueue::Terminate() {
51  base::MutexGuard guard(&lock_);
52  DCHECK(!terminated_);
53  terminated_ = true;
54  process_queue_semaphore_.Signal();
55 }
56 
57 void TaskQueue::BlockUntilQueueEmptyForTesting() {
58  for (;;) {
59  {
60  base::MutexGuard guard(&lock_);
61  if (task_queue_.empty()) return;
62  }
63  base::OS::Sleep(base::TimeDelta::FromMilliseconds(5));
64  }
65 }
66 
67 } // namespace platform
68 } // namespace v8
Definition: libplatform.h:13