117 lines
2.5 KiB
C
117 lines
2.5 KiB
C
/*++
|
||
|
||
Copyright (c) 1989 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
heapmgr.c
|
||
|
||
Abstract:
|
||
|
||
This module contains debugging routines for the MUP use of
|
||
non-paged pool.
|
||
|
||
Author:
|
||
|
||
Manny Weiser (mannyw) 27-Jan-1992
|
||
|
||
--*/
|
||
|
||
#include "mup.h"
|
||
|
||
#if MUPDBG
|
||
|
||
LIST_ENTRY PagedPoolList = { &PagedPoolList, &PagedPoolList };
|
||
|
||
typedef struct _POOL_HEADER {
|
||
LIST_ENTRY ListEntry;
|
||
ULONG RequestedSize;
|
||
BLOCK_TYPE BlockType;
|
||
PVOID Caller;
|
||
PVOID CallersCaller;
|
||
} POOL_HEADER, *PPOOL_HEADER;
|
||
|
||
struct _MEMORY_STATISTICS {
|
||
ULONG BytesInUse;
|
||
ULONG TotalBytesAllocated;
|
||
ULONG MaxBytesInUse;
|
||
ULONG TotalBytesFreed;
|
||
ULONG BlocksInUse;
|
||
ULONG TotalBlocksAllocated;
|
||
ULONG MaxBlocksInUse;
|
||
ULONG TotalBlocksFreed;
|
||
} MupMemoryUsage = { 0, 0, 0, 0, 0, 0, 0, 0 };
|
||
|
||
#ifdef ALLOC_PRAGMA
|
||
#pragma alloc_text( PAGE, MupAllocatePoolDebug )
|
||
#pragma alloc_text( PAGE, MupFreePoolDebug )
|
||
#endif
|
||
|
||
PVOID
|
||
MupAllocatePoolDebug (
|
||
IN POOL_TYPE PoolType,
|
||
IN CLONG BlockSize,
|
||
IN BLOCK_TYPE BlockType
|
||
)
|
||
{
|
||
PPOOL_HEADER header;
|
||
KIRQL oldIrql;
|
||
|
||
PAGED_CODE();
|
||
|
||
header = FsRtlAllocatePool( PoolType, sizeof(POOL_HEADER) + BlockSize );
|
||
|
||
header->RequestedSize = BlockSize;
|
||
header->BlockType = BlockType;
|
||
RtlGetCallersAddress( &header->Caller, &header->CallersCaller );
|
||
|
||
ACQUIRE_LOCK( &MupDebugLock );
|
||
InsertTailList( &PagedPoolList, &header->ListEntry );
|
||
|
||
MupMemoryUsage.TotalBlocksAllocated += 1;
|
||
MupMemoryUsage.BlocksInUse += 1;
|
||
MupMemoryUsage.TotalBytesAllocated += BlockSize;
|
||
MupMemoryUsage.BytesInUse += BlockSize;
|
||
|
||
if ( MupMemoryUsage.BlocksInUse > MupMemoryUsage.MaxBlocksInUse ) {
|
||
MupMemoryUsage.MaxBlocksInUse = MupMemoryUsage.BlocksInUse;
|
||
}
|
||
|
||
if ( MupMemoryUsage.BytesInUse > MupMemoryUsage.MaxBytesInUse ) {
|
||
MupMemoryUsage.MaxBytesInUse = MupMemoryUsage.BytesInUse;
|
||
}
|
||
|
||
RELEASE_LOCK( &MupDebugLock );
|
||
|
||
return (PVOID)(header + 1);
|
||
|
||
} // MupAllocatePagedPoolDebug
|
||
|
||
VOID
|
||
MupFreePoolDebug (
|
||
IN PVOID P
|
||
)
|
||
{
|
||
PPOOL_HEADER header;
|
||
KIRQL oldIrql;
|
||
|
||
PAGED_CODE();
|
||
|
||
header = (PPOOL_HEADER)P - 1;
|
||
|
||
ACQUIRE_LOCK( &MupDebugLock );
|
||
RemoveEntryList( &header->ListEntry );
|
||
|
||
MupMemoryUsage.TotalBlocksFreed += 1;
|
||
MupMemoryUsage.BlocksInUse -= 1;
|
||
MupMemoryUsage.TotalBytesFreed += header->RequestedSize;
|
||
MupMemoryUsage.BytesInUse -= header->RequestedSize;
|
||
RELEASE_LOCK( &MupDebugLock );
|
||
|
||
ExFreePool( header );
|
||
|
||
} // MupFreePagedPoolDebug
|
||
|
||
#endif // MUPDBG
|
||
|