blob: 0a630ed3c394aff140f75e8ec10b660b6538ccd1 [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// 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
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000056} // namespace platform
57} // namespace v8