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
00035 #ifndef OW_THREAD_POOL_HPP_INCLUDE_GUARD_
00036 #define OW_THREAD_POOL_HPP_INCLUDE_GUARD_
00037 #include "OW_config.h"
00038 #include "OW_Types.hpp"
00039 #include "OW_IntrusiveReference.hpp"
00040 #include "OW_IntrusiveCountableBase.hpp"
00041 #include "OW_Runnable.hpp"
00042 #include "OW_Exception.hpp"
00043 #include "OW_Logger.hpp"
00044
00045 namespace OW_NAMESPACE
00046 {
00047
00048 class ThreadPoolImpl;
00049 OW_DECLARE_APIEXCEPTION(ThreadPool, OW_COMMON_API);
00059 class OW_COMMON_API ThreadPool : public IntrusiveCountableBase
00060 {
00061 public:
00062 enum PoolType
00063 {
00064 FIXED_SIZE,
00065 DYNAMIC_SIZE,
00066 DYNAMIC_SIZE_NO_QUEUE
00067 };
00068 enum
00069 {
00070 UNLIMITED_QUEUE_SIZE = 0
00071 };
00101 ThreadPool(PoolType poolType, UInt32 numThreads, UInt32 maxQueueSize, const LoggerRef& logger=LoggerRef(), const String& poolName="");
00107 bool addWork(const RunnableRef& work);
00113 bool tryAddWork(const RunnableRef& work);
00114 enum EShutdownQueueFlag
00115 {
00116 E_DISCARD_WORK_IN_QUEUE,
00117 E_FINISH_WORK_IN_QUEUE
00118 };
00134 void shutdown(EShutdownQueueFlag finishWorkInQueue = E_FINISH_WORK_IN_QUEUE, int timeoutSecs=-1);
00138 void waitForEmptyQueue();
00143 ~ThreadPool();
00144 ThreadPool(const ThreadPool& x);
00145 ThreadPool& operator=(const ThreadPool& x);
00146 private:
00147
00148 #ifdef OW_WIN32
00149 #pragma warning (push)
00150 #pragma warning (disable: 4251)
00151 #endif
00152
00153 IntrusiveReference<ThreadPoolImpl> m_impl;
00154
00155 #ifdef OW_WIN32
00156 #pragma warning (pop)
00157 #endif
00158
00159 };
00160 OW_EXPORT_TEMPLATE(OW_COMMON_API, IntrusiveReference, ThreadPool);
00161
00162 }
00163
00164 #endif