Home | History | Annotate | Download | only in libplatform
      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 
     56 }  // namespace platform
     57 }  // namespace v8
     58