📄 ymem.c
字号:
/* ymem.c
*
* (C) Copyright Apr 15 1995, Edmond J. Breen.
* ALL RIGHTS RESERVED.
* This code may be copied for personal, non-profit use only.
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "xalloc.h"
#include "assertp.h"
#include "global.h"
char XGMARK = 0;
#define freemark -1
/*CUT XALLOC_struct*/
typedef struct {
size_t nbytes; /*sizeof allocated area*/
void * p; /*pointer to allocated area*/
char mark; /*memory mark: used by garbage collector*/
char * crt_file; /*Name of file which asked to creat the memory*/
int crt_lineno; /*Line no from which the creation call was made*/
unsigned long alloc_num; /*allocation entry number*/
}XALLOC;
/*END CUT*/
typedef struct {
int dbuf_no;
int top;
XALLOC *dbuf;
}memtab_t;
#define MTABSZ 203
memtab_t MTAB[MTABSZ];
#define BNO(p) ((unsigned long)p % MTABSZ)
#define BUFINC 10
#define STDMSG ("line %d in file %s: "\
"tot_seen %lu\n",lineno,file,(unsigned long)tot_seen);
/*CUT XALLOC_array*/
unsigned long EiC_tot_memory = 0L; /*total amount of memory allocated in bytes*/
size_t EiC_tot_alloc = 0; /*total number of current memory allocations*/
size_t tot_seen = 0; /*total number of allocations made */
/*END CUT*/
int EiC_getMemMark(unsigned long item)
{
/* given an item number, return its mark value */
size_t i,k;
for(k=0;k<MTABSZ;k++)
for(i=0;i<MTAB[k].dbuf_no;++i)
if(MTAB[k].dbuf[i].alloc_num == item)
return MTAB[k].dbuf[i].mark;
return -1;
}
void EiC_freeMemItem(unsigned long item)
{
size_t i,k;
for(k=0;k<MTABSZ;k++)
for(i=0;i<MTAB[k].dbuf_no;++i)
if(MTAB[k].dbuf[i].alloc_num == item) {
xfree(MTAB[k].dbuf[i].p);
return ;
}
}
void EiC_ydumpnonmark(char *outfile, char mark)
{
size_t i,k;
for(k=0;k<MTABSZ;k++)
for(i=0;i<MTAB[k].dbuf_no;++i)
if(MTAB[k].dbuf[i].mark >= 0) {
if(MTAB[k].dbuf[i].mark != mark) {
printf("item %ld Create line %d file %s nbytes %lu\n",
MTAB[k].dbuf[i].alloc_num,
MTAB[k].dbuf[i].crt_lineno,
MTAB[k].dbuf[i].crt_file,
(unsigned long)MTAB[k].dbuf[i].nbytes);
MTAB[k].dbuf[i].mark = MEM_LEAK;
} else
MTAB[k].dbuf[i].mark = 0;
}
}
size_t EiC_xalloc_NextEntryNum(void)
{
return tot_seen + 1;
}
void EiC_xalloc_CleanUp(size_t bot, size_t top)
{
size_t i,k;
for(k=0;k<MTABSZ;k++)
for(i=0;i<MTAB[k].dbuf_no;++i)
if(MTAB[k].dbuf[i].p)
if(MTAB[k].dbuf[i].alloc_num >= bot &&
MTAB[k].dbuf[i].alloc_num < top &&
MTAB[k].dbuf[i].mark != eicstay)
xfree(MTAB[k].dbuf[i].p);
}
void EiC_xfreemark(char mark)
{
size_t i,k;
for(k=0;k<MTABSZ;k++)
for(i=0;i<MTAB[k].dbuf_no;++i)
if(MTAB[k].dbuf[i].mark == mark)
xfree(MTAB[k].dbuf[i].p);
}
int EiC_ymark(char *file,
int lineno, void *p, char mark)
{
int found;
found = xlookup(p);
assertp(found < 0,STDMSG);
MTAB[BNO(p)].dbuf[found].mark = mark;
return 1;
}
static int install(char *file,
int lineno,
void *p,
size_t nbytes)
{
int bno;
unsigned i;
extern int EiC_memtraceON;
bno = BNO(p);
for(i=0;i<MTAB[bno].dbuf_no;++i) { /* search for empty slot */
if(MTAB[bno].dbuf[i].p == NULL)
break;
}
if(i >= MTAB[bno].top) {
MTAB[bno].top += BUFINC;
if(!MTAB[bno].dbuf)
MTAB[bno].dbuf = (XALLOC*)(calloc)(sizeof(XALLOC),BUFINC + 1);
else
MTAB[bno].dbuf = (XALLOC*)realloc(MTAB[bno].dbuf,
sizeof(XALLOC) * (MTAB[bno].top+1));
}
assertp(MTAB[bno].dbuf == NULL,("Out of Memory"));
MTAB[bno].dbuf[i].p = p;
MTAB[bno].dbuf[i].nbytes = nbytes;
MTAB[bno].dbuf[i].mark = XGMARK;
MTAB[bno].dbuf[i].crt_file = file;
MTAB[bno].dbuf[i].crt_lineno = lineno;
EiC_tot_memory += nbytes;
EiC_tot_alloc++;
if(i>=MTAB[bno].dbuf_no)
MTAB[bno].dbuf_no++;
MTAB[bno].dbuf[i].alloc_num = ++tot_seen;
if(EiC_memtraceON)
printf("%lu ",(unsigned long)tot_seen);
return i;
}
int xlookup(void *p)
{
unsigned i,bno = BNO(p);
for(i=0; i< MTAB[bno].dbuf_no;i++)
if(MTAB[bno].dbuf[i].mark >= 0) {
if(MTAB[bno].dbuf[i].p == p)
return i;
}
return -1;
}
void * EiC_ymalloc(char *file, int lineno, size_t nbytes)
{
void * pheap;
pheap = (malloc)(nbytes);
assertp(pheap==NULL,STDMSG);
install(file,lineno,pheap,nbytes);
return pheap;
}
void * EiC_ycalloc(char *file,
int lineno,
size_t nelems,
size_t elems)
{
void * pheap;
pheap = EiC_ymalloc(file, lineno,nelems * elems);
if(pheap)
memset(pheap,0,nelems * elems);
return pheap;
}
void * EiC_yrealloc(char *file, int lineno, void *oldp, size_t nbytes)
{
void *newp;
int found, d;
if(oldp != NULL) {
found = xlookup(oldp);
assertp(found < 0,STDMSG);
}
newp = realloc(oldp,nbytes);
assertp(nbytes && newp == NULL,("line %d in file %s\n",lineno,file));
if(oldp) {
int bno = BNO(oldp);
d = nbytes - MTAB[bno].dbuf[found].nbytes;
if(bno != BNO(newp)) {
int i;
MTAB[bno].dbuf[found].p = NULL;
MTAB[bno].dbuf[found].mark = freemark;
i = install(file,lineno,newp,nbytes);
/* retain creation time stamp */
MTAB[BNO(newp)].dbuf[i].alloc_num
= MTAB[bno].dbuf[found].alloc_num;
} else {
MTAB[bno].dbuf[found].p = newp;
MTAB[bno].dbuf[found].nbytes = nbytes;
MTAB[bno].dbuf[found].crt_file = file;
MTAB[bno].dbuf[found].crt_lineno = lineno;
}
EiC_tot_memory += d;
} else
install(file,lineno,newp,nbytes);
return newp;
}
void EiC_yfree(char *file, int lineno, void * p)
{
int found,bno = BNO(p);
found = xlookup(p);
if(found < 0) {
/*EiC_warningerror("free non-xalloc ptr: from %s line %d", file, lineno);*/
(free)(p);
} else {
EiC_tot_memory -= MTAB[bno].dbuf[found].nbytes;
EiC_tot_alloc--;
(free)(p);
MTAB[bno].dbuf[found].p = NULL;
MTAB[bno].dbuf[found].mark = freemark;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -