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#ifndef V8_LIBPLATFORM_TASK_QUEUE_H_ 6#define V8_LIBPLATFORM_TASK_QUEUE_H_ 7 8#include <memory> 9#include <queue> 10 11#include "include/libplatform/libplatform-export.h" 12#include "src/base/macros.h" 13#include "src/base/platform/mutex.h" 14#include "src/base/platform/semaphore.h" 15#include "testing/gtest/include/gtest/gtest_prod.h" // nogncheck 16 17namespace v8 { 18 19class Task; 20 21namespace platform { 22 23class V8_PLATFORM_EXPORT TaskQueue { 24 public: 25 TaskQueue(); 26 ~TaskQueue(); 27 28 TaskQueue(const TaskQueue&) = delete; 29 TaskQueue& operator=(const TaskQueue&) = delete; 30 31 // Appends a task to the queue. The queue takes ownership of |task|. 32 void Append(std::unique_ptr<Task> task); 33 34 // Returns the next task to process. Blocks if no task is available. Returns 35 // nullptr if the queue is terminated. 36 std::unique_ptr<Task> GetNext(); 37 38 // Terminate the queue. 39 void Terminate(); 40 41 private: 42 FRIEND_TEST(WorkerThreadTest, PostSingleTask); 43 44 void BlockUntilQueueEmptyForTesting(); 45 46 base::Semaphore process_queue_semaphore_; 47 base::Mutex lock_; 48 std::queue<std::unique_ptr<Task>> task_queue_; 49 bool terminated_; 50}; 51 52} // namespace platform 53} // namespace v8 54 55 56#endif // V8_LIBPLATFORM_TASK_QUEUE_H_ 57