You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
3.1 KiB
142 lines
3.1 KiB
/***
|
|
*memory.cpp - RTC support
|
|
*
|
|
* Copyright (c) 1998-2001, Microsoft Corporation. All rights reserved.
|
|
*
|
|
*
|
|
*Revision History:
|
|
* 07-28-98 JWM Module incorporated into CRTs (from KFrei)
|
|
* 12-01-98 KBF Added some debugging info for _RTC_DEBUG
|
|
* 12-02-98 KBF Fixed MC 11240
|
|
* 05-11-99 KBF Error if RTC support define not enabled
|
|
* 05-26-99 KBF Wrapped in _RTC_ADVMEM, simplified due to loss of -RTClv
|
|
*
|
|
****/
|
|
|
|
#ifndef _RTC
|
|
#error RunTime Check support not enabled!
|
|
#endif
|
|
|
|
#include "rtcpriv.h"
|
|
|
|
#ifdef _RTC_ADVMEM
|
|
|
|
#ifdef _RTC_DEBUG
|
|
|
|
#include <windows.h>
|
|
|
|
#pragma intrinsic(strcpy)
|
|
#pragma intrinsic(strcat)
|
|
|
|
char *IntToString(int i)
|
|
{
|
|
static char buf[15];
|
|
bool neg = i < 0;
|
|
int pos = 14;
|
|
buf[14] = 0;
|
|
do {
|
|
int val = i % 16;
|
|
if (val < 10)
|
|
val += '0';
|
|
else
|
|
val = val - 10 + 'A';
|
|
buf[--pos] = val;
|
|
i /= 16;
|
|
} while (i);
|
|
if (neg)
|
|
buf[--pos] = '-';
|
|
return &buf[pos];
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
void __cdecl
|
|
_RTC_Allocate(void *addr, size_t size, short level)
|
|
{
|
|
if (!addr)
|
|
return;
|
|
|
|
#ifdef _RTC_DEBUG
|
|
char buf[88];
|
|
strcpy(buf, IntToString((int)retaddr));
|
|
strcat(buf, " Allocate Memory located @ ");
|
|
strcat(buf, IntToString((int)addr));
|
|
strcat(buf, " of size ");
|
|
strcat(buf, IntToString((int)size));
|
|
strcat(buf, "\n");
|
|
OutputDebugString(buf);
|
|
#endif
|
|
|
|
_RTC_HeapBlock key(addr, level);
|
|
_RTC_HeapBlock *hb = _RTC_heapblocks->find(&key);
|
|
|
|
if (!hb)
|
|
{
|
|
hb = new _RTC_HeapBlock(addr, level, size);
|
|
_RTC_heapblocks->add(hb);
|
|
|
|
} else
|
|
{
|
|
hb->size(size);
|
|
}
|
|
|
|
if (level)
|
|
{
|
|
_RTC_Container *parent = _RTC_memhier->AddChild(hb);
|
|
|
|
if (parent && parent->info())
|
|
{
|
|
hb->tag(_RTC_MSRenumberShadow((memptr)addr, size, parent->info()->tag()));
|
|
return;
|
|
}
|
|
}
|
|
hb->tag(_RTC_MSAllocShadow((memptr)addr, size, IDX_STATE_FULLY_KNOWN));
|
|
}
|
|
|
|
void __cdecl
|
|
_RTC_Free(void *mem, short level)
|
|
{
|
|
if (!mem)
|
|
return;
|
|
|
|
|
|
#ifdef _RTC_DEBUG
|
|
char buf[88];
|
|
strcpy(buf, IntToString((int)retaddr));
|
|
strcat(buf, " Freeing Memory located at ");
|
|
strcat(buf, IntToString((int)mem));
|
|
strcat(buf, "\n");
|
|
OutputDebugString(buf);
|
|
#endif
|
|
|
|
bool fail = false;
|
|
|
|
_RTC_HeapBlock key(mem, level);
|
|
_RTC_HeapBlock *hb = _RTC_heapblocks->find(&key);
|
|
|
|
if (hb)
|
|
{
|
|
if (level)
|
|
{
|
|
_RTC_Container *parent = _RTC_memhier->DelChild(hb);
|
|
|
|
if (parent)
|
|
{
|
|
if (parent->info())
|
|
_RTC_MSRestoreShadow((memptr)(hb->addr()), hb->size(), parent->info()->tag());
|
|
else
|
|
_RTC_MSFreeShadow((memptr)(hb->addr()), hb->size());
|
|
}
|
|
} else
|
|
{
|
|
_RTC_heapblocks->del(hb);
|
|
_RTC_MSFreeShadow((memptr)(hb->addr()), hb->size());
|
|
delete hb;
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif // _RTC_ADVMEM
|
|
|