• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
TaskQueue()15 TaskQueue::TaskQueue() : process_queue_semaphore_(0), terminated_(false) {}
16 
17 
~TaskQueue()18 TaskQueue::~TaskQueue() {
19   base::LockGuard<base::Mutex> guard(&lock_);
20   DCHECK(terminated_);
21   DCHECK(task_queue_.empty());
22 }
23 
Append(std::unique_ptr<Task> task)24 void TaskQueue::Append(std::unique_ptr<Task> task) {
25   base::LockGuard<base::Mutex> guard(&lock_);
26   DCHECK(!terminated_);
27   task_queue_.push(std::move(task));
28   process_queue_semaphore_.Signal();
29 }
30 
GetNext()31 std::unique_ptr<Task> TaskQueue::GetNext() {
32   for (;;) {
33     {
34       base::LockGuard<base::Mutex> 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 
Terminate()50 void TaskQueue::Terminate() {
51   base::LockGuard<base::Mutex> guard(&lock_);
52   DCHECK(!terminated_);
53   terminated_ = true;
54   process_queue_semaphore_.Signal();
55 }
56 
BlockUntilQueueEmptyForTesting()57 void TaskQueue::BlockUntilQueueEmptyForTesting() {
58   for (;;) {
59     {
60       base::LockGuard<base::Mutex> 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
69