136 lines
3.5 KiB
C++
136 lines
3.5 KiB
C++
|
/**********************************************************************/
|
||
|
/** Microsoft Windows NT **/
|
||
|
/** Copyright(c) Microsoft Corp., 1997 **/
|
||
|
/**********************************************************************/
|
||
|
|
||
|
/*
|
||
|
madel.hxx
|
||
|
|
||
|
This module contains the definitions for a memory allocation class that doesn't
|
||
|
delete memory until the class goes away.
|
||
|
|
||
|
|
||
|
|
||
|
FILE HISTORY:
|
||
|
1/12/98 michth created
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
To build this:
|
||
|
The dll which builds this must declare in one of it's source files.
|
||
|
|
||
|
DECLARE_DEBUG_VARIABLE();
|
||
|
DECLARE_DEBUG_PRINTS_OBJECT();
|
||
|
|
||
|
It also must include these lines in source files prior to including madel.hxx
|
||
|
#define DLL_IMPLEMENTATION
|
||
|
#define IMPLEMENTATION_EXPORT
|
||
|
|
||
|
It also must execute this before calling the constructor.
|
||
|
CREATE_DEBUG_PRINT_OBJECT("MemTest");
|
||
|
|
||
|
There seems to be a build problem if irtlmisc.h is included twice.
|
||
|
*/
|
||
|
|
||
|
|
||
|
#ifndef _MADEL_HXX_
|
||
|
#define _MADEL_HXX_
|
||
|
|
||
|
#include <manodel.hxx>
|
||
|
|
||
|
#define MADEL_USE_PROCESS_HEAP USE_PROCESS_HEAP
|
||
|
#define MADEL_DEFAULT_RESERVE_NUM 100
|
||
|
#define MADEL_DEFAULT_MIN_BLOCK_MULTIPLE 5
|
||
|
#define MADEL_DEFAULT_MAX_BLOCK_MULTIPLE 5
|
||
|
#define MADEL_MAX_ALLOWED_BLOCK_MULTIPLE 128
|
||
|
#define MADEL_MAX_ALLOWED_SIZE 0xffffff
|
||
|
|
||
|
#define GREATER_OF(P1, P2) (((P1) >= (P2)) ? (P1) : (P2))
|
||
|
#define LESSER_OF(P1, P2) (((P1) <= (P2)) ? (P1) : (P2))
|
||
|
|
||
|
typedef struct _MADEL_BLOCK_HEADER {
|
||
|
LIST_ENTRY m_leBlockList;
|
||
|
PVOID pvFreeList;
|
||
|
BYTE byteBlockMultiple;
|
||
|
BYTE byteNumFree;
|
||
|
BYTE byteAlignBytes;
|
||
|
} MADEL_BLOCK_HEADER, *PMADEL_BLOCK_HEADER;
|
||
|
|
||
|
typedef struct _MADEL_ALLOC_HEADER {
|
||
|
DWORD dwSize : 24;
|
||
|
DWORD bNumAlloc : 7 ;
|
||
|
DWORD bMadelAlloc : 1;
|
||
|
} MADEL_ALLOC_HEADER, *PMADEL_ALLOC_HEADER;
|
||
|
|
||
|
class IRTL_DLLEXP MEMORY_ALLOC_DELETE;
|
||
|
|
||
|
class IRTL_DLLEXP MEMORY_ALLOC_DELETE
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
MEMORY_ALLOC_DELETE( DWORD dwAllocSize,
|
||
|
DWORD dwAlignment = 4,
|
||
|
DWORD dwReserveNum = MADEL_DEFAULT_RESERVE_NUM,
|
||
|
DWORD dwMinBlockMultiple = MADEL_DEFAULT_MIN_BLOCK_MULTIPLE,
|
||
|
DWORD dwMaxBlockMultiple = MADEL_DEFAULT_MAX_BLOCK_MULTIPLE,
|
||
|
HANDLE hHeap = MADEL_USE_PROCESS_HEAP);
|
||
|
|
||
|
~MEMORY_ALLOC_DELETE();
|
||
|
|
||
|
PVOID Alloc();
|
||
|
|
||
|
BOOL Free (PVOID pvMem);
|
||
|
|
||
|
private:
|
||
|
|
||
|
DWORD m_dwAllocSize;
|
||
|
DWORD m_dwBlockMultiple;
|
||
|
HANDLE m_hHeap;
|
||
|
DWORD m_dwNumAlloced;
|
||
|
DWORD m_dwNumFree;
|
||
|
DWORD m_dwReserveNum;
|
||
|
DWORD m_dwNumBlocks;
|
||
|
DWORD m_dwBlockHeaderSpace;
|
||
|
DWORD m_dwAllocHeaderSpace;
|
||
|
DWORD m_dwMaxBlockMultiple;
|
||
|
DWORD m_dwAlignment;
|
||
|
DWORD m_dwAlignBytes;
|
||
|
LIST_ENTRY m_leBlockList;
|
||
|
LIST_ENTRY m_leFreeList;
|
||
|
LIST_ENTRY m_leDeleteList;
|
||
|
|
||
|
CRITICAL_SECTION m_csLock;
|
||
|
|
||
|
BOOL m_bMaxBlockMultipleEqualsMin;
|
||
|
BYTE m_byteLeastAllocsOnFreeList;
|
||
|
|
||
|
VOID GetNewBlockMultiple();
|
||
|
PVOID GetAllocFromList(PLIST_ENTRY pleListHead);
|
||
|
BOOL AllocBlock();
|
||
|
VOID CreateBlockFreeList(PMADEL_BLOCK_HEADER pmbhNewBlock);
|
||
|
VOID LockThis( VOID ) { EnterCriticalSection(&m_csLock);}
|
||
|
VOID UnlockThis( VOID ) { LeaveCriticalSection(&m_csLock);}
|
||
|
|
||
|
inline VOID
|
||
|
AlignAdjust(DWORD &rdwSize,
|
||
|
DWORD dwAlignment);
|
||
|
|
||
|
#ifdef _WIN64
|
||
|
inline VOID
|
||
|
AlignAdjust(ULONG_PTR &rSize,
|
||
|
ULONG_PTR Alignment);
|
||
|
#endif
|
||
|
|
||
|
inline VOID
|
||
|
InitAllocHead(PMADEL_ALLOC_HEADER pvAlloc,
|
||
|
DWORD dwAllocIndex);
|
||
|
|
||
|
inline PMADEL_BLOCK_HEADER
|
||
|
GetBlockFromAlloc(PMADEL_ALLOC_HEADER pmahMem);
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
#endif // !_MADEL_
|