mirror of
https://github.com/dart-lang/sdk
synced 2024-09-19 21:01:50 +00:00
c7e9e048ed
It's a collection of static utility methods for primitive operations on OS threads. Make room in the namespace for upcoming class that will represent all the complex state of a VM thread. Review URL: https://codereview.chromium.org//796063006 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@42895 260f80e4-7a28-3924-810f-c04153c831b5
117 lines
2.8 KiB
C++
117 lines
2.8 KiB
C++
// 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/globals.h"
|
|
#include "vm/os_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_
|