2025-11-28 00:35:46 +09:00

129 lines
2.8 KiB
C

/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (C) 1995 - 2000. Microsoft Corporation. All rights reserved.
Module Name:
appmema.c
Abstract:
application memory performance counter interface functions
This file contains the memory allocation function "wrappers"
to allow monitoring of the memory usage by a performance monitoring
application (e.g. PERFMON).
--*/
#include <windows.h>
#include "appmema.h"
#include "..\pub\appmem.h"
HGLOBAL
GlobalAllocP(
UINT fuFlags,
DWORD cbBytes
)
{
HGLOBAL hReturn;
DWORD dwSize;
hReturn = GlobalAlloc(fuFlags, cbBytes);
if (hReturn != NULL)
{
// only collect statistics on successful calls
if (pAppData != NULL)
{
// only update data if data block is valid
// update call count
pAppData->dwAllocCalls ++;
dwSize = (DWORD) GlobalSize(hReturn);
pAppData->dwApplicationBytes += dwSize;
}
}
return hReturn;
}
HGLOBAL
GlobalFreeP(
HGLOBAL hglbMem
)
{
HGLOBAL hReturn = NULL;
DWORD dwSize;
// get size of block before freeing it
dwSize = (DWORD) GlobalSize(hglbMem);
if (dwSize > 0)
{
// size was obtained OK so free the block
hReturn = GlobalFree(hglbMem);
if (hReturn == NULL)
{
// memory was freed
if (pAppData != NULL)
{
// update call count
pAppData->dwFreeCalls ++;
pAppData->dwApplicationBytes -= dwSize;
}
}
else
{
// memory was not freed so don't change data
}
}
else
{
// unable to read memory size
}
return hReturn;
}
HGLOBAL
GlobalReAllocP(
HGLOBAL hglbMem,
DWORD cbBytes,
UINT fuFlags
)
{
HGLOBAL hReturn;
DWORD dwBeforeSize = 0;
DWORD dwAfterSize = 0;
// get size of block before re-alloc-ing it
dwBeforeSize = (DWORD) GlobalSize(hglbMem);
if (dwBeforeSize > 0)
{
// size was obtained OK so realloc the block
hReturn = GlobalReAlloc(hglbMem, cbBytes, fuFlags);
if (hReturn != NULL)
{
// memory was re alloc'd so get the new size
dwAfterSize = (DWORD) GlobalSize(hReturn);
}
else
{
// memory was not re-alloced so set after size to 0
}
if (pAppData != NULL)
{
// update call count
pAppData->dwReAllocCalls ++;
pAppData->dwApplicationBytes -= dwBeforeSize;
pAppData->dwApplicationBytes += dwAfterSize;
}
}
else
{
// unable to read memory size nothing has changed
// return original pointer
hReturn = hglbMem;
}
return hReturn;
}