Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
77 lines
1.7 KiB
C++
77 lines
1.7 KiB
C++
#ifndef _GM_NETWORK_MULTI_DISPATCH_STORAGE_H_
|
|
#define _GM_NETWORK_MULTI_DISPATCH_STORAGE_H_
|
|
|
|
#include <map>
|
|
#include <Thread/Lock.h>
|
|
|
|
#define GET_MULTI_DISPATCH(instanceName, keyValue, type, table) \
|
|
CMultiDispatch::Storage Storage##instanceName(table, keyValue); \
|
|
type* instanceName = static_cast<type*>(Storage##instanceName.GetDispatch())
|
|
|
|
class CPacketDispatch;
|
|
|
|
class CMultiDispatch
|
|
{
|
|
public:
|
|
|
|
typedef std::map<unsigned long, CPacketDispatch*> DispatchMap;
|
|
|
|
class Storage
|
|
{
|
|
public:
|
|
|
|
Storage(CMultiDispatch& multiDispatch, unsigned long dispatchKey);
|
|
~Storage();
|
|
|
|
CPacketDispatch* ReloadDispatch(unsigned long dispatchKey);
|
|
CPacketDispatch* GetDispatch() { return m_lpDispatch; }
|
|
|
|
private:
|
|
|
|
// Èü¿¡ »ý¼º ºÒ°¡.
|
|
static void* operator new(size_t size);
|
|
static void operator delete(void* ptr);
|
|
|
|
CPacketDispatch* m_lpDispatch;
|
|
CMultiDispatch& m_MultiDispatch;
|
|
};
|
|
|
|
CMultiDispatch();
|
|
~CMultiDispatch();
|
|
|
|
bool SetDispatch(unsigned long dispatchKey, CPacketDispatch* lpDispatch);
|
|
void ForceSetDispatch(unsigned long dispatchKey, CPacketDispatch* lpDispatch);
|
|
void RemoveDispatch(unsigned long dispatchKey);
|
|
|
|
template<typename FnProcess>
|
|
void Process(FnProcess fnProcess)
|
|
{
|
|
LockType::Syncronize sync(m_DispatchLock);
|
|
|
|
DispatchMap::iterator pos = m_DispatchMap.begin();
|
|
DispatchMap::iterator end = m_DispatchMap.end();
|
|
|
|
for(;pos != end; ++pos)
|
|
{
|
|
fnProcess(pos->first, *pos->second);
|
|
}
|
|
}
|
|
|
|
size_t GetDispatchNum();
|
|
bool IsEmpty();
|
|
|
|
private:
|
|
|
|
void InternalRemoveDispatch(unsigned long dispatchKey);
|
|
CPacketDispatch* GetDispatch(unsigned long dispatchKey);
|
|
|
|
typedef CCSLock LockType;
|
|
|
|
LockType m_DispatchLock;
|
|
CACHE_PAD(DispatchLockPad, sizeof(LockType));
|
|
DispatchMap m_DispatchMap;
|
|
|
|
friend class Storage;
|
|
};
|
|
|
|
#endif |