1902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com// Copyright 2013 the V8 project authors. All rights reserved.
2902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com// Use of this source code is governed by a BSD-style license that can be
3902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com// found in the LICENSE file.
4902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
5902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#ifndef V8_LIBPLATFORM_TASK_QUEUE_H_
6902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#define V8_LIBPLATFORM_TASK_QUEUE_H_
7902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
8902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include <queue>
9902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
10902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "src/base/macros.h"
11902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "src/base/platform/mutex.h"
12902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "src/base/platform/semaphore.h"
13902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
14902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comnamespace v8 {
15902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
168a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.comclass Task;
1797cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com
18902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comnamespace platform {
1932bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com
2032bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.comclass TaskQueue {
2186681b37bd20204e47a492119b345c01d00bc939fmalita@google.com public:
22902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  TaskQueue();
2380a4a60f96c33ccd850f9b0eb4b69ab08c198196chudy@google.com  ~TaskQueue();
24f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com
25902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  // Appends a task to the queue. The queue takes ownership of |task|.
26768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org  void Append(Task* task);
27768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org
28768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org  // Returns the next task to process. Blocks if no task is available. Returns
2957f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org  // NULL if the queue is terminated.
30902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  Task* GetNext();
31902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
32f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com  // Terminate the queue.
33f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com  void Terminate();
34f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com
3557f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org private:
3657f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org  base::Mutex lock_;
3757f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org  base::Semaphore process_queue_semaphore_;
3857f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org  std::queue<Task*> task_queue_;
3957f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org  bool terminated_;
4057f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org
41f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com  DISALLOW_COPY_AND_ASSIGN(TaskQueue);
42f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com};
4332bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com
4432bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com} }  // namespace v8::platform
45f84ad8f7fc0194389a8099da2c5e8fff9f092890skia.committer@gmail.com
4632bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com
4732bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com#endif  // V8_LIBPLATFORM_TASK_QUEUE_H_
48902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com