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 "src/base/logging.h"
8 
9 namespace v8 {
10 namespace platform {
11 
TaskQueue()12 TaskQueue::TaskQueue() : process_queue_semaphore_(0), terminated_(false) {}
13 
14 
~TaskQueue()15 TaskQueue::~TaskQueue() {
16   base::LockGuard<base::Mutex> guard(&lock_);
17   DCHECK(terminated_);
18   DCHECK(task_queue_.empty());
19 }
20 
21 
Append(Task * task)22 void TaskQueue::Append(Task* task) {
23   base::LockGuard<base::Mutex> guard(&lock_);
24   DCHECK(!terminated_);
25   task_queue_.push(task);
26   process_queue_semaphore_.Signal();
27 }
28 
29 
GetNext()30 Task* TaskQueue::GetNext() {
31   for (;;) {
32     {
33       base::LockGuard<base::Mutex> guard(&lock_);
34       if (!task_queue_.empty()) {
35         Task* result = task_queue_.front();
36         task_queue_.pop();
37         return result;
38       }
39       if (terminated_) {
40         process_queue_semaphore_.Signal();
41         return NULL;
42       }
43     }
44     process_queue_semaphore_.Wait();
45   }
46 }
47 
48 
Terminate()49 void TaskQueue::Terminate() {
50   base::LockGuard<base::Mutex> guard(&lock_);
51   DCHECK(!terminated_);
52   terminated_ = true;
53   process_queue_semaphore_.Signal();
54 }
55 
56 } }  // namespace v8::platform
57