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()12TaskQueue::TaskQueue() : process_queue_semaphore_(0), terminated_(false) {} 13 14 ~TaskQueue()15TaskQueue::~TaskQueue() { 16 base::LockGuard<base::Mutex> guard(&lock_); 17 DCHECK(terminated_); 18 DCHECK(task_queue_.empty()); 19 } 20 21 Append(Task * task)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 GetNext()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 Terminate()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