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