Chromium Code Reviews| Index: runtime/vm/thread_pool.h |
| =================================================================== |
| --- runtime/vm/thread_pool.h (revision 0) |
| +++ runtime/vm/thread_pool.h (revision 0) |
| @@ -0,0 +1,108 @@ |
| +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| +// for details. All rights reserved. Use of this source code is governed by a |
| +// BSD-style license that can be found in the LICENSE file. |
| + |
| +#ifndef VM_THREAD_POOL_H_ |
| +#define VM_THREAD_POOL_H_ |
| + |
| +#include "vm/thread.h" |
| + |
| +namespace dart { |
| + |
| +class ThreadPool { |
| + public: |
| + // Subclasses of Task are able to run on a ThreadPool. |
| + class Task { |
| + protected: |
| + Task(); |
| + |
| + public: |
| + virtual ~Task(); |
| + |
| + // Override this to provide task-specific behavior. |
| + virtual void Run() = 0; |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(Task); |
| + }; |
| + |
| + ThreadPool(); |
| + |
| + // Shuts down this thread pool. Causes workers to terminate |
| + // themselves when they are active again. |
| + ~ThreadPool(); |
| + |
| + // Runs a task on the thread pool. |
| + void Run(Task* task); |
| + |
| + // Some simple stats. |
| + uint64_t workers_running() const { return count_running_; } |
| + uint64_t workers_idle() const { return count_idle_; } |
| + uint64_t workers_started() const { return count_started_; } |
| + uint64_t workers_stopped() const { return count_stopped_; } |
| + |
| + private: |
| + class Worker { |
| + public: |
| + explicit Worker(ThreadPool* pool); |
| + |
| + // Starts the thread for the worker. Call Run() first. |
|
Ivan Posva
2012/03/14 18:51:26
This comment "Call Run() first." is unclear.
turnidge
2012/03/14 21:00:27
Done.
|
| + void StartThread(); |
| + |
| + // Runs a task on the worker. |
| + void Run(Task* task); |
|
Ivan Posva
2012/03/14 18:51:26
Maybe SetTask(task)?
turnidge
2012/03/14 21:00:27
Done.
|
| + |
| + // Main loop for a worker. |
| + void Loop(); |
| + |
| + // Causes worker to terminate eventually. |
| + void Shutdown(); |
| + |
| + private: |
| + friend class ThreadPool; |
| + |
| + // The main entry point for new worker threads. |
| + static void Main(uword args); |
| + |
| + // Fields owned by Worker. |
| + Monitor monitor_; |
| + ThreadPool* pool_; |
| + Task* task_; |
| + bool done_; |
| + |
| + // Fields owned by ThreadPool. Workers should not look at these |
| + // directly. It's like looking at the sun. |
| + bool owned_; // Protected by ThreadPool::mutex_ |
| + Worker* idle_next_; // Protected by ThreadPool::mutex_ |
| + Worker* all_next_; // Protected by ThreadPool::mutex_ |
| + |
| + DISALLOW_COPY_AND_ASSIGN(Worker); |
| + }; |
| + |
| + void Shutdown(); |
| + |
| + // Expensive. Use only in assertions. |
| + bool IsIdle(Worker* worker); |
| + |
| + bool RemoveWorkerFromIdleList(Worker* worker); |
| + bool RemoveWorkerFromAllList(Worker* worker); |
| + |
| + // Worker operations. |
| + void SetIdle(Worker* worker); |
| + bool ReleaseIdleWorker(Worker* worker); |
| + |
| + Mutex mutex_; |
| + bool shutting_down_; |
| + Worker* all_workers_; |
| + Worker* idle_workers_; |
| + uint64_t count_started_; |
| + uint64_t count_stopped_; |
| + uint64_t count_running_; |
| + uint64_t count_idle_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(ThreadPool); |
| +}; |
| + |
| +} // namespace dart |
| + |
| +#endif // VM_THREAD_POOL_H_ |