fix memory leak in scanner
instrument memory allocation with default_malloc git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1445 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
parent
5b4773d923
commit
c13d5d2655
46
C/alloc.c
46
C/alloc.c
@ -12,7 +12,7 @@
|
|||||||
* Last rev: *
|
* Last rev: *
|
||||||
* mods: *
|
* mods: *
|
||||||
* comments: allocating space *
|
* comments: allocating space *
|
||||||
* version:$Id: alloc.c,v 1.72 2005-07-06 15:10:02 vsc Exp $ *
|
* version:$Id: alloc.c,v 1.73 2005-11-08 13:51:15 vsc Exp $ *
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
#ifdef SCCS
|
#ifdef SCCS
|
||||||
static char SccsId[] = "%W% %G%";
|
static char SccsId[] = "%W% %G%";
|
||||||
@ -65,27 +65,64 @@ static char SccsId[] = "%W% %G%";
|
|||||||
|
|
||||||
#if USE_SYSTEM_MALLOC||USE_DL_MALLOC
|
#if USE_SYSTEM_MALLOC||USE_DL_MALLOC
|
||||||
|
|
||||||
|
long long unsigned int mallocs, reallocs, frees;
|
||||||
|
long long unsigned int tmalloc;
|
||||||
|
|
||||||
|
#include <malloc.h>
|
||||||
|
|
||||||
|
#if INSTRUMENT_MALLOC
|
||||||
|
static void
|
||||||
|
minfo(char mtype)
|
||||||
|
{
|
||||||
|
struct mallinfo minfo = mallinfo();
|
||||||
|
|
||||||
|
fprintf(stderr,"%c %lld (%lld), %lld, %lld %d/%d/%d\n", mtype, mallocs, tmalloc, reallocs, frees,minfo.arena,minfo.ordblks,minfo.fordblks);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
char *
|
char *
|
||||||
Yap_AllocCodeSpace(unsigned int size)
|
Yap_AllocCodeSpace(unsigned int size)
|
||||||
{
|
{
|
||||||
|
#if INSTRUMENT_MALLOC
|
||||||
|
if (mallocs % 1024*4 == 0)
|
||||||
|
minfo('A');
|
||||||
|
mallocs++;
|
||||||
|
tmalloc += size;
|
||||||
|
#endif
|
||||||
return malloc(size);
|
return malloc(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Yap_FreeCodeSpace(char *p)
|
Yap_FreeCodeSpace(char *p)
|
||||||
{
|
{
|
||||||
|
#if INSTRUMENT_MALLOC
|
||||||
|
if (frees % 1024*4 == 0)
|
||||||
|
minfo('F');
|
||||||
|
frees++;
|
||||||
|
#endif
|
||||||
free (p);
|
free (p);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *
|
char *
|
||||||
Yap_AllocAtomSpace(unsigned int size)
|
Yap_AllocAtomSpace(unsigned int size)
|
||||||
{
|
{
|
||||||
|
#if INSTRUMENT_MALLOC
|
||||||
|
if (mallocs % 1024*4 == 0)
|
||||||
|
minfo('A');
|
||||||
|
mallocs++;
|
||||||
|
tmalloc += size;
|
||||||
|
#endif
|
||||||
return malloc(size);
|
return malloc(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Yap_FreeAtomSpace(char *p)
|
Yap_FreeAtomSpace(char *p)
|
||||||
{
|
{
|
||||||
|
#if INSTRUMENT_MALLOC
|
||||||
|
if (frees % 1024*4 == 0)
|
||||||
|
minfo('F');
|
||||||
|
frees++;
|
||||||
|
#endif
|
||||||
free (p);
|
free (p);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -121,6 +158,11 @@ Yap_ExpandPreAllocCodeSpace(UInt sz0, void *cip)
|
|||||||
ScratchPad.sz =
|
ScratchPad.sz =
|
||||||
sz = sz + sz0;
|
sz = sz + sz0;
|
||||||
|
|
||||||
|
#if INSTRUMENT_MALLOC
|
||||||
|
if (reallocs % 1024*4 == 0)
|
||||||
|
minfo('R');
|
||||||
|
reallocs++;
|
||||||
|
#endif
|
||||||
while (!(ptr = realloc(ScratchPad.ptr, sz))) {
|
while (!(ptr = realloc(ScratchPad.ptr, sz))) {
|
||||||
#if USE_DL_MALLOC
|
#if USE_DL_MALLOC
|
||||||
if (!Yap_growheap((cip!=NULL), sz, cip)) {
|
if (!Yap_growheap((cip!=NULL), sz, cip)) {
|
||||||
@ -1136,7 +1178,7 @@ free(MALLOC_T ptr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
MALLOC_T
|
MALLOC_T
|
||||||
realloc(MALLOC_T ptr, size_t size)
|
XX realloc(MALLOC_T ptr, size_t size)
|
||||||
{
|
{
|
||||||
MALLOC_T new = malloc(size);
|
MALLOC_T new = malloc(size);
|
||||||
|
|
||||||
|
49
C/scanner.c
49
C/scanner.c
@ -128,12 +128,15 @@ typedef struct scanner_extra_alloc {
|
|||||||
void *filler;
|
void *filler;
|
||||||
} ScannerExtraBlock;
|
} ScannerExtraBlock;
|
||||||
|
|
||||||
|
#if USE_SYSTEM_MALLOC
|
||||||
|
#define EXPAND_TRAIL TRUE
|
||||||
|
#else
|
||||||
|
#define EXPAND_TRAIL FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
AllocScannerMemory(unsigned int size)
|
AllocScannerMemory(unsigned int size)
|
||||||
{
|
{
|
||||||
#if USE_SYSTEM_MALLOC
|
|
||||||
return malloc(AdjustSize(size));
|
|
||||||
#else
|
|
||||||
char *AuxSpScan;
|
char *AuxSpScan;
|
||||||
|
|
||||||
AuxSpScan = ScannerStack;
|
AuxSpScan = ScannerStack;
|
||||||
@ -152,7 +155,7 @@ AllocScannerMemory(unsigned int size)
|
|||||||
|
|
||||||
if (size > alloc_size)
|
if (size > alloc_size)
|
||||||
alloc_size = size;
|
alloc_size = size;
|
||||||
if(!Yap_growtrail (alloc_size, TRUE)) {
|
if(!EXPAND_TRAIL || !Yap_growtrail (alloc_size, TRUE)) {
|
||||||
struct scanner_extra_alloc *ptr;
|
struct scanner_extra_alloc *ptr;
|
||||||
|
|
||||||
if (!(ptr = (struct scanner_extra_alloc *)malloc(size+sizeof(ScannerExtraBlock)))) {
|
if (!(ptr = (struct scanner_extra_alloc *)malloc(size+sizeof(ScannerExtraBlock)))) {
|
||||||
@ -165,15 +168,11 @@ AllocScannerMemory(unsigned int size)
|
|||||||
}
|
}
|
||||||
ScannerStack = AuxSpScan+size;
|
ScannerStack = AuxSpScan+size;
|
||||||
return AuxSpScan;
|
return AuxSpScan;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
PopScannerMemory(char *block, unsigned int size)
|
PopScannerMemory(char *block, unsigned int size)
|
||||||
{
|
{
|
||||||
#if USE_SYSTEM_MALLOC
|
|
||||||
return free(block);
|
|
||||||
#else
|
|
||||||
if (block == ScannerStack-size) {
|
if (block == ScannerStack-size) {
|
||||||
ScannerStack -= size;
|
ScannerStack -= size;
|
||||||
} else if (block == (char *)(ScannerExtraBlocks+1)) {
|
} else if (block == (char *)(ScannerExtraBlocks+1)) {
|
||||||
@ -182,7 +181,6 @@ PopScannerMemory(char *block, unsigned int size)
|
|||||||
ScannerExtraBlocks = ptr->next;
|
ScannerExtraBlocks = ptr->next;
|
||||||
free(ptr);
|
free(ptr);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char *
|
char *
|
||||||
@ -656,7 +654,8 @@ Yap_scan_num(int (*Nxtch) (int))
|
|||||||
ch = Nxtch(-1);
|
ch = Nxtch(-1);
|
||||||
}
|
}
|
||||||
if (chtype[ch] != NU) {
|
if (chtype[ch] != NU) {
|
||||||
return(TermNil);
|
Yap_clean_tokenizer(NULL, NULL, NULL);
|
||||||
|
return TermNil;
|
||||||
}
|
}
|
||||||
cherr = 0;
|
cherr = 0;
|
||||||
out = get_num(&ch, &cherr, -1, Nxtch, Nxtch, ptr, 4096);
|
out = get_num(&ch, &cherr, -1, Nxtch, Nxtch, ptr, 4096);
|
||||||
@ -667,6 +666,7 @@ Yap_scan_num(int (*Nxtch) (int))
|
|||||||
else if (IsFloatTerm(out))
|
else if (IsFloatTerm(out))
|
||||||
out = MkFloatTerm(-FloatOfTerm(out));
|
out = MkFloatTerm(-FloatOfTerm(out));
|
||||||
}
|
}
|
||||||
|
Yap_clean_tokenizer(NULL, NULL, NULL);
|
||||||
if (Yap_ErrorMessage != NULL || ch != -1 || cherr)
|
if (Yap_ErrorMessage != NULL || ch != -1 || cherr)
|
||||||
return TermNil;
|
return TermNil;
|
||||||
return(out);
|
return(out);
|
||||||
@ -1040,30 +1040,6 @@ Yap_tokenizer(int inp_stream)
|
|||||||
return (l);
|
return (l);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if USE_SYSTEM_MALLOC
|
|
||||||
static
|
|
||||||
void clean_vtable(VarEntry *vt)
|
|
||||||
{
|
|
||||||
if (vt == NULL)
|
|
||||||
return;
|
|
||||||
clean_vtable(vt->VarLeft);
|
|
||||||
clean_vtable(vt->VarRight);
|
|
||||||
free(vt);
|
|
||||||
}
|
|
||||||
|
|
||||||
static
|
|
||||||
void clean_tokens(TokEntry *tk)
|
|
||||||
{
|
|
||||||
while (tk != NULL) {
|
|
||||||
TokEntry *ntk = tk->TokNext;
|
|
||||||
if (tk->Tok == Ord(String_tok)) {
|
|
||||||
free((void *)(tk->TokInfo));
|
|
||||||
}
|
|
||||||
free(tk);
|
|
||||||
tk = ntk;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Yap_clean_tokenizer(TokEntry *tokstart, VarEntry *vartable, VarEntry *anonvartable)
|
Yap_clean_tokenizer(TokEntry *tokstart, VarEntry *vartable, VarEntry *anonvartable)
|
||||||
{
|
{
|
||||||
@ -1073,8 +1049,5 @@ Yap_clean_tokenizer(TokEntry *tokstart, VarEntry *vartable, VarEntry *anonvartab
|
|||||||
free(ptr);
|
free(ptr);
|
||||||
ptr = next;
|
ptr = next;
|
||||||
}
|
}
|
||||||
clean_vtable(vartable);
|
|
||||||
clean_vtable(anonvartable);
|
|
||||||
clean_tokens(tokstart);
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
@ -255,11 +255,7 @@ Term STD_PROTO(Yap_VarNames,(VarEntry *,Term));
|
|||||||
|
|
||||||
/* routines in scanner.c */
|
/* routines in scanner.c */
|
||||||
TokEntry STD_PROTO(*Yap_tokenizer,(int));
|
TokEntry STD_PROTO(*Yap_tokenizer,(int));
|
||||||
#if USE_SYSTEM_MALLOC
|
|
||||||
void STD_PROTO(Yap_clean_tokenizer,(TokEntry *, VarEntry *, VarEntry *));
|
void STD_PROTO(Yap_clean_tokenizer,(TokEntry *, VarEntry *, VarEntry *));
|
||||||
#else
|
|
||||||
#define Yap_clean_tokenizer(T,V,A)
|
|
||||||
#endif
|
|
||||||
Term STD_PROTO(Yap_scan_num,(int (*)(int)));
|
Term STD_PROTO(Yap_scan_num,(int (*)(int)));
|
||||||
char STD_PROTO(*Yap_AllocScannerMemory,(unsigned int));
|
char STD_PROTO(*Yap_AllocScannerMemory,(unsigned int));
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user