| // Copyright (c) 2006- Facebook | 
 | // Distributed under the Thrift Software License | 
 | // | 
 | // See accompanying file LICENSE or visit the Thrift site at: | 
 | // http://developers.facebook.com/thrift/ | 
 |  | 
 | #ifndef _THRIFT_CONCURRENCY_THREADMANAGER_H_ | 
 | #define _THRIFT_CONCURRENCY_THREADMANAGER_H_ 1 | 
 |  | 
 | #include <boost/shared_ptr.hpp> | 
 | #include <sys/types.h> | 
 | #include "Thread.h" | 
 |  | 
 | namespace facebook { namespace thrift { namespace concurrency { | 
 |  | 
 | /** | 
 |  * Thread Pool Manager and related classes | 
 |  * | 
 |  * @author marc | 
 |  * @version $Id:$ | 
 |  */ | 
 | class ThreadManager; | 
 |  | 
 | /** | 
 |  * ThreadManager class | 
 |  * | 
 |  * This class manages a pool of threads. It uses a ThreadFactory to create | 
 |  * threads. It never actually creates or destroys worker threads, rather | 
 |  * It maintains statistics on number of idle threads, number of active threads, | 
 |  * task backlog, and average wait and service times and informs the PoolPolicy | 
 |  * object bound to instances of this manager of interesting transitions. It is | 
 |  * then up the PoolPolicy object to decide if the thread pool size needs to be | 
 |  * adjusted and call this object addWorker and removeWorker methods to make | 
 |  * changes. | 
 |  * | 
 |  * This design allows different policy implementations to used this code to | 
 |  * handle basic worker thread management and worker task execution and focus on | 
 |  * policy issues. The simplest policy, StaticPolicy, does nothing other than | 
 |  * create a fixed number of threads. | 
 |  */ | 
 | class ThreadManager { | 
 |  | 
 |  protected: | 
 |   ThreadManager() {} | 
 |  | 
 |  public: | 
 |   virtual ~ThreadManager() {} | 
 |  | 
 |   /** | 
 |    * Starts the thread manager. Verifies all attributes have been properly | 
 |    * initialized, then allocates necessary resources to begin operation | 
 |    */ | 
 |   virtual void start() = 0; | 
 |  | 
 |   /** | 
 |    * Stops the thread manager. Aborts all remaining unprocessed task, shuts | 
 |    * down all created worker threads, and realeases all allocated resources. | 
 |    * This method blocks for all worker threads to complete, thus it can | 
 |    * potentially block forever if a worker thread is running a task that | 
 |    * won't terminate. | 
 |    */ | 
 |   virtual void stop() = 0; | 
 |  | 
 |   /** | 
 |    * Joins the thread manager. This is the same as stop, except that it will | 
 |    * block until all the workers have finished their work. At that point | 
 |    * the ThreadManager will transition into the STOPPED state. | 
 |    */ | 
 |   virtual void join() = 0; | 
 |  | 
 |   enum STATE { | 
 |     UNINITIALIZED, | 
 |     STARTING, | 
 |     STARTED, | 
 |     JOINING, | 
 |     STOPPING, | 
 |     STOPPED | 
 |   }; | 
 |  | 
 |   virtual const STATE state() const = 0; | 
 |  | 
 |   virtual boost::shared_ptr<ThreadFactory> threadFactory() const = 0; | 
 |  | 
 |   virtual void threadFactory(boost::shared_ptr<ThreadFactory> value) = 0; | 
 |  | 
 |   virtual void addWorker(size_t value=1) = 0; | 
 |  | 
 |   virtual void removeWorker(size_t value=1) = 0; | 
 |  | 
 |   /** | 
 |    * Gets the current number of idle worker threads | 
 |    */ | 
 |   virtual size_t idleWorkerCount() const = 0; | 
 |  | 
 |   /** | 
 |    * Gets the current number of total worker threads | 
 |    */ | 
 |   virtual size_t workerCount() const = 0; | 
 |  | 
 |   /** | 
 |    * Gets the current number of pending tasks | 
 |    */ | 
 |   virtual size_t pendingTaskCount() const  = 0; | 
 |  | 
 |   /** | 
 |    * Gets the current number of pending and executing tasks | 
 |    */ | 
 |   virtual size_t totalTaskCount() const = 0; | 
 |  | 
 |   /** | 
 |    * Gets the maximum pending task count.  0 indicates no maximum | 
 |    */ | 
 |   virtual size_t pendingTaskCountMax() const = 0; | 
 |  | 
 |   /** | 
 |    * Adds a task to be executed at some time in the future by a worker thread. | 
 |    * | 
 |    * This method will block if pendingTaskCountMax() in not zero and pendingTaskCount() | 
 |    * is greater than or equalt to pendingTaskCountMax().  If this method is called in the | 
 |    * context of a ThreadManager worker thread it will throw a | 
 |    * TooManyPendingTasksException | 
 |    * | 
 |    * @param task  The task to queue for execution | 
 |    * | 
 |    * @param timeout Time to wait in milliseconds to add a task when a pending-task-count | 
 |    * is specified. Specific cases: | 
 |    * timeout = 0  : Wait forever to queue task. | 
 |    * timeout = -1 : Return immediately if pending task count exceeds specified max | 
 |    * | 
 |    * @throws TooManyPendingTasksException Pending task count exceeds max pending task count | 
 |    */ | 
 |   virtual void add(boost::shared_ptr<Runnable>task, int64_t timeout=0LL) = 0; | 
 |  | 
 |   /** | 
 |    * Removes a pending task | 
 |    */ | 
 |   virtual void remove(boost::shared_ptr<Runnable> task) = 0; | 
 |  | 
 |   static boost::shared_ptr<ThreadManager> newThreadManager(); | 
 |  | 
 |   /** | 
 |    * Creates a simple thread manager the uses count number of worker threads and has | 
 |    * a pendingTaskCountMax maximum pending tasks. The default, 0, specified no limit | 
 |    * on pending tasks | 
 |    */ | 
 |   static boost::shared_ptr<ThreadManager> newSimpleThreadManager(size_t count=4, size_t pendingTaskCountMax=0); | 
 |  | 
 |   class Task; | 
 |  | 
 |   class Worker; | 
 |  | 
 |   class Impl; | 
 | }; | 
 |  | 
 | }}} // facebook::thrift::concurrency | 
 |  | 
 | #endif // #ifndef _THRIFT_CONCURRENCY_THREADMANAGER_H_ |