Restructure repository to include all source folders
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>
This commit is contained in:
243
Server/NFAuthTool/NFAuthServer/NaveServer/NFMemPool.h
Normal file
243
Server/NFAuthTool/NFAuthServer/NaveServer/NFMemPool.h
Normal file
@@ -0,0 +1,243 @@
|
||||
/**
|
||||
* @file NFMemPool.h
|
||||
* @brief Packet Memory <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü
|
||||
* @remarks
|
||||
* @author <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(edith2580@gmail.com)
|
||||
* @date 2009-05-09
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <Nave/NFSync.h>
|
||||
#include <Nave/NFLog.h>
|
||||
|
||||
namespace NaveServer {
|
||||
|
||||
#pragma pack(push, struct_packing_before)
|
||||
#pragma pack(1)
|
||||
|
||||
/**
|
||||
* @class NFMemPool
|
||||
* @brief IOCP<43><50><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD>۸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><DEB8><EFBFBD>Pool Ŭ<><C5AC><EFBFBD><EFBFBD>
|
||||
* @remarks
|
||||
*
|
||||
* @par
|
||||
* @author Edith
|
||||
* @date 2009-08-28
|
||||
*/
|
||||
template <class TYPE>
|
||||
class NFMemPool
|
||||
{
|
||||
public:
|
||||
/// <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Է<EFBFBD>
|
||||
NFMemPool(INT nTotalCnt, INT nAllocBufferSize=0);
|
||||
/// <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3>
|
||||
~NFMemPool();
|
||||
|
||||
/**
|
||||
* @brief <09>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
|
||||
* @param strLogTitle <20>α<EFBFBD><CEB1><EFBFBD> <20≯<EFBFBD>
|
||||
*/
|
||||
VOID SetLogTitle(WCHAR* strLogTitle)
|
||||
{
|
||||
wcscpy(m_strLogTitle, strLogTitle);
|
||||
}
|
||||
|
||||
/// <20><><EFBFBD><EFBFBD> <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
|
||||
INT GetCount();
|
||||
/// <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><>Ŷ <20><>
|
||||
INT GetEmpty();
|
||||
/// <20><><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
INT GetIndex( TYPE *ptr );
|
||||
|
||||
/// <20>Ҵ<EFBFBD><D2B4><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><> <20><>Ŷ <20><>ȯ
|
||||
TYPE* Alloc();
|
||||
/// <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><DEB8> <20><><EFBFBD><EFBFBD>
|
||||
BOOL Free( TYPE *ptr );
|
||||
|
||||
private:
|
||||
/// INDEX Structure
|
||||
struct INDEX
|
||||
{
|
||||
/// <20><><EFBFBD><EFBFBD> Index <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
INDEX* pNext;
|
||||
/// <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><>ȣ
|
||||
INT nIndex;
|
||||
|
||||
/// Structure constructure
|
||||
INDEX(){
|
||||
pNext = NULL;
|
||||
nIndex = 0;
|
||||
}
|
||||
};
|
||||
|
||||
private:
|
||||
/// <20><><EFBFBD><EFBFBD> <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
|
||||
INT m_nCount;
|
||||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ҵ<EFBFBD> <20><>Ŷ <20><>
|
||||
INT m_nTotalCnt;
|
||||
/// <20><> <20><>Ŷ<EFBFBD><C5B6> <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
INT m_nAllocBufferSize;
|
||||
/// <20><> <20><>Ŷ<EFBFBD><C5B6> <20><>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
INT m_nPerPacketSize;
|
||||
|
||||
/// <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD>
|
||||
WCHAR m_strLogTitle[32];
|
||||
/// <20><>ü <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
PVOID m_pPakets;
|
||||
/// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> ó<><C3B3> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
INDEX* m_pFreeRoom;
|
||||
|
||||
Nave::NFSync m_Sync;
|
||||
};
|
||||
#pragma pack( pop, struct_packing_before )
|
||||
|
||||
|
||||
template <class TYPE>
|
||||
NFMemPool<TYPE>::NFMemPool( INT nTotalCnt, INT nAllocBufferSize )
|
||||
{
|
||||
assert( nTotalCnt > 0 );
|
||||
|
||||
m_nCount = 0;
|
||||
m_pFreeRoom = NULL;
|
||||
m_pPakets = NULL;
|
||||
|
||||
m_nTotalCnt = nTotalCnt; // MAXUSER * 2
|
||||
m_nAllocBufferSize = nAllocBufferSize; // 1024 + 64
|
||||
m_nPerPacketSize = sizeof(INDEX) + sizeof(TYPE) + m_nAllocBufferSize;
|
||||
|
||||
m_pPakets = VirtualAlloc( NULL,
|
||||
m_nTotalCnt * m_nPerPacketSize,
|
||||
MEM_RESERVE | MEM_COMMIT, // reserve and commit
|
||||
PAGE_READWRITE );
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
// < <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> > //
|
||||
// //
|
||||
// ----------------------------------------------- //
|
||||
// | INDEX | TYPE | m_nExBlockSize | //
|
||||
// ----------------------------------------------- //
|
||||
//////////////////////////////////////////////////////////
|
||||
|
||||
assert( m_pPakets );
|
||||
INDEX* pIndex = (INDEX*) m_pPakets;
|
||||
assert( pIndex );
|
||||
|
||||
//////////////////////////////////////////
|
||||
// init linear linked list for buffer pool
|
||||
|
||||
// <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
pIndex = (INDEX*) ((DWORD)pIndex + (m_nTotalCnt - 1) * m_nPerPacketSize);
|
||||
|
||||
// <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Linked List<73><74> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <20>ö<EFBFBD><C3B6><EFBFBD><EFBFBD><EFBFBD>
|
||||
for( INT i = m_nTotalCnt-1; i >= 0; i-- )
|
||||
{
|
||||
pIndex->pNext = m_pFreeRoom; // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> pNext = NULL<4C>̴<EFBFBD>
|
||||
pIndex->nIndex = i; // INDEX <20>۾<EFBFBD>
|
||||
|
||||
m_pFreeRoom = pIndex; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
#ifdef _DEBUG
|
||||
// <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ExBlockSize<7A><65> <20>κп<CEBA> <20><><EFBFBD><EFBFBD>Ÿ <20><><EFBFBD><EFBFBD> <20>۾<EFBFBD>
|
||||
if( m_nAllocBufferSize )
|
||||
memset((PVOID)( (DWORD)pIndex+sizeof(INDEX)+sizeof(TYPE)),
|
||||
(i%10+'0'),
|
||||
m_nAllocBufferSize );
|
||||
#endif
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> C8List <20><><EFBFBD><EFBFBD>Ʈ <20>̵<EFBFBD>
|
||||
pIndex = (INDEX*)((DWORD)pIndex - m_nPerPacketSize);
|
||||
}
|
||||
}
|
||||
|
||||
template <class TYPE>
|
||||
NFMemPool<TYPE>::~NFMemPool()
|
||||
{
|
||||
if(NULL != m_pPakets) VirtualFree( m_pPakets, 0, MEM_RELEASE );
|
||||
}
|
||||
|
||||
template <class TYPE>
|
||||
TYPE* NFMemPool<TYPE>::Alloc()
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
|
||||
INDEX* pIndex = NULL;
|
||||
TYPE* pType = NULL;
|
||||
|
||||
Nave::NFSyncLock CL(&m_Sync);
|
||||
|
||||
pIndex = m_pFreeRoom;
|
||||
if( pIndex != NULL )
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD>
|
||||
m_pFreeRoom = m_pFreeRoom->pNext;
|
||||
m_nCount++; // ī<><C4AB>Ʈ <20><><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20><><EFBFBD>ø<EFBFBD> Ÿ<><C5B8> <20><>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ
|
||||
pType = (TYPE*)(pIndex+1);
|
||||
|
||||
///////////////////////////////////////////
|
||||
// ġ<><C4A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD>
|
||||
// assert( m_nCount > 0 ); // make sure we don't overflow
|
||||
if(m_nCount > m_nTotalCnt)
|
||||
{
|
||||
LOG_ERROR((L"[%s] MemPool Alloc Overflow Count(%d) >= %d", m_strLogTitle, m_nCount, m_nTotalCnt));
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
LOG_ERROR((L"[%s] MemPool Alloc m_pFreeRoom = NULL, Count(%d)", m_strLogTitle, m_nCount));
|
||||
|
||||
return pType; // <20><><EFBFBD>ø<EFBFBD> Ÿ<><C5B8> <20><>ȯ
|
||||
}
|
||||
|
||||
template <class TYPE>
|
||||
BOOL NFMemPool<TYPE>::Free( TYPE *ptr )
|
||||
{
|
||||
Nave::NFSyncLock CL(&m_Sync);
|
||||
|
||||
BOOL bRet = FALSE;
|
||||
|
||||
INDEX* pIndex = ((INDEX*)(ptr))-1; // <20><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20>ִٸ<D6B4>
|
||||
if( m_nCount > 0 )
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ƾ
|
||||
pIndex->pNext = m_pFreeRoom;
|
||||
m_pFreeRoom = pIndex;
|
||||
m_nCount--; // <20><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> 1 <20><><EFBFBD><EFBFBD>
|
||||
bRet = TRUE; // <20><><EFBFBD><EFBFBD> ó<><C3B3> <20>˸<EFBFBD>
|
||||
}
|
||||
else
|
||||
LOG_ERROR((L"[%s] MemPool Free Faild Count(%d) <= 0", m_strLogTitle, m_nCount));
|
||||
|
||||
return bRet; // <20><><EFBFBD><EFBFBD> ó<><C3B3> <20><><EFBFBD><EFBFBD> <20><>ȯ
|
||||
}
|
||||
|
||||
template <class TYPE>
|
||||
INT NFMemPool<TYPE>::GetCount()
|
||||
{
|
||||
Nave::NFSyncLock CL(&m_Sync);
|
||||
|
||||
INT nRet = m_nCount; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
return nRet; // <20><>ȯ
|
||||
}
|
||||
|
||||
template <class TYPE>
|
||||
INT NFMemPool<TYPE>::GetEmpty()
|
||||
{
|
||||
Nave::NFSyncLock CL(&m_Sync);
|
||||
|
||||
INT nRet = m_nTotalCnt - m_nCount; // <20><><EFBFBD><EFBFBD>
|
||||
return nRet; // <20><>ȯ
|
||||
}
|
||||
|
||||
template <class TYPE>
|
||||
INT NFMemPool<TYPE>::GetIndex( TYPE *ptr )
|
||||
{
|
||||
Nave::NFSyncLock CL(&m_Sync);
|
||||
|
||||
INT nRet = 0; // <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
|
||||
INDEX* pIndex = ((INDEX*)(ptr))-1; // <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
nRet = pIndex->nIndex; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
return nRet; // <20><>ȯ
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user