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
9namespace v8 {
10namespace platform {
11
12TaskQueue::TaskQueue() : process_queue_semaphore_(0), terminated_(false) {}
13
14
15TaskQueue::~TaskQueue() {
16  base::LockGuard<base::Mutex> guard(&lock_);
17  DCHECK(terminated_);
18  DCHECK(task_queue_.empty());
19}
20
21
22void 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
30Task* 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
49void 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