blob: 52bc75c2c8d1f45db973277edff53764bf954c47 [file] [log] [blame]
Mark Slee9f0c6512007-02-28 23:58:26 +00001// Copyright (c) 2006- Facebook
2// Distributed under the Thrift Software License
3//
4// See accompanying file LICENSE or visit the Thrift site at:
5// http://developers.facebook.com/thrift/
6
Mark Sleef5f2be42006-09-05 21:05:31 +00007#ifndef _THRIFT_CONCURRENCY_THREADMANAGER_H_
8#define _THRIFT_CONCURRENCY_THREADMANAGER_H_ 1
Marc Slemko66949872006-07-15 01:52:39 +00009
Marc Slemko6f038a72006-08-03 18:58:09 +000010#include <boost/shared_ptr.hpp>
Marc Slemko0e53ccd2006-07-17 23:51:05 +000011#include <sys/types.h>
Marc Slemko66949872006-07-15 01:52:39 +000012#include "Thread.h"
13
Marc Slemko66949872006-07-15 01:52:39 +000014namespace facebook { namespace thrift { namespace concurrency {
15
Marc Slemko6f038a72006-08-03 18:58:09 +000016using namespace boost;
17
Mark Sleef5f2be42006-09-05 21:05:31 +000018/**
19 * Thread Pool Manager and related classes
20 *
21 * @author marc
22 * @version $Id:$
23 */
Marc Slemko66949872006-07-15 01:52:39 +000024class ThreadManager;
25
Mark Sleef5f2be42006-09-05 21:05:31 +000026/**
27 * ThreadManager class
28 *
29 * This class manages a pool of threads. It uses a ThreadFactory to create
30 * threads. It never actually creates or destroys worker threads, rather
31 * It maintains statistics on number of idle threads, number of active threads,
32 * task backlog, and average wait and service times and informs the PoolPolicy
33 * object bound to instances of this manager of interesting transitions. It is
34 * then up the PoolPolicy object to decide if the thread pool size needs to be
35 * adjusted and call this object addWorker and removeWorker methods to make
36 * changes.
37 *
38 * This design allows different policy implementations to used this code to
39 * handle basic worker thread management and worker task execution and focus on
40 * policy issues. The simplest policy, StaticPolicy, does nothing other than
41 * create a fixed number of threads.
42 */
Marc Slemko66949872006-07-15 01:52:39 +000043class ThreadManager {
44
Mark Slee8cbda852007-02-01 23:05:38 +000045 protected:
Marc Slemkod466b212006-07-20 00:04:18 +000046 ThreadManager() {}
Marc Slemko66949872006-07-15 01:52:39 +000047
Mark Slee8cbda852007-02-01 23:05:38 +000048 public:
Marc Slemkod466b212006-07-20 00:04:18 +000049 virtual ~ThreadManager() {}
Marc Slemko66949872006-07-15 01:52:39 +000050
Mark Sleef5f2be42006-09-05 21:05:31 +000051 /**
52 * Starts the thread manager. Verifies all attributes have been properly
53 * initialized, then allocates necessary resources to begin operation
54 */
Marc Slemkofe5ba12e2006-07-20 21:16:27 +000055 virtual void start() = 0;
56
Mark Sleef5f2be42006-09-05 21:05:31 +000057 /**
58 * Stops the thread manager. Aborts all remaining unprocessed task, shuts
59 * down all created worker threads, and realeases all allocated resources.
60 * This method blocks for all worker threads to complete, thus it can
61 * potentially block forever if a worker thread is running a task that
62 * won't terminate.
63 */
Marc Slemkofe5ba12e2006-07-20 21:16:27 +000064 virtual void stop() = 0;
65
66 enum STATE {
67 UNINITIALIZED,
68 STARTING,
69 STARTED,
70 STOPPING,
71 STOPPED
72 };
73
74 virtual const STATE state() const = 0;
75
Marc Slemko6f038a72006-08-03 18:58:09 +000076 virtual shared_ptr<ThreadFactory> threadFactory() const = 0;
Marc Slemko66949872006-07-15 01:52:39 +000077
Marc Slemko6f038a72006-08-03 18:58:09 +000078 virtual void threadFactory(shared_ptr<ThreadFactory> value) = 0;
Marc Slemko66949872006-07-15 01:52:39 +000079
Marc Slemkod466b212006-07-20 00:04:18 +000080 virtual void addWorker(size_t value=1) = 0;
Marc Slemko66949872006-07-15 01:52:39 +000081
Marc Slemkod466b212006-07-20 00:04:18 +000082 virtual void removeWorker(size_t value=1) = 0;
Marc Slemko66949872006-07-15 01:52:39 +000083
Mark Sleef5f2be42006-09-05 21:05:31 +000084 /**
85 * Gets the current number of idle worker threads
86 */
Marc Slemko66949872006-07-15 01:52:39 +000087 virtual size_t idleWorkerCount() const = 0;
88
Mark Sleef5f2be42006-09-05 21:05:31 +000089 /**
90 * Gets the current number of total worker threads
91 */
Marc Slemko66949872006-07-15 01:52:39 +000092 virtual size_t workerCount() const = 0;
93
Mark Sleef5f2be42006-09-05 21:05:31 +000094 /**
95 * Gets the current number of pending tasks
96 */
Marc Slemko66949872006-07-15 01:52:39 +000097 virtual size_t pendingTaskCount() const = 0;
98
Mark Sleef5f2be42006-09-05 21:05:31 +000099 /**
100 * Gets the current number of pending and executing tasks
101 */
Marc Slemko66949872006-07-15 01:52:39 +0000102 virtual size_t totalTaskCount() const = 0;
103
Mark Sleef5f2be42006-09-05 21:05:31 +0000104 /**
105 * Adds a task to be execued at some time in the future by a worker thread.
106 *
107 * @param value The task to run
108 */
Marc Slemko6f038a72006-08-03 18:58:09 +0000109 virtual void add(shared_ptr<Runnable>value) = 0;
Marc Slemko66949872006-07-15 01:52:39 +0000110
Mark Sleef5f2be42006-09-05 21:05:31 +0000111 /**
112 * Removes a pending task
113 */
Marc Slemko6f038a72006-08-03 18:58:09 +0000114 virtual void remove(shared_ptr<Runnable> task) = 0;
Marc Slemko66949872006-07-15 01:52:39 +0000115
Marc Slemko6f038a72006-08-03 18:58:09 +0000116 static shared_ptr<ThreadManager> newThreadManager();
Marc Slemkod466b212006-07-20 00:04:18 +0000117
Mark Sleef5f2be42006-09-05 21:05:31 +0000118 /**
119 * Creates a simple thread manager the uses count number of worker threads
120 */
Marc Slemko6f038a72006-08-03 18:58:09 +0000121 static shared_ptr<ThreadManager> newSimpleThreadManager(size_t count=4);
Marc Slemko66949872006-07-15 01:52:39 +0000122
123 class Task;
Marc Slemko0e53ccd2006-07-17 23:51:05 +0000124
Marc Slemko66949872006-07-15 01:52:39 +0000125 class Worker;
126
Marc Slemko0e53ccd2006-07-17 23:51:05 +0000127 class Impl;
Marc Slemko66949872006-07-15 01:52:39 +0000128};
129
130}}} // facebook::thrift::concurrency
131
Mark Sleef5f2be42006-09-05 21:05:31 +0000132#endif // #ifndef _THRIFT_CONCURRENCY_THREADMANAGER_H_