From 6711d93b9cd9a9ecca34f38eeb1ab42659060949 Mon Sep 17 00:00:00 2001 From: vsc Date: Fri, 3 Sep 2004 03:11:09 +0000 Subject: [PATCH] memory management fixes git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1121 b08c6af1-5177-4d33-ba66-4b1c6b8b522a --- C/alloc.c | 28 ++++++++-------- C/cdmgr.c | 59 ++++++++++++++++++++++++---------- C/compiler.c | 8 +++-- C/dbase.c | 8 ++--- C/errors.c | 6 ++-- C/grow.c | 3 +- C/heapgc.c | 90 ++++++++++++++++++++++++++-------------------------- C/index.c | 14 +++++++- C/init.c | 3 ++ H/Heap.h | 4 ++- H/alloc.h | 3 ++ 11 files changed, 138 insertions(+), 88 deletions(-) diff --git a/C/alloc.c b/C/alloc.c index 5e7efe94e..95879dcd8 100644 --- a/C/alloc.c +++ b/C/alloc.c @@ -12,7 +12,7 @@ * Last rev: * * mods: * * 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 static char SccsId[] = "%W% %G%"; @@ -398,6 +398,7 @@ AllocHeap(unsigned int size) { BlockHeader *b, *n; YAP_SEG_SIZE *sp; + UInt align, extra; /* { static long long int vsc_alloc_ops; @@ -406,26 +407,23 @@ AllocHeap(unsigned int size) while (q) q = q->b_next_size; }*/ - size += 2*sizeof(YAP_SEG_SIZE); + extra = size/16; #if SIZEOF_INT_P==4 - size = (((size + 7) & 0xfffffff8L) >> 2); /* size in dwords + 2 */ + align = 2*sizeof(CELL); /* size in dwords + 2 */ #endif #if SIZEOF_INT_P==8 - size = (((size + 7) & 0xfffffffffffffff8LL) >> 3); /* size in dwords + 2 */ -#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++; + align = sizeof(CELL); #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); 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->b_size = b->b_size - size - 1; b->b_size = size; diff --git a/C/cdmgr.c b/C/cdmgr.c index 2c9f9e6a2..73e6853dc 100644 --- a/C/cdmgr.c +++ b/C/cdmgr.c @@ -11,8 +11,11 @@ * File: cdmgr.c * * 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 $ +* Revision 1.127 2004/08/16 21:02:04 vsc +* more fixes for ! +* * Revision 1.126 2004/07/22 21:32:20 vsc * debugger fixes * initial support for JPL @@ -321,6 +324,9 @@ release_wcls(yamop *cop, OPCODE ecs) if (cop->opc == ecs) { 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); } } @@ -2662,24 +2668,31 @@ p_toggle_static_predicates_in_use(void) } static void -clause_was_found(PredEntry *pp, Atom *pat, UInt *parity) { - /* we found it */ - *parity = pp->ArityOfPE; - if (pp->ArityOfPE) { - *pat = NameOfFunctor(pp->FunctorOfPred); +clause_was_found(PredEntry *pp, Atom *pat, UInt *parity) { + if (pp->ModuleOfPred == IDB_MODULE) { + if (pp->PredFlags & NumberDBPredFlag) { + *parity = 0; + *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 { - *pat = (Atom)(pp->FunctorOfPred); + *parity = pp->ArityOfPE; + if (pp->ArityOfPE) { + *pat = NameOfFunctor(pp->FunctorOfPred); + } else { + *pat = (Atom)(pp->FunctorOfPred); + } } } static void code_in_pred_info(PredEntry *pp, Atom *pat, UInt *parity) { - *parity = pp->ArityOfPE; - if (pp->ArityOfPE) { - *pat = NameOfFunctor(pp->FunctorOfPred); - } else { - *pat = (Atom)(pp->FunctorOfPred); - } + clause_was_found(pp, pat, parity); } static int @@ -2786,11 +2799,19 @@ code_in_pred(PredEntry *pp, Atom *pat, UInt *parity, yamop *codeptr) { static Int PredForCode(yamop *codeptr, Atom *pat, UInt *parity, Term *pmodule) { Int found = 0; - Int i_table; + Int i_table, idb_i = 0; /* should we allow the user to see hidden predicates? */ - for (i_table = NoOfModules-1; i_table >= 0; --i_table) { - PredEntry *pp = ModulePred[i_table]; + for (i_table = 0; i_table < NoOfModules; 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) { if ((found = code_in_pred(pp, pat, parity, codeptr)) != 0) { if (i_table) @@ -2801,6 +2822,12 @@ PredForCode(yamop *codeptr, Atom *pat, UInt *parity, Term *pmodule) { } pp = pp->NextPredOfModule; } + if (!i_table) { + i_table = idb_i; + goto restart; + } else if (i_table == idb_i) { + return 0; + } } return(0); } diff --git a/C/compiler.c b/C/compiler.c index 1656b1ab0..a164aac33 100644 --- a/C/compiler.c +++ b/C/compiler.c @@ -11,8 +11,12 @@ * File: compiler.c * * 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 $ +* 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 * fix multithreaded version * 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); H += 2; c_eq(AbsPair(H-2),t3, cglobs); - } else { + } else if (i2 < 16) { *H++ = (CELL)Yap_MkFunctor(AtomOfTerm(t1),i2); for (i=0; i < i2; i++) { if (H >= (CELL *)cglobs->cint.freep0) { diff --git a/C/dbase.c b/C/dbase.c index 7e8c3947b..dc5fb0fa5 100644 --- a/C/dbase.c +++ b/C/dbase.c @@ -1511,7 +1511,6 @@ CreateDBStruct(Term Tm, DBProp p, int InFlag, int *pstat, UInt extra_size, struc */ flag = DBComplex; #ifdef IDB_LINK_TABLE - CodeAbs++; /* We have one more cell */ CodeAbs += CellPtr(dbg->lr) - CellPtr(dbg->LinkAr); if ((CELL *)((char *)ntp0+(CELL)CodeAbs) > AuxSp) { 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)); } else { #ifdef IDB_LINK_TABLE - nar = ppt->Contents + Unsigned(NOfCells)+1; + nar = ppt->Contents + Unsigned(NOfCells); #endif #ifdef IDB_USE_MBIT /* we still need to link */ @@ -3710,7 +3709,8 @@ p_heap_space_info(void) { return 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 @@ -5079,7 +5079,7 @@ Yap_InitDBPreds(void) #ifdef DEBUG Yap_InitCPred("total_erased", 4, p_total_erased, 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 Yap_InitCPred("nth_instance", 3, p_nth_instance, SyncPredFlag); Yap_InitCPred("$nth_instancep", 3, p_nth_instancep, SyncPredFlag); diff --git a/C/errors.c b/C/errors.c index 9e10d140d..39b4d6e50 100644 --- a/C/errors.c +++ b/C/errors.c @@ -297,7 +297,7 @@ dump_stack(void) fprintf(stderr,"%% YAP ERROR: Code Space Collided against Global\n"); } else { if (b_ptr != NULL) { - fprintf(stderr," [ Goals with open alternatives:\n"); + fprintf(stderr," %% Goals with open alternatives:\n"); while (b_ptr != NULL) { cl_position(b_ptr->cp_ap); b_ptr = b_ptr->cp_b; @@ -305,7 +305,7 @@ dump_stack(void) fprintf(stderr,"\n"); } if (env_ptr != NULL) { - fprintf(stderr," [ Goals left to continue:\n"); + fprintf(stderr," %% Goals left to continue:\n"); while (env_ptr != NULL) { cl_position((yamop *)(env_ptr[E_CP])); env_ptr = (CELL *)(env_ptr[E_E]); @@ -346,7 +346,7 @@ bug_location(yamop *pc) static char tmpbuf[YAP_BUF_SIZE]; yamop * -Yap_Error (yap_error_number type, Term where, char *format,...) +Yap_Error(yap_error_number type, Term where, char *format,...) { va_list ap; CELL nt[3]; diff --git a/C/grow.c b/C/grow.c index 0c1271372..c74b339c9 100644 --- a/C/grow.c +++ b/C/grow.c @@ -944,7 +944,8 @@ execute_growstack(long size0, int from_trail) if (!Yap_ExtendWorkSpace(size)) { /* 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); if (size < 0) { diff --git a/C/heapgc.c b/C/heapgc.c index 9433eb4c6..649f457fb 100644 --- a/C/heapgc.c +++ b/C/heapgc.c @@ -674,17 +674,17 @@ inc_vars_of_type(CELL *curr,gc_types val) { static void put_type_info(unsigned long total) { - fprintf(Yap_stderr,"[GC] type info for %lu cells\n", total); - fprintf(Yap_stderr,"[GC] %lu vars\n", vars[gc_var]); - fprintf(Yap_stderr,"[GC] %lu refs\n", vars[gc_ref]); - fprintf(Yap_stderr,"[GC] %lu references from env\n", env_vars); - fprintf(Yap_stderr,"[GC] %lu atoms\n", vars[gc_atom]); - fprintf(Yap_stderr,"[GC] %lu small ints\n", vars[gc_int]); - fprintf(Yap_stderr,"[GC] %lu other numbers\n", vars[gc_num]); - fprintf(Yap_stderr,"[GC] %lu lists\n", vars[gc_list]); - fprintf(Yap_stderr,"[GC] %lu compound terms\n", vars[gc_appl]); - fprintf(Yap_stderr,"[GC] %lu functors\n", vars[gc_func]); - fprintf(Yap_stderr,"[GC] %lu suspensions\n", vars[gc_susp]); + fprintf(Yap_stderr,"%% type info for %lu cells\n", total); + fprintf(Yap_stderr,"%% %lu vars\n", vars[gc_var]); + fprintf(Yap_stderr,"%% %lu refs\n", vars[gc_ref]); + fprintf(Yap_stderr,"%% %lu references from env\n", env_vars); + fprintf(Yap_stderr,"%% %lu atoms\n", vars[gc_atom]); + fprintf(Yap_stderr,"%% %lu small ints\n", vars[gc_int]); + fprintf(Yap_stderr,"%% %lu other numbers\n", vars[gc_num]); + fprintf(Yap_stderr,"%% %lu lists\n", vars[gc_list]); + fprintf(Yap_stderr,"%% %lu compound terms\n", vars[gc_appl]); + fprintf(Yap_stderr,"%% %lu functors\n", vars[gc_func]); + fprintf(Yap_stderr,"%% %lu suspensions\n", vars[gc_susp]); } static void @@ -1445,11 +1445,11 @@ mark_choicepoints(register choiceptr gc_B, tr_fr_ptr saved_TR, int very_verbose) Term mod; if (Yap_PredForCode(gc_B->cp_ap, &at, &arity, &mod)) { 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 - 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 - 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; #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)); /* first condition checks if this was a meta-call */ 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 - 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; 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_retry_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; #endif default: { PredEntry *pe = (PredEntry *)gc_B->cp_ap->u.ld.p; 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 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 - 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 (old_TR != (tr_fr_ptr)Yap_TrailBase) 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, (unsigned long int)(discard_trail_entries*100/(old_TR-(tr_fr_ptr)Yap_TrailBase)), (unsigned long int)(old_TR-(tr_fr_ptr)Yap_TrailBase)); #ifdef DEBUG if (hp_entrs > 0) 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*100/hp_entrs), (long int)hp_entrs); if (hp_in_use_erased > 0 && hp_erased > 0) 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*100/(hp_erased+hp_in_use_erased)), (long int)(hp_erased+hp_in_use_erased)); #endif 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)/(OldHeapUsed/100)), (unsigned long int)OldHeapUsed); @@ -2609,7 +2609,7 @@ compact_heap(void) #ifdef DEBUG 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, (unsigned long int)total_marked, (unsigned long int)found_marked); @@ -2667,7 +2667,7 @@ compact_heap(void) } #ifdef DEBUG 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, (unsigned long int)total_marked, (unsigned long int)found_marked); @@ -2801,7 +2801,7 @@ icompact_heap(void) #ifdef DEBUG 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, (unsigned long int)total_marked, (unsigned long int)found_marked); @@ -2856,7 +2856,7 @@ icompact_heap(void) } #ifdef DEBUG 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, (unsigned long int)total_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 #endif != 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 if (iptop < (CELL_PTR *)ASP && 10*total_marked < H-H0) { #ifdef INSTRUMENT_GC 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 quicksort((CELL_PTR *)H, 0, (iptop-(CELL_PTR *)H)-1); adjust_cp_hbs(); @@ -2977,7 +2977,7 @@ compaction_phase(tr_fr_ptr old_TR, CELL *current_env, yamop *curp, CELL *max) #ifdef DEBUG #ifdef HYBID_SCHEME 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 compact_heap(); @@ -3040,21 +3040,21 @@ do_gc(Int predarity, CELL *current_env, yamop *nextop) if ((CELL)Yap_TrailTop & (MBIT|RBIT)) { /* oops, we can't */ 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, "[GC] garbage collection disallowed\n"); + fprintf(Yap_stderr, "%% TrailTop at %p clashes with gc bits: %lx\n", Yap_TrailTop, (unsigned long int)(MBIT|RBIT)); + fprintf(Yap_stderr, "%% garbage collection disallowed\n"); } return(0); } if (gc_trace) { fprintf(Yap_stderr, "[gc]\n"); } 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 - fprintf(Yap_stderr, "[GC] no early reset in trail\n"); + fprintf(Yap_stderr, "%% no early reset in trail\n"); #endif - fprintf(Yap_stderr, "[GC] 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, "[GC] Trail:%8ld cells (%p-%p)\n", + fprintf(Yap_stderr, "%% Global: %8ld cells (%p-%p)\n", (long int)heap_cells,H0,H); + fprintf(Yap_stderr, "%% Local:%8ld cells (%p-%p)\n", (unsigned long int)(LCL0-ASP),LCL0,ASP); + fprintf(Yap_stderr, "%% Trail:%8ld cells (%p-%p)\n", (unsigned long int)(TR-(tr_fr_ptr)Yap_TrailBase),Yap_TrailBase,TR); } #if !USE_SYSTEM_MALLOC @@ -3089,19 +3089,19 @@ do_gc(Int predarity, CELL *current_env, yamop *nextop) else effectiveness = 0; 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); #ifdef INSTRUMENT_GC { int i; for (i=0; i<16; 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); - 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,"[GC] %ld choicepoints\n", num_bs); + 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,"%% %ld choicepoints\n", num_bs); } #endif } @@ -3113,14 +3113,14 @@ do_gc(Int predarity, CELL *current_env, yamop *nextop) YAPLeaveCriticalSection(); c_time = Yap_cputime(); 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); tot_gc_time += gc_time; tot_gc_recovered += heap_cells-total_marked; 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] Left %ld cells free in stacks.\n", + 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, "%% Left %ld cells free in stacks.\n", (unsigned long int)(ASP-H)); } check_global(); diff --git a/C/index.c b/C/index.c index 55aab03eb..cd2d2cc69 100644 --- a/C/index.c +++ b/C/index.c @@ -11,8 +11,11 @@ * File: index.c * * 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 $ +* Revision 1.96 2004/08/27 20:18:52 vsc +* more small fixes +* * Revision 1.95 2004/08/11 16:14:52 vsc * whole lot of fixes: * - memory leak in indexing @@ -137,6 +140,9 @@ cleanup_sw_on_clauses(CELL larg, UInt sz, OPCODE ecls) if (xp->opc == ecls) { if (xp->u.sp.s3 == 1) { 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); return nsz; } else { @@ -2917,6 +2923,9 @@ suspend_indexing(ClauseDef *min, ClauseDef *max, PredEntry *ap, struct intermedi yamop **st; 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) { Yap_Error_Size = recover_from_failed_susp_on_cls(cint, sz); longjmp(cint->CompilerBotch, 2); @@ -2941,6 +2950,9 @@ recover_ecls_block(yamop *ipc) { 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); } } diff --git a/C/init.c b/C/init.c index 7436d6026..1438f6591 100644 --- a/C/init.c +++ b/C/init.c @@ -1043,6 +1043,9 @@ InitCodes(void) heap_regs->db_erased_marker->Parent = NULL; INIT_LOCK(heap_regs->db_erased_marker->lock); INIT_DBREF_COUNT(heap_regs->db_erased_marker); +#if DEBUG + heap_regs->expand_clauses_sz = 0L; +#endif } diff --git a/H/Heap.h b/H/Heap.h index f36764f33..842eec7a1 100644 --- a/H/Heap.h +++ b/H/Heap.h @@ -10,7 +10,7 @@ * File: Heap.h * * mods: * * 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 */ @@ -361,6 +361,7 @@ typedef struct various_codes { #ifdef DEBUG struct logic_upd_clause *db_erased_list; struct logic_upd_index *db_erased_ilist; + UInt expand_clauses_sz; #endif /* DEBUG */ struct stream_desc *yap_streams; #ifdef DEBUG @@ -610,6 +611,7 @@ struct various_codes *heap_regs; #ifdef DEBUG #define DBErasedList heap_regs->db_erased_list #define DBErasedIList heap_regs->db_erased_ilist +#define Yap_expand_clauses_sz heap_regs->expand_clauses_sz #endif /* DEBUG */ #define Stream heap_regs->yap_streams #define output_msg heap_regs->debugger_output_msg diff --git a/H/alloc.h b/H/alloc.h index c3284405a..3aa4454e0 100644 --- a/H/alloc.h +++ b/H/alloc.h @@ -74,6 +74,9 @@ typedef struct FREEB { #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 */ #define AdjustPageSize(X) ((X) & (Yap_page_size-1) ? \ ((X) + Yap_page_size) & (~(Yap_page_size-1)) : \