1/* 2 * PipeList.h 3 * 4 * Created on: Aug 28, 2012 5 * Author: archy_yu 6*/ 7 8#ifndef PIPELIST_H_ 9#define PIPELIST_H_1011 #include <list>1213 #include "Mutex.h"14 #include "GameUtil.h"151617 template <class CObject>18class PipeList19{20 friend class Player;21 friend class EvenPlayer;22 friend class ClientPlayer;23public:2425 PipeList(){}2627virtual ~PipeList(){}2829/**************************************************************30 *31 *be careful32 *33 * ***********************************************************/3435int pop(CObject &_arg,BOOL swap = TRUE)36 {37if(this->_read_list.empty())38 {3940if(swap == FALSE)41 {42return -1;43 }4445 Auto_Mutex _auto_mutex(this->_mutex);46if(!this->_write_list.empty())47 {48this->_write_list.swap(this->_read_list);49 }50else51 {52return -1;53 }54 }55 _arg = this->_read_list.front();56this->_read_list.pop_front();57return0;58 }5960void push(CObject &_arg)61 {62 Auto_Mutex _auto_mutex(this->_mutex);63this->_write_list.push_back(_arg);64 }6566int Size()67 {68returnthis->_list.size();69 }7071private:72void swap()73 {74if(!this->_read_list.empty())75 {76return;77 }78 Auto_Mutex _auto_mutex(this->_mutex);79this->_write_list.swap(this->_read_list);80 }8182private:8384 std::list<CObject> _write_list;8586 std::list<CObject> _read_list;8788 Mutex _mutex;8990};9192#endif /* DUPLEXLIST_H_ *//* * PipeList.h * * Created on: Aug 28, 2012 * Author: archy_yu */#ifndef TSMAP_H_#define TSMAP_H_#include <map>#include <ext/hash_map>usingnamespace __gnu_cxx;template <class Key,class CObject>class TsMap{public: TsMap(){} virtual ~TsMap(){} int find(Key key,CObject &_args) { Auto_R_Mutex _auto_mutex(this->_mutex); if(this->_map.count(key) <= 0) { return -1; } _args = this->_map.find(key)->second ; return0; } int bind(Key key,CObject _args) { Auto_W_Mutex _auto_mutex(this->_mutex); this->_map[key] = _args; return0; } int unbind(Key key) { Auto_W_Mutex _auto_mutex(this->_mutex); this->_map.erase(key); return0; } int Size() { Auto_R_Mutex _auto_mutex(this->_mutex); returnthis->_map.size(); }private: std::map<Key,CObject> _map; RW_Mutex _mutex;};template <class Key,class CObject>class TsHash_Map{public: TsHash_Map(){} virtual ~TsHash_Map(){} int find(Key _key,CObject &_object) { Auto_R_Mutex _auto_mutex(this->_mutex); if(this->_map.count(_key) <= 0) { return -1; } _object = this->_map.find(_key)->second; return0; } int bind(Key _key,CObject _object) { Auto_W_Mutex _aotu_mutex(this->_mutex); this->_map[_key] = _object; return0; } int unbind(Key _key) { Auto_W_Mutex _auto_mutex(this->_mutex); this->_map.erase(_key); return0; } int Size() { Auto_R_Mutex _auto_mutex(this->_mutex); returnthis->_map.size(); }private: hash_map<Key,CObject> _map; RW_Mutex _mutex;};#endifclass Auto_R_Mutex{public: Auto_R_Mutex(RW_Mutex &rw_mutex); virtual ~Auto_R_Mutex();private: Auto_R_Mutex(); RW_Mutex *_mutex;};class Auto_W_Mutex{public: Auto_W_Mutex(RW_Mutex &rw_mutex); virtual ~Auto_W_Mutex();private: Auto_W_Mutex(); RW_Mutex *_mutex;};Auto_Mutex::Auto_Mutex(Mutex &mutex){ this->_mutex = &mutex; this->_mutex->lock();}Auto_Mutex::~Auto_Mutex(){ this->_mutex->Release();}Auto_R_Mutex::Auto_R_Mutex(RW_Mutex &rw_mutex){ this->_mutex = &rw_mutex; this->_mutex->rLock();}Auto_R_Mutex::~Auto_R_Mutex(){ this->_mutex->rRelease();}Auto_W_Mutex::Auto_W_Mutex(RW_Mutex &rw_mutex){ this->_mutex = &rw_mutex; this->_mutex->wLock();}Auto_W_Mutex::~Auto_W_Mutex(){ this->_mutex->wRelease();}class RW_Mutex{public: RW_Mutex(); virtual ~RW_Mutex(); int rLock(); int rRelease(); int wLock(); int wRelease();private: pthread_rwlock_t _map_lock;};class Mutex{public: Mutex(); virtual ~Mutex(); intlock(); int Release();private: pthread_mutex_t _lock;};RW_Mutex::RW_Mutex(){ pthread_rwlock_init(&_map_lock,NULL);}RW_Mutex::~RW_Mutex(){ pthread_rwlock_destroy(&_map_lock);}int RW_Mutex::rLock(){ pthread_rwlock_rdlock(&_map_lock); return0;}int RW_Mutex::rRelease(){ pthread_rwlock_unlock(&_map_lock); return0;}int RW_Mutex::wLock(){ pthread_rwlock_wrlock(&_map_lock); return0;}int RW_Mutex::wRelease(){ pthread_rwlock_unlock(&_map_lock); return0;}Mutex::Mutex(){ pthread_mutex_init(&this->_lock,NULL);}Mutex::~Mutex(){ pthread_mutex_destroy(&this->_lock);}int Mutex::lock(){ pthread_mutex_lock(&this->_lock); return0;}int Mutex::Release(){ pthread_mutex_unlock(&this->_lock); return0;}