home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 1
/
GoldFishApril1994_CD1.img
/
d2xx
/
d240
/
memlib
/
mwalcfre.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-08-28
|
3KB
|
126 lines
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
* |_o_o|\\ Copyright (c) 1989 The Software Distillery. *
* |. o.| || All Rights Reserved *
* | . | || Written by Doug Walker *
* | o | || The Software Distillery *
* | . |// 235 Trillingham Lane *
* ====== Cary, NC 27513 *
* BBS:(919)-471-6436 *
\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "mempriv.h"
extern struct MWGlobal mwg;
void *MWAllocMem(size, flags, file, line)
long size, flags;
char *file;
long line;
{
struct MWAlc *hd;
char *tmpchar;
int memtype;
if(!(mwg.flags & MWF_ACTIVE)) return(NULL);
if(!(mwg.flags & MWF_NOCHECK)) MWCheck();
memtype = (flags & MEMF_CHIP ? MWT_CHIP : MWT_FAST);
if(mwg.sum[memtype] + size > mwg.lim[memtype])
{
/* Over the limit, fail it */
if(mwg.dbfh)
{
MSG(mwg.dbfh, "MemWatch: ");
if(memtype == MWT_CHIP)
MSG(mwg.dbfh, "CHIP ");
else
MSG(mwg.dbfh, "FAST ");
MSG(mwg.dbfh, "memory allocation exceeds MWLimit amount\n");
}
return(NULL);
}
while(!(tmpchar = (char *)AllocMem(sizeof(struct MWAlc)+size, flags)))
{
if(mwg.freed) MWPurge();
else return(NULL);
}
hd = (struct MWAlc *)tmpchar;
hd->size = size;
hd->flags = flags;
hd->myflags = 0L;
hd->file = file;
hd->line = line;
memcpy((char *)&hd->header, MWHEADER, 4);
tmpchar += (sizeof(struct MWAlc)+size-4);
memcpy(tmpchar, MWTRAILER, 4);
if(!(flags & MEMF_CLEAR) && !(mwg.flags & MWF_NOATRASH))
memset(hd->memory, MWATRASH, size); /* Trash the memory */
hd->next = mwg.first;
mwg.first = hd;
if((mwg.sum[memtype] += size) > mwg.max[memtype])
mwg.max[memtype] = mwg.sum[memtype];
++(mwg.num[memtype]);
return((char *)hd->memory);
}
void MWFreeMem(mem, size, internal)
void *mem;
long size;
int internal;
{
struct MWAlc *mwa, *prev;
int memtype;
int error = 0;
if(!(mwg.flags & MWF_ACTIVE)) return;
if(!(mwg.flags & MWF_NOCHECK)) MWCheck();
for(prev = NULL, mwa = mwg.first;
mwa && mwa->memory != mem;
prev = mwa, mwa = mwa->next);
if(!mwa)
{
if(mwg.dbfh)
MWPrint(NULL, 1, (LONG)mem, size);
error = 1;
}
else if(!internal && mwa->size != size)
{
if(mwg.dbfh)
{
MWPrint(NULL, 2, size, 0);
MWPrint(mwa, 0, 0, 0);
}
error = 1;
}
if(error)
{
MWHold();
return;
}
memtype = (mwa->flags & MEMF_CHIP ? MWT_CHIP : MWT_FAST);
mwg.sum[memtype] -= mwa->size;
--mwg.num[memtype];
if(prev) prev->next = mwa->next;
else mwg.first = mwa->next;
if(!(mwg.flags & MWF_NOFTRASH))
memset(mwa->memory, MWFTRASH, mwa->size); /* Trash it */
if(mwg.flags & MWF_NOFKEEP)
FreeMem((char *)mwa, size + sizeof(struct MWAlc));
else
{
mwa->next = mwg.freed;
mwg.freed = mwa;
}
}