memory management fixes

git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1121 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
vsc 2004-09-03 03:11:09 +00:00
parent be83a4a309
commit 6711d93b9c
11 changed files with 138 additions and 88 deletions

View File

@ -12,7 +12,7 @@
* Last rev: * * Last rev: *
* mods: * * mods: *
* comments: allocating space * * comments: allocating space *
* version:$Id: alloc.c,v 1.56 2004-08-11 16:14:51 vsc Exp $ * * version:$Id: alloc.c,v 1.57 2004-09-03 03:11:07 vsc Exp $ *
*************************************************************************/ *************************************************************************/
#ifdef SCCS #ifdef SCCS
static char SccsId[] = "%W% %G%"; static char SccsId[] = "%W% %G%";
@ -398,6 +398,7 @@ AllocHeap(unsigned int size)
{ {
BlockHeader *b, *n; BlockHeader *b, *n;
YAP_SEG_SIZE *sp; YAP_SEG_SIZE *sp;
UInt align, extra;
/* { /* {
static long long int vsc_alloc_ops; static long long int vsc_alloc_ops;
@ -406,26 +407,23 @@ AllocHeap(unsigned int size)
while (q) q = q->b_next_size; while (q) q = q->b_next_size;
}*/ }*/
size += 2*sizeof(YAP_SEG_SIZE); extra = size/16;
#if SIZEOF_INT_P==4 #if SIZEOF_INT_P==4
size = (((size + 7) & 0xfffffff8L) >> 2); /* size in dwords + 2 */ align = 2*sizeof(CELL); /* size in dwords + 2 */
#endif #endif
#if SIZEOF_INT_P==8 #if SIZEOF_INT_P==8
size = (((size + 7) & 0xfffffffffffffff8LL) >> 3); /* size in dwords + 2 */ align = sizeof(CELL);
#endif
if (size < (sizeof(YAP_SEG_SIZE)+sizeof(BlockHeader))/sizeof(CELL))
size = (sizeof(YAP_SEG_SIZE)+sizeof(BlockHeader))/sizeof(CELL);
#if SIZEOF_INT_P==4
/*
guarantee that the space seen by the user is always aligned at multiples
of a double word. This improves alignment, and guarantees correctness
for machines which require aligned 64 bits, such as SPARCs.
*/
if ((size & 1) == 0) size++;
#endif #endif
while (align < extra) align *= 2;
size = ALIGN_SIZE(size,align);
if (size < sizeof(BlockHeader))
size = sizeof(BlockHeader);
size += sizeof(YAP_SEG_SIZE);
/* change units to cells */
size = size/sizeof(CELL);
LOCK(FreeBlocksLock); LOCK(FreeBlocksLock);
if ((b = GetBlock(size))) { if ((b = GetBlock(size))) {
if (b->b_size >= size + 6 + 1) { if (b->b_size >= size+24+1) {
n = (BlockHeader *) (((YAP_SEG_SIZE *) b) + size + 1); n = (BlockHeader *) (((YAP_SEG_SIZE *) b) + size + 1);
n->b_size = b->b_size - size - 1; n->b_size = b->b_size - size - 1;
b->b_size = size; b->b_size = size;

View File

@ -11,8 +11,11 @@
* File: cdmgr.c * * File: cdmgr.c *
* comments: Code manager * * comments: Code manager *
* * * *
* Last rev: $Date: 2004-08-16 21:02:04 $,$Author: vsc $ * * Last rev: $Date: 2004-09-03 03:11:07 $,$Author: vsc $ *
* $Log: not supported by cvs2svn $ * $Log: not supported by cvs2svn $
* Revision 1.127 2004/08/16 21:02:04 vsc
* more fixes for !
*
* Revision 1.126 2004/07/22 21:32:20 vsc * Revision 1.126 2004/07/22 21:32:20 vsc
* debugger fixes * debugger fixes
* initial support for JPL * initial support for JPL
@ -321,6 +324,9 @@ release_wcls(yamop *cop, OPCODE ecs)
if (cop->opc == ecs) { if (cop->opc == ecs) {
cop->u.sp.s3--; cop->u.sp.s3--;
if (!cop->u.sp.s3) { if (!cop->u.sp.s3) {
#if DEBUG
Yap_expand_clauses_sz -= (UInt)(NEXTOP((yamop *)NULL,sp)+cop->u.sp.s1*sizeof(yamop *));
#endif
Yap_FreeCodeSpace((char *)cop); Yap_FreeCodeSpace((char *)cop);
} }
} }
@ -2662,24 +2668,31 @@ p_toggle_static_predicates_in_use(void)
} }
static void static void
clause_was_found(PredEntry *pp, Atom *pat, UInt *parity) { clause_was_found(PredEntry *pp, Atom *pat, UInt *parity) {
/* we found it */ if (pp->ModuleOfPred == IDB_MODULE) {
*parity = pp->ArityOfPE; if (pp->PredFlags & NumberDBPredFlag) {
if (pp->ArityOfPE) { *parity = 0;
*pat = NameOfFunctor(pp->FunctorOfPred); *pat = Yap_LookupAtom("integer");
} else if (pp->PredFlags & AtomDBPredFlag) {
*parity = 0;
*pat = (Atom)pp->FunctorOfPred;
} else {
*pat = NameOfFunctor(pp->FunctorOfPred);
*parity = ArityOfFunctor(pp->FunctorOfPred);
}
} else { } else {
*pat = (Atom)(pp->FunctorOfPred); *parity = pp->ArityOfPE;
if (pp->ArityOfPE) {
*pat = NameOfFunctor(pp->FunctorOfPred);
} else {
*pat = (Atom)(pp->FunctorOfPred);
}
} }
} }
static void static void
code_in_pred_info(PredEntry *pp, Atom *pat, UInt *parity) { code_in_pred_info(PredEntry *pp, Atom *pat, UInt *parity) {
*parity = pp->ArityOfPE; clause_was_found(pp, pat, parity);
if (pp->ArityOfPE) {
*pat = NameOfFunctor(pp->FunctorOfPred);
} else {
*pat = (Atom)(pp->FunctorOfPred);
}
} }
static int static int
@ -2786,11 +2799,19 @@ code_in_pred(PredEntry *pp, Atom *pat, UInt *parity, yamop *codeptr) {
static Int static Int
PredForCode(yamop *codeptr, Atom *pat, UInt *parity, Term *pmodule) { PredForCode(yamop *codeptr, Atom *pat, UInt *parity, Term *pmodule) {
Int found = 0; Int found = 0;
Int i_table; Int i_table, idb_i = 0;
/* should we allow the user to see hidden predicates? */ /* should we allow the user to see hidden predicates? */
for (i_table = NoOfModules-1; i_table >= 0; --i_table) { for (i_table = 0; i_table < NoOfModules; i_table++) {
PredEntry *pp = ModulePred[i_table];
PredEntry *pp;
if (ModuleName[i_table] == IDB_MODULE) {
idb_i = i_table;
/* do IDB at the very end */
continue;
}
restart:
pp = ModulePred[i_table];
while (pp != NULL) { while (pp != NULL) {
if ((found = code_in_pred(pp, pat, parity, codeptr)) != 0) { if ((found = code_in_pred(pp, pat, parity, codeptr)) != 0) {
if (i_table) if (i_table)
@ -2801,6 +2822,12 @@ PredForCode(yamop *codeptr, Atom *pat, UInt *parity, Term *pmodule) {
} }
pp = pp->NextPredOfModule; pp = pp->NextPredOfModule;
} }
if (!i_table) {
i_table = idb_i;
goto restart;
} else if (i_table == idb_i) {
return 0;
}
} }
return(0); return(0);
} }

View File

@ -11,8 +11,12 @@
* File: compiler.c * * File: compiler.c *
* comments: Clause compiler * * comments: Clause compiler *
* * * *
* Last rev: $Date: 2004-07-15 17:20:23 $,$Author: vsc $ * * Last rev: $Date: 2004-09-03 03:11:08 $,$Author: vsc $ *
* $Log: not supported by cvs2svn $ * $Log: not supported by cvs2svn $
* Revision 1.52 2004/07/15 17:20:23 vsc
* fix error message
* change makefile and configure for clpbn
*
* Revision 1.51 2004/06/29 19:04:41 vsc * Revision 1.51 2004/06/29 19:04:41 vsc
* fix multithreaded version * fix multithreaded version
* include new version of Ricardo's profiler * include new version of Ricardo's profiler
@ -864,7 +868,7 @@ c_bifun(Int Op, Term t1, Term t2, Term t3, int mod, compiler_struct *cglobs)
RESET_VARIABLE(H+1); RESET_VARIABLE(H+1);
H += 2; H += 2;
c_eq(AbsPair(H-2),t3, cglobs); c_eq(AbsPair(H-2),t3, cglobs);
} else { } else if (i2 < 16) {
*H++ = (CELL)Yap_MkFunctor(AtomOfTerm(t1),i2); *H++ = (CELL)Yap_MkFunctor(AtomOfTerm(t1),i2);
for (i=0; i < i2; i++) { for (i=0; i < i2; i++) {
if (H >= (CELL *)cglobs->cint.freep0) { if (H >= (CELL *)cglobs->cint.freep0) {

View File

@ -1511,7 +1511,6 @@ CreateDBStruct(Term Tm, DBProp p, int InFlag, int *pstat, UInt extra_size, struc
*/ */
flag = DBComplex; flag = DBComplex;
#ifdef IDB_LINK_TABLE #ifdef IDB_LINK_TABLE
CodeAbs++; /* We have one more cell */
CodeAbs += CellPtr(dbg->lr) - CellPtr(dbg->LinkAr); CodeAbs += CellPtr(dbg->lr) - CellPtr(dbg->LinkAr);
if ((CELL *)((char *)ntp0+(CELL)CodeAbs) > AuxSp) { if ((CELL *)((char *)ntp0+(CELL)CodeAbs) > AuxSp) {
Yap_Error_Size = (UInt)DBLength(CodeAbs); Yap_Error_Size = (UInt)DBLength(CodeAbs);
@ -1612,7 +1611,7 @@ CreateDBStruct(Term Tm, DBProp p, int InFlag, int *pstat, UInt extra_size, struc
nar = (Term *) cpcells(CellPtr(ppt->Contents), ntp0, Unsigned(NOfCells)); nar = (Term *) cpcells(CellPtr(ppt->Contents), ntp0, Unsigned(NOfCells));
} else { } else {
#ifdef IDB_LINK_TABLE #ifdef IDB_LINK_TABLE
nar = ppt->Contents + Unsigned(NOfCells)+1; nar = ppt->Contents + Unsigned(NOfCells);
#endif #endif
#ifdef IDB_USE_MBIT #ifdef IDB_USE_MBIT
/* we still need to link */ /* we still need to link */
@ -3710,7 +3709,8 @@ p_heap_space_info(void)
{ {
return return
Yap_unify(ARG1,MkIntegerTerm(HeapUsed)) && Yap_unify(ARG1,MkIntegerTerm(HeapUsed)) &&
Yap_unify(ARG2,MkIntegerTerm(HeapMax-HeapUsed)); Yap_unify(ARG2,MkIntegerTerm(HeapMax-HeapUsed)) &&
Yap_unify(ARG3,MkIntegerTerm(Yap_expand_clauses_sz));
} }
#endif #endif
@ -5079,7 +5079,7 @@ Yap_InitDBPreds(void)
#ifdef DEBUG #ifdef DEBUG
Yap_InitCPred("total_erased", 4, p_total_erased, SyncPredFlag); Yap_InitCPred("total_erased", 4, p_total_erased, SyncPredFlag);
Yap_InitCPred("key_erased_statistics", 5, p_key_erased_statistics, SyncPredFlag); Yap_InitCPred("key_erased_statistics", 5, p_key_erased_statistics, SyncPredFlag);
Yap_InitCPred("heap_space_info", 2, p_heap_space_info, SyncPredFlag); Yap_InitCPred("heap_space_info", 3, p_heap_space_info, SyncPredFlag);
#endif #endif
Yap_InitCPred("nth_instance", 3, p_nth_instance, SyncPredFlag); Yap_InitCPred("nth_instance", 3, p_nth_instance, SyncPredFlag);
Yap_InitCPred("$nth_instancep", 3, p_nth_instancep, SyncPredFlag); Yap_InitCPred("$nth_instancep", 3, p_nth_instancep, SyncPredFlag);

View File

@ -297,7 +297,7 @@ dump_stack(void)
fprintf(stderr,"%% YAP ERROR: Code Space Collided against Global\n"); fprintf(stderr,"%% YAP ERROR: Code Space Collided against Global\n");
} else { } else {
if (b_ptr != NULL) { if (b_ptr != NULL) {
fprintf(stderr," [ Goals with open alternatives:\n"); fprintf(stderr," %% Goals with open alternatives:\n");
while (b_ptr != NULL) { while (b_ptr != NULL) {
cl_position(b_ptr->cp_ap); cl_position(b_ptr->cp_ap);
b_ptr = b_ptr->cp_b; b_ptr = b_ptr->cp_b;
@ -305,7 +305,7 @@ dump_stack(void)
fprintf(stderr,"\n"); fprintf(stderr,"\n");
} }
if (env_ptr != NULL) { if (env_ptr != NULL) {
fprintf(stderr," [ Goals left to continue:\n"); fprintf(stderr," %% Goals left to continue:\n");
while (env_ptr != NULL) { while (env_ptr != NULL) {
cl_position((yamop *)(env_ptr[E_CP])); cl_position((yamop *)(env_ptr[E_CP]));
env_ptr = (CELL *)(env_ptr[E_E]); env_ptr = (CELL *)(env_ptr[E_E]);
@ -346,7 +346,7 @@ bug_location(yamop *pc)
static char tmpbuf[YAP_BUF_SIZE]; static char tmpbuf[YAP_BUF_SIZE];
yamop * yamop *
Yap_Error (yap_error_number type, Term where, char *format,...) Yap_Error(yap_error_number type, Term where, char *format,...)
{ {
va_list ap; va_list ap;
CELL nt[3]; CELL nt[3];

View File

@ -944,7 +944,8 @@ execute_growstack(long size0, int from_trail)
if (!Yap_ExtendWorkSpace(size)) { if (!Yap_ExtendWorkSpace(size)) {
/* make sure stacks and trail are contiguous */ /* make sure stacks and trail are contiguous */
Int minimal_request = AdjustPageSize(((CELL)Yap_TrailTop-(CELL)Yap_GlobalBase)+4*MinHeapGap+size0);
minimal_request = AdjustPageSize(((CELL)Yap_TrailTop-(CELL)Yap_GlobalBase)+4*MinHeapGap+size0);
size = Yap_ExtendWorkSpaceThroughHole(minimal_request); size = Yap_ExtendWorkSpaceThroughHole(minimal_request);
if (size < 0) { if (size < 0) {

View File

@ -674,17 +674,17 @@ inc_vars_of_type(CELL *curr,gc_types val) {
static void static void
put_type_info(unsigned long total) put_type_info(unsigned long total)
{ {
fprintf(Yap_stderr,"[GC] type info for %lu cells\n", total); fprintf(Yap_stderr,"%% type info for %lu cells\n", total);
fprintf(Yap_stderr,"[GC] %lu vars\n", vars[gc_var]); fprintf(Yap_stderr,"%% %lu vars\n", vars[gc_var]);
fprintf(Yap_stderr,"[GC] %lu refs\n", vars[gc_ref]); fprintf(Yap_stderr,"%% %lu refs\n", vars[gc_ref]);
fprintf(Yap_stderr,"[GC] %lu references from env\n", env_vars); fprintf(Yap_stderr,"%% %lu references from env\n", env_vars);
fprintf(Yap_stderr,"[GC] %lu atoms\n", vars[gc_atom]); fprintf(Yap_stderr,"%% %lu atoms\n", vars[gc_atom]);
fprintf(Yap_stderr,"[GC] %lu small ints\n", vars[gc_int]); fprintf(Yap_stderr,"%% %lu small ints\n", vars[gc_int]);
fprintf(Yap_stderr,"[GC] %lu other numbers\n", vars[gc_num]); fprintf(Yap_stderr,"%% %lu other numbers\n", vars[gc_num]);
fprintf(Yap_stderr,"[GC] %lu lists\n", vars[gc_list]); fprintf(Yap_stderr,"%% %lu lists\n", vars[gc_list]);
fprintf(Yap_stderr,"[GC] %lu compound terms\n", vars[gc_appl]); fprintf(Yap_stderr,"%% %lu compound terms\n", vars[gc_appl]);
fprintf(Yap_stderr,"[GC] %lu functors\n", vars[gc_func]); fprintf(Yap_stderr,"%% %lu functors\n", vars[gc_func]);
fprintf(Yap_stderr,"[GC] %lu suspensions\n", vars[gc_susp]); fprintf(Yap_stderr,"%% %lu suspensions\n", vars[gc_susp]);
} }
static void static void
@ -1445,11 +1445,11 @@ mark_choicepoints(register choiceptr gc_B, tr_fr_ptr saved_TR, int very_verbose)
Term mod; Term mod;
if (Yap_PredForCode(gc_B->cp_ap, &at, &arity, &mod)) { if (Yap_PredForCode(gc_B->cp_ap, &at, &arity, &mod)) {
if (arity) if (arity)
fprintf(Yap_stderr,"[GC] %s/%ld marked %ld (%s)\n", RepAtom(at)->StrOfAE, (long int)arity, total_marked, op_names[opnum]); fprintf(Yap_stderr,"%% %s/%ld marked %ld (%s)\n", RepAtom(at)->StrOfAE, (long int)arity, total_marked, op_names[opnum]);
else else
fprintf(Yap_stderr,"[GC] %s marked %ld (%s)\n", RepAtom(at)->StrOfAE, total_marked, op_names[opnum]); fprintf(Yap_stderr,"%% %s marked %ld (%s)\n", RepAtom(at)->StrOfAE, total_marked, op_names[opnum]);
} else } else
fprintf(Yap_stderr,"[GC] marked %ld (%s)\n", total_marked, op_names[opnum]); fprintf(Yap_stderr,"%% marked %ld (%s)\n", total_marked, op_names[opnum]);
} }
break; break;
#ifdef TABLING #ifdef TABLING
@ -1460,9 +1460,9 @@ mark_choicepoints(register choiceptr gc_B, tr_fr_ptr saved_TR, int very_verbose)
op_numbers caller_op = Yap_op_from_opcode(ENV_ToOp(gc_B->cp_cp)); op_numbers caller_op = Yap_op_from_opcode(ENV_ToOp(gc_B->cp_cp));
/* first condition checks if this was a meta-call */ /* first condition checks if this was a meta-call */
if ((caller_op != _call && caller_op != _fcall) || pe == NULL) { if ((caller_op != _call && caller_op != _fcall) || pe == NULL) {
fprintf(Yap_stderr,"[GC] marked %ld (%s)\n", total_marked, op_names[opnum]); fprintf(Yap_stderr,"%% marked %ld (%s)\n", total_marked, op_names[opnum]);
} else } else
fprintf(Yap_stderr,"[GC] %s/%d marked %ld (%s)\n", RepAtom(NameOfFunctor(pe->FunctorOfPred))->StrOfAE, pe->ArityOfPE, total_marked, op_names[opnum]); fprintf(Yap_stderr,"%% %s/%d marked %ld (%s)\n", RepAtom(NameOfFunctor(pe->FunctorOfPred))->StrOfAE, pe->ArityOfPE, total_marked, op_names[opnum]);
} }
break; break;
case _trie_retry_var: case _trie_retry_var:
@ -1475,19 +1475,19 @@ mark_choicepoints(register choiceptr gc_B, tr_fr_ptr saved_TR, int very_verbose)
case _trie_trust_list: case _trie_trust_list:
case _trie_retry_struct: case _trie_retry_struct:
case _trie_trust_struct: case _trie_trust_struct:
fprintf(Yap_stderr,"[GC] marked %ld (%s)\n", total_marked, op_names[opnum]); fprintf(Yap_stderr,"%% marked %ld (%s)\n", total_marked, op_names[opnum]);
break; break;
#endif #endif
default: default:
{ {
PredEntry *pe = (PredEntry *)gc_B->cp_ap->u.ld.p; PredEntry *pe = (PredEntry *)gc_B->cp_ap->u.ld.p;
if (pe == NULL) { if (pe == NULL) {
fprintf(Yap_stderr,"[GC] marked %ld (%s)\n", total_marked, op_names[opnum]); fprintf(Yap_stderr,"%% marked %ld (%s)\n", total_marked, op_names[opnum]);
} else } else
if (pe->ArityOfPE) if (pe->ArityOfPE)
fprintf(Yap_stderr,"[GC] %s/%d marked %ld (%s)\n", RepAtom(NameOfFunctor(pe->FunctorOfPred))->StrOfAE, pe->ArityOfPE, total_marked, op_names[opnum]); fprintf(Yap_stderr,"%% %s/%d marked %ld (%s)\n", RepAtom(NameOfFunctor(pe->FunctorOfPred))->StrOfAE, pe->ArityOfPE, total_marked, op_names[opnum]);
else else
fprintf(Yap_stderr,"[GC] %s marked %ld (%s)\n", RepAtom((Atom)(pe->FunctorOfPred))->StrOfAE, total_marked, op_names[opnum]); fprintf(Yap_stderr,"%% %s marked %ld (%s)\n", RepAtom((Atom)(pe->FunctorOfPred))->StrOfAE, total_marked, op_names[opnum]);
} }
} }
} }
@ -2019,26 +2019,26 @@ sweep_trail(choiceptr gc_B, tr_fr_ptr old_TR)
if (is_gc_verbose()) { if (is_gc_verbose()) {
if (old_TR != (tr_fr_ptr)Yap_TrailBase) if (old_TR != (tr_fr_ptr)Yap_TrailBase)
fprintf(Yap_stderr, fprintf(Yap_stderr,
"[GC] Trail: discarded %d (%ld%%) cells out of %ld\n", "%% Trail: discarded %d (%ld%%) cells out of %ld\n",
discard_trail_entries, discard_trail_entries,
(unsigned long int)(discard_trail_entries*100/(old_TR-(tr_fr_ptr)Yap_TrailBase)), (unsigned long int)(discard_trail_entries*100/(old_TR-(tr_fr_ptr)Yap_TrailBase)),
(unsigned long int)(old_TR-(tr_fr_ptr)Yap_TrailBase)); (unsigned long int)(old_TR-(tr_fr_ptr)Yap_TrailBase));
#ifdef DEBUG #ifdef DEBUG
if (hp_entrs > 0) if (hp_entrs > 0)
fprintf(Yap_stderr, fprintf(Yap_stderr,
"[GC] Trail: unmarked %ld dbentries (%ld%%) out of %ld\n", "%% Trail: unmarked %ld dbentries (%ld%%) out of %ld\n",
(long int)hp_not_in_use, (long int)hp_not_in_use,
(long int)(hp_not_in_use*100/hp_entrs), (long int)(hp_not_in_use*100/hp_entrs),
(long int)hp_entrs); (long int)hp_entrs);
if (hp_in_use_erased > 0 && hp_erased > 0) if (hp_in_use_erased > 0 && hp_erased > 0)
fprintf(Yap_stderr, fprintf(Yap_stderr,
"[GC] Trail: deleted %ld dbentries (%ld%%) out of %ld\n", "%% Trail: deleted %ld dbentries (%ld%%) out of %ld\n",
(long int)hp_erased, (long int)hp_erased,
(long int)(hp_erased*100/(hp_erased+hp_in_use_erased)), (long int)(hp_erased*100/(hp_erased+hp_in_use_erased)),
(long int)(hp_erased+hp_in_use_erased)); (long int)(hp_erased+hp_in_use_erased));
#endif #endif
fprintf(Yap_stderr, fprintf(Yap_stderr,
"[GC] Heap: recovered %ld bytes (%ld%%) out of %ld\n", "%% Heap: recovered %ld bytes (%ld%%) out of %ld\n",
(unsigned long int)(OldHeapUsed-HeapUsed), (unsigned long int)(OldHeapUsed-HeapUsed),
(unsigned long int)((OldHeapUsed-HeapUsed)/(OldHeapUsed/100)), (unsigned long int)((OldHeapUsed-HeapUsed)/(OldHeapUsed/100)),
(unsigned long int)OldHeapUsed); (unsigned long int)OldHeapUsed);
@ -2609,7 +2609,7 @@ compact_heap(void)
#ifdef DEBUG #ifdef DEBUG
if (total_marked != found_marked) if (total_marked != found_marked)
fprintf(Yap_stderr,"[GC] Upward (%d): %ld total against %ld found\n", fprintf(Yap_stderr,"%% Upward (%d): %ld total against %ld found\n",
gc_calls, gc_calls,
(unsigned long int)total_marked, (unsigned long int)total_marked,
(unsigned long int)found_marked); (unsigned long int)found_marked);
@ -2667,7 +2667,7 @@ compact_heap(void)
} }
#ifdef DEBUG #ifdef DEBUG
if (total_marked != found_marked) if (total_marked != found_marked)
fprintf(Yap_stderr,"[GC] Downward (%d): %ld total against %ld found\n", fprintf(Yap_stderr,"%% Downward (%d): %ld total against %ld found\n",
gc_calls, gc_calls,
(unsigned long int)total_marked, (unsigned long int)total_marked,
(unsigned long int)found_marked); (unsigned long int)found_marked);
@ -2801,7 +2801,7 @@ icompact_heap(void)
#ifdef DEBUG #ifdef DEBUG
if (total_marked != found_marked) if (total_marked != found_marked)
fprintf(Yap_stderr,"[GC] Upward (%d): %ld total against %ld found\n", fprintf(Yap_stderr,"%% Upward (%d): %ld total against %ld found\n",
gc_calls, gc_calls,
(unsigned long int)total_marked, (unsigned long int)total_marked,
(unsigned long int)found_marked); (unsigned long int)found_marked);
@ -2856,7 +2856,7 @@ icompact_heap(void)
} }
#ifdef DEBUG #ifdef DEBUG
if (total_marked != found_marked) if (total_marked != found_marked)
fprintf(Yap_stderr,"[GC] Downward (%d): %ld total against %ld found\n", fprintf(Yap_stderr,"%% Downward (%d): %ld total against %ld found\n",
gc_calls, gc_calls,
(unsigned long int)total_marked, (unsigned long int)total_marked,
(unsigned long int)found_marked); (unsigned long int)found_marked);
@ -2961,12 +2961,12 @@ compaction_phase(tr_fr_ptr old_TR, CELL *current_env, yamop *curp, CELL *max)
-total_smarked -total_smarked
#endif #endif
!= iptop-(CELL_PTR *)H && iptop < (CELL_PTR *)ASP -1024) != iptop-(CELL_PTR *)H && iptop < (CELL_PTR *)ASP -1024)
fprintf(Yap_stderr,"[GC] Oops on iptop-H (%ld) vs %ld\n", (unsigned long int)(iptop-(CELL_PTR *)H), total_marked); fprintf(Yap_stderr,"%% Oops on iptop-H (%ld) vs %ld\n", (unsigned long int)(iptop-(CELL_PTR *)H), total_marked);
#endif #endif
if (iptop < (CELL_PTR *)ASP && 10*total_marked < H-H0) { if (iptop < (CELL_PTR *)ASP && 10*total_marked < H-H0) {
#ifdef INSTRUMENT_GC #ifdef INSTRUMENT_GC
int effectiveness = (((H-H0)-total_marked)*100)/(H-H0); int effectiveness = (((H-H0)-total_marked)*100)/(H-H0);
fprintf(Yap_stderr,"[GC] using pointers (%d)\n", effectiveness); fprintf(Yap_stderr,"%% using pointers (%d)\n", effectiveness);
#endif #endif
quicksort((CELL_PTR *)H, 0, (iptop-(CELL_PTR *)H)-1); quicksort((CELL_PTR *)H, 0, (iptop-(CELL_PTR *)H)-1);
adjust_cp_hbs(); adjust_cp_hbs();
@ -2977,7 +2977,7 @@ compaction_phase(tr_fr_ptr old_TR, CELL *current_env, yamop *curp, CELL *max)
#ifdef DEBUG #ifdef DEBUG
#ifdef HYBID_SCHEME #ifdef HYBID_SCHEME
int effectiveness = (((H-H0)-total_marked)*100)/(H-H0); int effectiveness = (((H-H0)-total_marked)*100)/(H-H0);
fprintf(stderr,"[GC] not using pointers (%d) ASP: %p, ip %p (expected %p) \n", effectiveness, ASP, iptop, H+total_marked); fprintf(stderr,"%% not using pointers (%d) ASP: %p, ip %p (expected %p) \n", effectiveness, ASP, iptop, H+total_marked);
#endif #endif
#endif #endif
compact_heap(); compact_heap();
@ -3040,21 +3040,21 @@ do_gc(Int predarity, CELL *current_env, yamop *nextop)
if ((CELL)Yap_TrailTop & (MBIT|RBIT)) { if ((CELL)Yap_TrailTop & (MBIT|RBIT)) {
/* oops, we can't */ /* oops, we can't */
if (gc_verbose) { if (gc_verbose) {
fprintf(Yap_stderr, "[GC] TrailTop at %p clashes with gc bits: %lx\n", Yap_TrailTop, (unsigned long int)(MBIT|RBIT)); fprintf(Yap_stderr, "%% TrailTop at %p clashes with gc bits: %lx\n", Yap_TrailTop, (unsigned long int)(MBIT|RBIT));
fprintf(Yap_stderr, "[GC] garbage collection disallowed\n"); fprintf(Yap_stderr, "%% garbage collection disallowed\n");
} }
return(0); return(0);
} }
if (gc_trace) { if (gc_trace) {
fprintf(Yap_stderr, "[gc]\n"); fprintf(Yap_stderr, "[gc]\n");
} else if (gc_verbose) { } else if (gc_verbose) {
fprintf(Yap_stderr, "[GC] Start of garbage collection %d:\n", gc_calls); fprintf(Yap_stderr, "%% Start of garbage collection %d:\n", gc_calls);
#ifndef EARLY_RESET #ifndef EARLY_RESET
fprintf(Yap_stderr, "[GC] no early reset in trail\n"); fprintf(Yap_stderr, "%% no early reset in trail\n");
#endif #endif
fprintf(Yap_stderr, "[GC] Global: %8ld cells (%p-%p)\n", (long int)heap_cells,H0,H); fprintf(Yap_stderr, "%% Global: %8ld cells (%p-%p)\n", (long int)heap_cells,H0,H);
fprintf(Yap_stderr, "[GC] Local:%8ld cells (%p-%p)\n", (unsigned long int)(LCL0-ASP),LCL0,ASP); fprintf(Yap_stderr, "%% Local:%8ld cells (%p-%p)\n", (unsigned long int)(LCL0-ASP),LCL0,ASP);
fprintf(Yap_stderr, "[GC] Trail:%8ld cells (%p-%p)\n", fprintf(Yap_stderr, "%% Trail:%8ld cells (%p-%p)\n",
(unsigned long int)(TR-(tr_fr_ptr)Yap_TrailBase),Yap_TrailBase,TR); (unsigned long int)(TR-(tr_fr_ptr)Yap_TrailBase),Yap_TrailBase,TR);
} }
#if !USE_SYSTEM_MALLOC #if !USE_SYSTEM_MALLOC
@ -3089,19 +3089,19 @@ do_gc(Int predarity, CELL *current_env, yamop *nextop)
else else
effectiveness = 0; effectiveness = 0;
if (gc_verbose) { if (gc_verbose) {
fprintf(Yap_stderr, "[GC] Mark: Recovered %ld cells of %ld (%ld%%) in %g sec\n", fprintf(Yap_stderr, "%% Mark: Recovered %ld cells of %ld (%ld%%) in %g sec\n",
(long int)(heap_cells-total_marked), (long int)heap_cells, (long int)effectiveness, (double)(m_time-time_start)/1000); (long int)(heap_cells-total_marked), (long int)heap_cells, (long int)effectiveness, (double)(m_time-time_start)/1000);
#ifdef INSTRUMENT_GC #ifdef INSTRUMENT_GC
{ {
int i; int i;
for (i=0; i<16; i++) { for (i=0; i<16; i++) {
if (chain[i]) { if (chain[i]) {
fprintf(Yap_stderr, "[GC] chain[%d]=%lu\n", i, chain[i]); fprintf(Yap_stderr, "%% chain[%d]=%lu\n", i, chain[i]);
} }
} }
put_type_info((unsigned long int)total_marked); put_type_info((unsigned long int)total_marked);
fprintf(Yap_stderr,"[GC] %lu/%ld before and %lu/%ld after\n", old_vars, (unsigned long int)(B->cp_h-H0), new_vars, (unsigned long int)(H-B->cp_h)); fprintf(Yap_stderr,"%% %lu/%ld before and %lu/%ld after\n", old_vars, (unsigned long int)(B->cp_h-H0), new_vars, (unsigned long int)(H-B->cp_h));
fprintf(Yap_stderr,"[GC] %ld choicepoints\n", num_bs); fprintf(Yap_stderr,"%% %ld choicepoints\n", num_bs);
} }
#endif #endif
} }
@ -3113,14 +3113,14 @@ do_gc(Int predarity, CELL *current_env, yamop *nextop)
YAPLeaveCriticalSection(); YAPLeaveCriticalSection();
c_time = Yap_cputime(); c_time = Yap_cputime();
if (gc_verbose) { if (gc_verbose) {
fprintf(Yap_stderr, "[GC] Compress: took %g sec\n", (double)(c_time-time_start)/1000); fprintf(Yap_stderr, "%% Compress: took %g sec\n", (double)(c_time-time_start)/1000);
} }
gc_time += (c_time-time_start); gc_time += (c_time-time_start);
tot_gc_time += gc_time; tot_gc_time += gc_time;
tot_gc_recovered += heap_cells-total_marked; tot_gc_recovered += heap_cells-total_marked;
if (gc_verbose) { if (gc_verbose) {
fprintf(Yap_stderr, "[GC] GC %d took %g sec, total of %g sec doing GC so far.\n", gc_calls, (double)gc_time/1000, (double)tot_gc_time/1000); fprintf(Yap_stderr, "%% GC %d took %g sec, total of %g sec doing GC so far.\n", gc_calls, (double)gc_time/1000, (double)tot_gc_time/1000);
fprintf(Yap_stderr, "[GC] Left %ld cells free in stacks.\n", fprintf(Yap_stderr, "%% Left %ld cells free in stacks.\n",
(unsigned long int)(ASP-H)); (unsigned long int)(ASP-H));
} }
check_global(); check_global();

View File

@ -11,8 +11,11 @@
* File: index.c * * File: index.c *
* comments: Indexing a Prolog predicate * * comments: Indexing a Prolog predicate *
* * * *
* Last rev: $Date: 2004-08-27 20:18:52 $,$Author: vsc $ * * Last rev: $Date: 2004-09-03 03:11:09 $,$Author: vsc $ *
* $Log: not supported by cvs2svn $ * $Log: not supported by cvs2svn $
* Revision 1.96 2004/08/27 20:18:52 vsc
* more small fixes
*
* Revision 1.95 2004/08/11 16:14:52 vsc * Revision 1.95 2004/08/11 16:14:52 vsc
* whole lot of fixes: * whole lot of fixes:
* - memory leak in indexing * - memory leak in indexing
@ -137,6 +140,9 @@ cleanup_sw_on_clauses(CELL larg, UInt sz, OPCODE ecls)
if (xp->opc == ecls) { if (xp->opc == ecls) {
if (xp->u.sp.s3 == 1) { if (xp->u.sp.s3 == 1) {
UInt nsz = sz + (UInt)(NEXTOP((yamop *)NULL,sp)+xp->u.sp.s1*sizeof(yamop *)); UInt nsz = sz + (UInt)(NEXTOP((yamop *)NULL,sp)+xp->u.sp.s1*sizeof(yamop *));
#if DEBUG
Yap_expand_clauses_sz -= (UInt)(NEXTOP((yamop *)NULL,sp)+xp->u.sp.s1*sizeof(yamop *));
#endif
Yap_FreeCodeSpace((char *)xp); Yap_FreeCodeSpace((char *)xp);
return nsz; return nsz;
} else { } else {
@ -2917,6 +2923,9 @@ suspend_indexing(ClauseDef *min, ClauseDef *max, PredEntry *ap, struct intermedi
yamop **st; yamop **st;
UInt sz = (UInt)(NEXTOP((yamop *)NULL,sp)+cls*sizeof(yamop *)); UInt sz = (UInt)(NEXTOP((yamop *)NULL,sp)+cls*sizeof(yamop *));
#if DEBUG
Yap_expand_clauses_sz += sz;
#endif
if ((ncode = (yamop *)Yap_AllocCodeSpace(sz)) == NULL) { if ((ncode = (yamop *)Yap_AllocCodeSpace(sz)) == NULL) {
Yap_Error_Size = recover_from_failed_susp_on_cls(cint, sz); Yap_Error_Size = recover_from_failed_susp_on_cls(cint, sz);
longjmp(cint->CompilerBotch, 2); longjmp(cint->CompilerBotch, 2);
@ -2941,6 +2950,9 @@ recover_ecls_block(yamop *ipc)
{ {
ipc->u.sp.s3--; ipc->u.sp.s3--;
if (!ipc->u.sp.s3) { if (!ipc->u.sp.s3) {
#if DEBUG
Yap_expand_clauses_sz -= (UInt)(NEXTOP((yamop *)NULL,sp)+ipc->u.sp.s1*sizeof(yamop *));
#endif
Yap_FreeCodeSpace((char *)ipc); Yap_FreeCodeSpace((char *)ipc);
} }
} }

View File

@ -1043,6 +1043,9 @@ InitCodes(void)
heap_regs->db_erased_marker->Parent = NULL; heap_regs->db_erased_marker->Parent = NULL;
INIT_LOCK(heap_regs->db_erased_marker->lock); INIT_LOCK(heap_regs->db_erased_marker->lock);
INIT_DBREF_COUNT(heap_regs->db_erased_marker); INIT_DBREF_COUNT(heap_regs->db_erased_marker);
#if DEBUG
heap_regs->expand_clauses_sz = 0L;
#endif
} }

View File

@ -10,7 +10,7 @@
* File: Heap.h * * File: Heap.h *
* mods: * * mods: *
* comments: Heap Init Structure * * comments: Heap Init Structure *
* version: $Id: Heap.h,v 1.64 2004-07-22 21:32:21 vsc Exp $ * * version: $Id: Heap.h,v 1.65 2004-09-03 03:11:09 vsc Exp $ *
*************************************************************************/ *************************************************************************/
/* information that can be stored in Code Space */ /* information that can be stored in Code Space */
@ -361,6 +361,7 @@ typedef struct various_codes {
#ifdef DEBUG #ifdef DEBUG
struct logic_upd_clause *db_erased_list; struct logic_upd_clause *db_erased_list;
struct logic_upd_index *db_erased_ilist; struct logic_upd_index *db_erased_ilist;
UInt expand_clauses_sz;
#endif /* DEBUG */ #endif /* DEBUG */
struct stream_desc *yap_streams; struct stream_desc *yap_streams;
#ifdef DEBUG #ifdef DEBUG
@ -610,6 +611,7 @@ struct various_codes *heap_regs;
#ifdef DEBUG #ifdef DEBUG
#define DBErasedList heap_regs->db_erased_list #define DBErasedList heap_regs->db_erased_list
#define DBErasedIList heap_regs->db_erased_ilist #define DBErasedIList heap_regs->db_erased_ilist
#define Yap_expand_clauses_sz heap_regs->expand_clauses_sz
#endif /* DEBUG */ #endif /* DEBUG */
#define Stream heap_regs->yap_streams #define Stream heap_regs->yap_streams
#define output_msg heap_regs->debugger_output_msg #define output_msg heap_regs->debugger_output_msg

View File

@ -74,6 +74,9 @@ typedef struct FREEB {
#define ALIGN_YAPTYPE(X,TYPE) (((CELL)(X)+(sizeof(TYPE)-1)) & ~(sizeof(TYPE)-1)) #define ALIGN_YAPTYPE(X,TYPE) (((CELL)(X)+(sizeof(TYPE)-1)) & ~(sizeof(TYPE)-1))
/* SIZE should be a power of 2 */
#define ALIGN_SIZE(X,SIZE) (((CELL)(X)+((SIZE)-1)) & ~((SIZE)-1))
/* I'll assume page size is always a power of two */ /* I'll assume page size is always a power of two */
#define AdjustPageSize(X) ((X) & (Yap_page_size-1) ? \ #define AdjustPageSize(X) ((X) & (Yap_page_size-1) ? \
((X) + Yap_page_size) & (~(Yap_page_size-1)) : \ ((X) + Yap_page_size) & (~(Yap_page_size-1)) : \