Ben Murdoch | b8a8cc1 | 2014-11-26 15:28:44 +0000 | [diff] [blame] | 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 | |
| 12 | TaskQueue::TaskQueue() : process_queue_semaphore_(0), terminated_(false) {} |
| 13 | |
| 14 | |
| 15 | TaskQueue::~TaskQueue() { |
| 16 | base::LockGuard<base::Mutex> guard(&lock_); |
| 17 | DCHECK(terminated_); |
| 18 | DCHECK(task_queue_.empty()); |
| 19 | } |
| 20 | |
| 21 | |
| 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 | |
| 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 | |
| 49 | void TaskQueue::Terminate() { |
| 50 | base::LockGuard<base::Mutex> guard(&lock_); |
| 51 | DCHECK(!terminated_); |
| 52 | terminated_ = true; |
| 53 | process_queue_semaphore_.Signal(); |
| 54 | } |
| 55 | |
Ben Murdoch | 4a90d5f | 2016-03-22 12:00:34 +0000 | [diff] [blame] | 56 | } // namespace platform |
| 57 | } // namespace v8 |