// Include #include "gamesrv.h" #include "partyjoinpool.h" // Local definitions #define PARTY_JOIN_DELAY 15000 // Global data cPartyJoinPool* cPartyJoinPool::mpPartyJoinPool = NULL; // PartyJoinNameCmpWchar Prototype int WINAPI PartyJoinNameCmpWchar(void* arg1, void* arg2) { return wcscmp( ((PartyJoin*)arg1)->name, ((PartyJoin*)arg2)->name ); } // PartyJoinNameCmpValue Prototype int WINAPI PartyJoinNameCmpValue(void* arg1, void* arg2) { return wcscmp( ((PartyJoin*)arg1)->name, (wchar_t*)arg2 ); } // cPartyJoinPool Constructor cPartyJoinPool::cPartyJoinPool( ) { // Global Variable mpPartyJoinPool = this; // Pool Usage Pointer mNonPagedPoolUsage = NULL; mPartyJoinRoot.pool = NULL; mPartyJoinRoot.root = NULL; } // ~cPartyJoinPool Destructor. cPartyJoinPool::~cPartyJoinPool(void) { // cPartyJoinPool¸¦ ÇØÁ¦. Shutdown( ); // Global Variable mpPartyJoinPool = NULL; } // Shutdown Method void cPartyJoinPool::Shutdown() { PartyJoin* temp; // Pool Usage Shutdown - NonPagedPoolUsage while ( mNonPagedPoolUsage != NULL ) { temp = mNonPagedPoolUsage; mNonPagedPoolUsage = (PartyJoin*)mNonPagedPoolUsage->next; MEMORY_POOL->FreeNode( (void**)&temp ); } } // Search Method PartyJoin* cPartyJoinPool::Search(wchar_t* name) { return (PartyJoin*)MEMORY_POOL->SearchNode( &mPartyJoinRoot, name, &PartyJoinNameCmpValue ); } // Get Method - ¼±Çü¸®½ºÆ®ÀÇ HEAD¸¦ ³Ñ°ÜÁØ´Ù. // Release¿Í ÇÔ²² LIFO¸¦ ÀÌ·é´Ù. LIFO´Â Context Switching¸¦ ÃÖ¼ÒÈ­ Çϱâ À§ÇØ »ç¿ë PartyJoin* cPartyJoinPool::Get(wchar_t* name) { PartyJoin* join = (PartyJoin*)MEMORY_POOL->GetPool( (PerNode**)&mNonPagedPoolUsage, sizeof(PartyJoin) ); if ( join != NULL ) { wcscpy( join->name, name ); join->delay = GetTickCount( ) + PARTY_JOIN_DELAY; // BST-¿¬°á½Ãµµ. if ( MEMORY_POOL->AttachBst( &mPartyJoinRoot.root, join, PartyJoinNameCmpWchar ) ) { MEMORY_POOL->AttachPool( (PerNode**)&mPartyJoinRoot.pool, join ); return join; // ¿¬°á¼º°ø. } else { MEMORY_POOL->AttachPool( (PerNode**)&mNonPagedPoolUsage, join ); return NULL; // ¿¬°á½ÇÆÐ. } } return join; } // Release Method - ¼±Çü¸®½ºÆ®ÀÇ HEAD·Î ȸ¼öÇÑ´Ù. // Get¿Í ÇÔ²² LIFO¸¦ ÀÌ·é´Ù. LIFO´Â Context Switching¸¦ ÃÖ¼ÒÈ­ Çϱâ À§ÇØ »ç¿ë void cPartyJoinPool::Release(PartyJoin* join) { memset( &join->name, 0, sizeof(TB_INVENTORY) ); join->partyIdx = 0; memset( &join->playerDat, 0, sizeof(TB_INVENTORY) ); // BST - ¿¬°áÁ¾·á. MEMORY_POOL->DetachBst( (PerNode**)&mPartyJoinRoot.root, (PerNode*)join ); // ÆäÀÌÁö µÈ Ç® »ç¿ë·®À» Â÷°¨. MEMORY_POOL->DetachPool( (PerNode**)&mPartyJoinRoot.pool, (PerNode*)join ); // ÆäÀÌÁö ¾ÈµÈ Ç® »ç¿ë·®À» Áõ°¨. MEMORY_POOL->ReleasePool( (PerNode**)&mNonPagedPoolUsage, (PerNode*)join ); }