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 "include/v8-platform.h"
      8 #include "src/base/logging.h"
      9 #include "src/base/platform/platform.h"
     10 #include "src/base/platform/time.h"
     11 
     12 namespace v8 {
     13 namespace platform {
     14 
     15 TaskQueue::TaskQueue() : process_queue_semaphore_(0), terminated_(false) {}
     16 
     17 
     18 TaskQueue::~TaskQueue() {
     19   base::LockGuard<base::Mutex> guard(&lock_);
     20   DCHECK(terminated_);
     21   DCHECK(task_queue_.empty());
     22 }
     23 
     24 void TaskQueue::Append(std::unique_ptr<Task> task) {
     25   base::LockGuard<base::Mutex> guard(&lock_);
     26   DCHECK(!terminated_);
     27   task_queue_.push(std::move(task));
     28   process_queue_semaphore_.Signal();
     29 }
     30 
     31 std::unique_ptr<Task> TaskQueue::GetNext() {
     32   for (;;) {
     33     {
     34       base::LockGuard<base::Mutex> guard(&lock_);
     35       if (!task_queue_.empty()) {
     36         std::unique_ptr<Task> result = std::move(task_queue_.front());
     37         task_queue_.pop();
     38         return result;
     39       }
     40       if (terminated_) {
     41         process_queue_semaphore_.Signal();
     42         return nullptr;
     43       }
     44     }
     45     process_queue_semaphore_.Wait();
     46   }
     47 }
     48 
     49 
     50 void TaskQueue::Terminate() {
     51   base::LockGuard<base::Mutex> guard(&lock_);
     52   DCHECK(!terminated_);
     53   terminated_ = true;
     54   process_queue_semaphore_.Signal();
     55 }
     56 
     57 void TaskQueue::BlockUntilQueueEmptyForTesting() {
     58   for (;;) {
     59     {
     60       base::LockGuard<base::Mutex> guard(&lock_);
     61       if (task_queue_.empty()) return;
     62     }
     63     base::OS::Sleep(base::TimeDelta::FromMilliseconds(5));
     64   }
     65 }
     66 
     67 }  // namespace platform
     68 }  // namespace v8
     69