/*************************************************************************** Work Pool ----------------------------------------- begin : 2011/10/27 copyright : (C) 2011 SolutionBox Inc. author : Service 1 Team email : svc1@solbox.com version : 3.0.1 CopyRight(C) 2011 SolutionBox Inc. All Rights reserved. Redistribution and use in source and binary forms, with or with out modification, are not permitted in outside of SolutionBox Inc. ***************************************************************************/ #ifndef __WORK_POOL_H__ #define __WORK_POOL_H__ #include #include using namespace std; # if __GNUC__ >= 3 # include using namespace __gnu_cxx; # else # include # endif typedef int (*work_notifyfn)(void *object, short success); struct hash_key { size_t operator() (const string &k) const { return __stl_hash_string(k.c_str()); } }; struct compare_key { bool operator () (const string s1, const string &s2) const { return s1 == s2; } }; typedef hash_map workurimap; #include "SyncList.h" class CWork { public: CWork(); ~CWork(); bool init(); bool run(CSyncInfo info, string rundata, work_notifyfn nofi = NULL, void * parm = NULL); void setexit(bool v); void setenablesync(const char* szOn) {m_enablesync = szOn;} pthread_t* getworkhandle() {return &m_thread;} const char* getrundata() { return m_rundata.c_str(); } int getsetp() { return m_step; } private: static void* working(void * pdata); private: int m_step; bool m_exit; string m_rundata; CSyncInfo m_syncinfo; string m_workuri; work_notifyfn m_nofi; void* m_parm; string m_enablesync; pthread_t m_thread; pthread_cond_t m_workcond; pthread_mutex_t m_workmutex; }; class CWorkPool { public: enum WORK_SATAUSE { WORKING = 0, NOTWORK = 1 }; public: static void init(); static CWorkPool* getInstance(); static void release(); int CreatePool( int poolcnt = 10 ); int DestroyPool(); bool addworkuri(string tranid, string uri, string &workuri, bool sourcedata = false, int timeout = 5); bool delworkuri(string key); void printstatus(string prefixed = ""); void printstatusex(string prefixed = ""); CWork* GetWorkPool(int timeout = 0); void ReleaseWork(CWork *w); private: CWorkPool(); ~CWorkPool(); private: static CWorkPool* m_inst; pthread_mutex_t m_mutex; pthread_mutex_t m_mutexuri; pthread_mutex_t m_mutextry; workurimap m_workurimap; map m_pool; }; #endif // __WORK_POOL_H__