// Include #include "gamesrv.h" #include "themeuserpool.h" // Local definitions // Global data cThemeUserPool* cThemeUserPool::mpThemeUserPool = NULL; // ThemeUserCmpNode Prototype int WINAPI ThemeUserCmpNode(void* arg1, void* arg2) { return ((PerThemeUser*)arg1)->cid - ((PerThemeUser*)arg2)->cid; } // ThemeUserCmpCID Prototype int WINAPI ThemeUserCmpCID(void* arg1, void* arg2) { return ((PerThemeUser*)arg1)->cid - (*(long*)arg2); } // cThemeUserPool Constructor cThemeUserPool::cThemeUserPool( ) { // Global Variable mpThemeUserPool = this; // Pool Usage Pointer mNonPagedPoolUsage = NULL; } // ~cThemeUserPool Destructor. cThemeUserPool::~cThemeUserPool(void) { // cThemeUserPool¸¦ ÇØÁ¦. Shutdown(); // Global Variable mpThemeUserPool = NULL; } // Shutdown Method void cThemeUserPool::Shutdown() { PerThemeUser* temp; // Pool Usage Shutdown - NonPagedPoolUsage while ( mNonPagedPoolUsage != NULL ) { temp = mNonPagedPoolUsage; mNonPagedPoolUsage = (PerThemeUser*)mNonPagedPoolUsage->next; MEMORY_POOL->FreeNode( (void**)&temp ); } } // SearchThemeUser Method PerThemeUser* cThemeUserPool::SearchThemeUser(ThemeUserRoot* themeUserRoot, long cid) { PerThemeUser* perThemeUser = (PerThemeUser*)MEMORY_POOL->SearchNode( themeUserRoot, &cid, &ThemeUserCmpCID ); if ( perThemeUser != NULL ) { time_t ltime; time( <ime ); if ( difftime( perThemeUser->validThru, ltime ) <= 0 ) { ReleaseThemeUser( themeUserRoot, perThemeUser ); return NULL; } } return perThemeUser; } // IsThemeUser Method bool cThemeUserPool::IsThemeUser(ThemeUserRoot* themeUserRoot, long cid) { return SearchThemeUser( themeUserRoot, cid ) != NULL ? true : false; } // GetThemeUser Method - ¼±Çü¸®½ºÆ®ÀÇ HEAD¸¦ ³Ñ°ÜÁØ´Ù. // ReleaseThemeUser¿Í ÇÔ²² LIFO¸¦ ÀÌ·é´Ù. LIFO´Â Context Switching¸¦ ÃÖ¼ÒÈ­ Çϱâ À§ÇØ »ç¿ë PerThemeUser* cThemeUserPool::GetThemeUser(ThemeUserRoot* themeUserRoot, long cid) { PerThemeUser* perThemeUser = (PerThemeUser*)MEMORY_POOL->GetPool( (PerNode**)&mNonPagedPoolUsage, sizeof(PerThemeUser) ); if ( perThemeUser ) { perThemeUser->cid = cid; // Key(CID) // BST-¿¬°á½Ãµµ. if ( MEMORY_POOL->AttachBst( &themeUserRoot->root, perThemeUser, ThemeUserCmpNode ) ) { MEMORY_POOL->AttachPool( (PerNode**)&themeUserRoot->pool, perThemeUser ); return perThemeUser; // ¿¬°á¼º°ø. } else { MEMORY_POOL->AttachPool( (PerNode**)&mNonPagedPoolUsage, perThemeUser ); return NULL; // ¿¬°á½ÇÆÐ. } } return perThemeUser; } // ReleaseThemeUser Method - ¼±Çü¸®½ºÆ®ÀÇ HEAD·Î ȸ¼öÇÑ´Ù. // GetThemeUser¿Í ÇÔ²² LIFO¸¦ ÀÌ·é´Ù. LIFO´Â Context Switching¸¦ ÃÖ¼ÒÈ­ Çϱâ À§ÇØ »ç¿ë void cThemeUserPool::ReleaseThemeUser(ThemeUserRoot* themeUserRoot, PerThemeUser* perThemeUser) { // BST - ¿¬°áÁ¾·á. MEMORY_POOL->DetachBst( (PerNode**)&themeUserRoot->root, (PerNode*)perThemeUser ); // ÆäÀÌÁö µÈ Ç® »ç¿ë·®À» Â÷°¨. MEMORY_POOL->DetachPool( (PerNode**)&themeUserRoot->pool, (PerNode*)perThemeUser ); // ÆäÀÌÁö ¾ÈµÈ Ç® »ç¿ë·®À» Áõ°¨. MEMORY_POOL->ReleasePool( (PerNode**)&mNonPagedPoolUsage, (PerNode*)perThemeUser ); }