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
00037 #ifndef BLOCXX_THREAD_POOL_HPP_INCLUDE_GUARD_
00038 #define BLOCXX_THREAD_POOL_HPP_INCLUDE_GUARD_
00039 #include "blocxx/BLOCXX_config.h"
00040 #include "blocxx/Types.hpp"
00041 #include "blocxx/IntrusiveReference.hpp"
00042 #include "blocxx/IntrusiveCountableBase.hpp"
00043 #include "blocxx/Runnable.hpp"
00044 #include "blocxx/Exception.hpp"
00045 #include "blocxx/Logger.hpp"
00046
00047 namespace BLOCXX_NAMESPACE
00048 {
00049
00050 class ThreadPoolImpl;
00051 BLOCXX_DECLARE_APIEXCEPTION(ThreadPool, BLOCXX_COMMON_API);
00061 class BLOCXX_COMMON_API ThreadPool : public IntrusiveCountableBase
00062 {
00063 public:
00064 enum PoolType
00065 {
00066 FIXED_SIZE,
00067 DYNAMIC_SIZE,
00068 DYNAMIC_SIZE_NO_QUEUE
00069 };
00070 enum
00071 {
00072 UNLIMITED_QUEUE_SIZE = 0
00073 };
00103 ThreadPool(PoolType poolType, UInt32 numThreads, UInt32 maxQueueSize, const LoggerRef& logger=LoggerRef(), const String& poolName="");
00109 bool addWork(const RunnableRef& work);
00115 bool tryAddWork(const RunnableRef& work);
00116 enum EShutdownQueueFlag
00117 {
00118 E_DISCARD_WORK_IN_QUEUE,
00119 E_FINISH_WORK_IN_QUEUE
00120 };
00136 void shutdown(EShutdownQueueFlag finishWorkInQueue = E_FINISH_WORK_IN_QUEUE, int timeoutSecs=-1);
00140 void waitForEmptyQueue();
00145 ~ThreadPool();
00146 ThreadPool(const ThreadPool& x);
00147 ThreadPool& operator=(const ThreadPool& x);
00148 private:
00149
00150 #ifdef BLOCXX_WIN32
00151 #pragma warning (push)
00152 #pragma warning (disable: 4251)
00153 #endif
00154
00155 IntrusiveReference<ThreadPoolImpl> m_impl;
00156
00157 #ifdef BLOCXX_WIN32
00158 #pragma warning (pop)
00159 #endif
00160
00161 };
00162 BLOCXX_EXPORT_TEMPLATE(BLOCXX_COMMON_API, IntrusiveReference, ThreadPool);
00163
00164 }
00165
00166 #endif