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:
vsc
2005-11-08 13:51:15 +00:00
parent 5b4773d923
commit c13d5d2655
3 changed files with 55 additions and 44 deletions

View File

@@ -128,12 +128,15 @@ typedef struct scanner_extra_alloc {
void *filler;
} ScannerExtraBlock;
#if USE_SYSTEM_MALLOC
#define EXPAND_TRAIL TRUE
#else
#define EXPAND_TRAIL FALSE
#endif
static char *
AllocScannerMemory(unsigned int size)
{
#if USE_SYSTEM_MALLOC
return malloc(AdjustSize(size));
#else
char *AuxSpScan;
AuxSpScan = ScannerStack;
@@ -152,7 +155,7 @@ AllocScannerMemory(unsigned int size)
if (size > alloc_size)
alloc_size = size;
if(!Yap_growtrail (alloc_size, TRUE)) {
if(!EXPAND_TRAIL || !Yap_growtrail (alloc_size, TRUE)) {
struct scanner_extra_alloc *ptr;
if (!(ptr = (struct scanner_extra_alloc *)malloc(size+sizeof(ScannerExtraBlock)))) {
@@ -165,15 +168,11 @@ AllocScannerMemory(unsigned int size)
}
ScannerStack = AuxSpScan+size;
return AuxSpScan;
#endif
}
static void
PopScannerMemory(char *block, unsigned int size)
{
#if USE_SYSTEM_MALLOC
return free(block);
#else
if (block == ScannerStack-size) {
ScannerStack -= size;
} else if (block == (char *)(ScannerExtraBlocks+1)) {
@@ -182,7 +181,6 @@ PopScannerMemory(char *block, unsigned int size)
ScannerExtraBlocks = ptr->next;
free(ptr);
}
#endif
}
char *
@@ -656,7 +654,8 @@ Yap_scan_num(int (*Nxtch) (int))
ch = Nxtch(-1);
}
if (chtype[ch] != NU) {
return(TermNil);
Yap_clean_tokenizer(NULL, NULL, NULL);
return TermNil;
}
cherr = 0;
out = get_num(&ch, &cherr, -1, Nxtch, Nxtch, ptr, 4096);
@@ -667,6 +666,7 @@ Yap_scan_num(int (*Nxtch) (int))
else if (IsFloatTerm(out))
out = MkFloatTerm(-FloatOfTerm(out));
}
Yap_clean_tokenizer(NULL, NULL, NULL);
if (Yap_ErrorMessage != NULL || ch != -1 || cherr)
return TermNil;
return(out);
@@ -1040,30 +1040,6 @@ Yap_tokenizer(int inp_stream)
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
Yap_clean_tokenizer(TokEntry *tokstart, VarEntry *vartable, VarEntry *anonvartable)
{
@@ -1073,8 +1049,5 @@ Yap_clean_tokenizer(TokEntry *tokstart, VarEntry *vartable, VarEntry *anonvartab
free(ptr);
ptr = next;
}
clean_vtable(vartable);
clean_vtable(anonvartable);
clean_tokens(tokstart);
}
#endif