00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00038 #ifndef BLOCXX_THREAD_POOL_HPP_INCLUDE_GUARD_
00039 #define BLOCXX_THREAD_POOL_HPP_INCLUDE_GUARD_
00040 #include "blocxx/BLOCXX_config.h"
00041 #include "blocxx/Types.hpp"
00042 #include "blocxx/IntrusiveReference.hpp"
00043 #include "blocxx/IntrusiveCountableBase.hpp"
00044 #include "blocxx/Runnable.hpp"
00045 #include "blocxx/Exception.hpp"
00046 #include "blocxx/Logger.hpp"
00047 #include "blocxx/Timeout.hpp"
00048
00049 namespace BLOCXX_NAMESPACE
00050 {
00051
00052 class ThreadPoolImpl;
00053 BLOCXX_DECLARE_APIEXCEPTION(ThreadPool, BLOCXX_COMMON_API);
00063 class BLOCXX_COMMON_API ThreadPool : public IntrusiveCountableBase
00064 {
00065 public:
00066 enum PoolType
00067 {
00068 FIXED_SIZE,
00069 DYNAMIC_SIZE,
00070 DYNAMIC_SIZE_NO_QUEUE
00071 };
00072 enum
00073 {
00074 UNLIMITED_QUEUE_SIZE = 0
00075 };
00105 ThreadPool(PoolType poolType, UInt32 numThreads, UInt32 maxQueueSize, const Logger& logger, const String& poolName="");
00106 ThreadPool(PoolType poolType, UInt32 numThreads, UInt32 maxQueueSize, const String& poolName="");
00112 bool addWork(const RunnableRef& work);
00118 bool tryAddWork(const RunnableRef& work);
00124 bool tryAddWork(const RunnableRef& work, const Timeout& timeout);
00125 enum EShutdownQueueFlag
00126 {
00127 E_DISCARD_WORK_IN_QUEUE,
00128 E_FINISH_WORK_IN_QUEUE
00129 };
00145 void shutdown(EShutdownQueueFlag finishWorkInQueue = E_FINISH_WORK_IN_QUEUE, const Timeout& timeout = Timeout::infinite);
00146 void shutdown(EShutdownQueueFlag finishWorkInQueue, int timeoutSecs) BLOCXX_DEPRECATED;
00147
00170 void shutdown(EShutdownQueueFlag finishWorkInQueue, const Timeout& shutdownTimeout, const Timeout& definitiveCancelTimeout);
00171
00175 void waitForEmptyQueue();
00180 ~ThreadPool();
00181 ThreadPool(const ThreadPool& x);
00182 ThreadPool& operator=(const ThreadPool& x);
00183 private:
00184
00185 #ifdef BLOCXX_WIN32
00186 #pragma warning (push)
00187 #pragma warning (disable: 4251)
00188 #endif
00189
00190 IntrusiveReference<ThreadPoolImpl> m_impl;
00191
00192 #ifdef BLOCXX_WIN32
00193 #pragma warning (pop)
00194 #endif
00195
00196 };
00197 BLOCXX_EXPORT_TEMPLATE(BLOCXX_COMMON_API, IntrusiveReference, ThreadPool);
00198
00199 }
00200
00201 #endif