// Include #include "gamesrv.h" #include "itemgetpool.h" // Local definitions // Global data cItemGetPool* cItemGetPool::mpItemGetPool = NULL; // ItemGetCmpIndex Prototype int WINAPI ItemGetCmpIndex(void* arg1, void* arg2) { return ((PerItemGet*)arg1)->key - ((PerItemGet*)arg2)->key; } // ItemGetCmpValue Prototype int WINAPI ItemGetCmpValue(void* arg1, void* arg2) { return ((PerItemGet*)arg1)->key - (*(long*)arg2); } // cItemGetPool Constructor cItemGetPool::cItemGetPool( ) { // Global Variable mpItemGetPool = this; // Pool Usage Pointer mNonPagedPoolUsage = NULL; } // ~cItemGetPool Destructor. cItemGetPool::~cItemGetPool(void) { // cItemGetPool¸¦ ÇØÁ¦. Shutdown(); // Global Variable mpItemGetPool = NULL; } // Shutdown Method void cItemGetPool::Shutdown() { PerItemGet* temp; // Pool Usage Shutdown - NonPagedPoolUsage while ( mNonPagedPoolUsage != NULL ) { temp = mNonPagedPoolUsage; mNonPagedPoolUsage = (PerItemGet*)mNonPagedPoolUsage->next; MEMORY_POOL->FreeNode( (void**)&temp ); } } // SearchItemCount Method PerItemGet* cItemGetPool::SearchItemGet(ItemGetRoot* root, long key) { return (PerItemGet*)MEMORY_POOL->SearchNode( root, &key, &ItemGetCmpValue ); } // GetItemGet Method - ¼±Çü¸®½ºÆ®ÀÇ HEAD¸¦ ³Ñ°ÜÁØ´Ù. // ReleaseItemGet¿Í ÇÔ²² LIFO¸¦ ÀÌ·é´Ù. LIFO´Â Context Switching¸¦ ÃÖ¼ÒÈ­ Çϱâ À§ÇØ »ç¿ë PerItemGet* cItemGetPool::GetItemGet(ItemGetRoot* root, long key) { PerItemGet* perItemGet = (PerItemGet*)MEMORY_POOL->GetPool( (PerNode**)&mNonPagedPoolUsage, sizeof(PerItemGet) ); if ( perItemGet ) { perItemGet->key = key; // BST-¿¬°á½Ãµµ. if ( MEMORY_POOL->AttachBst( &root->root, perItemGet, ItemGetCmpIndex ) ) { MEMORY_POOL->AttachPool( (PerNode**)&root->pool, perItemGet ); return perItemGet; // ¿¬°á¼º°ø. } else { MEMORY_POOL->AttachPool( (PerNode**)&mNonPagedPoolUsage, perItemGet ); return NULL; // ¿¬°á½ÇÆÐ. } } return perItemGet; } // ReleaseItemGet Method - ¼±Çü¸®½ºÆ®ÀÇ HEAD·Î ȸ¼öÇÑ´Ù. // GetItemGet¿Í ÇÔ²² LIFO¸¦ ÀÌ·é´Ù. LIFO´Â Context Switching¸¦ ÃÖ¼ÒÈ­ Çϱâ À§ÇØ »ç¿ë void cItemGetPool::ReleaseItemGet(ItemGetRoot* root, PerItemGet* perItemGet) { perItemGet->key = 0; memset( &perItemGet->inventory, 0, sizeof(TB_INVENTORY) ); // BST - ¿¬°áÁ¾·á. MEMORY_POOL->DetachBst( (PerNode**)&root->root, (PerNode*)perItemGet ); // ÆäÀÌÁö µÈ Ç® »ç¿ë·®À» Â÷°¨. MEMORY_POOL->DetachPool( (PerNode**)&root->pool, (PerNode*)perItemGet ); // ÆäÀÌÁö ¾ÈµÈ Ç® »ç¿ë·®À» Áõ°¨. MEMORY_POOL->ReleasePool( (PerNode**)&mNonPagedPoolUsage, (PerNode*)perItemGet ); }