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 TaskQueue()15TaskQueue::TaskQueue() : process_queue_semaphore_(0), terminated_(false) {} 16 17 ~TaskQueue()18TaskQueue::~TaskQueue() { 19 base::LockGuard<base::Mutex> guard(&lock_); 20 DCHECK(terminated_); 21 DCHECK(task_queue_.empty()); 22 } 23 Append(std::unique_ptr<Task> task)24void 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 GetNext()31std::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 Terminate()50void TaskQueue::Terminate() { 51 base::LockGuard<base::Mutex> guard(&lock_); 52 DCHECK(!terminated_); 53 terminated_ = true; 54 process_queue_semaphore_.Signal(); 55 } 56 BlockUntilQueueEmptyForTesting()57void 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