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,115 @@ |
| +// 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_; } |
|
Ivan Posva
2012/03/15 00:27:34
I missed this in the first go around. Please do no
|
| + 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: |
| + friend class ThreadPoolTestPeer; |
| + |
| + class Worker { |
| + public: |
| + explicit Worker(ThreadPool* pool); |
| + |
| + // Sets a task on the worker. |
| + void SetTask(Task* task); |
| + |
| + // Starts the thread for the worker. This should only be called |
| + // after a task has been set by the initial call to SetTask(). |
| + void StartThread(); |
| + |
| + // 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); |
| + |
| + bool IsDone() const { return pool_ == NULL; } |
| + |
| + // Fields owned by Worker. |
| + Monitor monitor_; |
| + ThreadPool* pool_; |
| + Task* task_; |
| + |
| + // 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_; |
| + |
| + static Monitor* exit_monitor_; // Used only in testing. |
| + static int* exit_count_; // Used only in testing. |
| + |
| + DISALLOW_COPY_AND_ASSIGN(ThreadPool); |
| +}; |
| + |
| +} // namespace dart |
| + |
| +#endif // VM_THREAD_POOL_H_ |