class LOOKASIDE_LIST { private: LAL_BLOCK_HEADER m_sMemoryBlockList; DWORD m_dwObjectSize; WORD m_wMaxObjectNum; WORD m_wDefaultObjectNum; WORD m_wIncreaseObjectNum;
BOOL AddBlock( IN OUT PLAL_BLOCK_HEADER pBlockHeader, IN OUT PLAL_OBJECT_HEADER pObjectHeader, IN CONST DWORD dwObjSize, IN CONST WORD wObjNum); public: enum { PER_BLOCK_OBJ_MAX_NUM = 512, MEM_STATUS_FREE = 0, MEM_STATUS_ALLOCATED = 1, }; LAL_OBJECT_HEADER m_sFreeObjectList; LAL_OBJECT_HEADER m_sAllocatedObjectList; DWORD m_dwRealObjectSize; public: LOOKASIDE_LIST(); ~LOOKASIDE_LIST(); BOOL InitializeLookasideList( IN CONST DWORD dwObjectSize, IN CONST WORD wMaxObjNum, IN CONST WORD wDefaultObjNum, IN CONST WORD wIncreaseObjectNum); BOOL IncreaseBlock(VOID); };
static inline PLAL_MEMORY_OBJECT BodyToHeader ( IN PVOID addr );
PVOID LalAlloc( IN LOOKASIDE_LIST* pLookaside);
VOID LalFree( IN LOOKASIDE_LIST* pLookaside, IN PVOID pMemory);
#endif
/* * PROJECT: hryEngine.LookasideList * PURPOSE: memory pool by lookaside list * PROGRAMMERS: Liao Huaifu(279670696@qq.com,deuglhf@hotmail.com) Shanghai 09/9-26~09/10-8 */
BOOL LOOKASIDE_LIST::InitializeLookasideList( IN CONST DWORD dwObjectSize, IN CONST WORD wMaxObjNum, IN CONST WORD wDefaultObjNum, IN CONST WORD wIncreaseObjectNum) { m_dwObjectSize = dwObjectSize; m_wMaxObjectNum = wMaxObjNum; m_wDefaultObjectNum = wDefaultObjNum; m_wIncreaseObjectNum = wIncreaseObjectNum;
WORD num = 0; (wDefaultObjNum%PER_BLOCK_OBJ_MAX_NUM == 0)? num = wDefaultObjNum/PER_BLOCK_OBJ_MAX_NUM : num = wDefaultObjNum/PER_BLOCK_OBJ_MAX_NUM + 1; for(int i=0;i<num;i++) { AddBlock(&m_sMemoryBlockList,&m_sFreeObjectList,m_dwObjectSize,PER_BLOCK_OBJ_MAX_NUM); } returnTRUE; }
BOOL LOOKASIDE_LIST::AddBlock( IN OUT PLAL_BLOCK_HEADER pBlockHeader, IN OUT PLAL_OBJECT_HEADER pObjectHeader, IN CONST DWORD dwObjSize, IN CONST WORD wObjNum) { if(!pBlockHeader ||!pObjectHeader ||!dwObjSize ||!dwObjSize) { returnFALSE; }