129 lines
2.6 KiB
C++
129 lines
2.6 KiB
C++
/***************************************************************************
|
|
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 <string>
|
|
#include <map>
|
|
|
|
using namespace std;
|
|
|
|
# if __GNUC__ >= 3
|
|
# include <ext/hash_map>
|
|
using namespace __gnu_cxx;
|
|
# else
|
|
# include <hash_map>
|
|
# 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<string, short, hash_key, compare_key> 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<CWork*, short> m_pool;
|
|
};
|
|
|
|
#endif // __WORK_POOL_H__
|