| // 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: |
| 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* all_next_; // Protected by ThreadPool::mutex_ |
| Worker* idle_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_ |