fix bug in growstack

git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1718 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
vsc 2006-11-14 11:42:26 +00:00
parent feca28c235
commit e112ce1a8a
5 changed files with 53 additions and 10 deletions

View File

@ -11,8 +11,11 @@
* File: cdmgr.c *
* comments: Code manager *
* *
* Last rev: $Date: 2006-11-06 18:35:03 $,$Author: vsc $ *
* Last rev: $Date: 2006-11-14 11:42:25 $,$Author: vsc $ *
* $Log: not supported by cvs2svn $
* Revision 1.197 2006/11/06 18:35:03 vsc
* 1estranha
*
* Revision 1.196 2006/10/16 17:12:48 vsc
* fixes for threaded version.
*
@ -5653,6 +5656,7 @@ p_choicepoint_info(void)
pe = UndefCode;
t = MkVarTerm();
break;
#endif /* TABLING */
case _try_logical:
case _retry_logical:
case _trust_logical:
@ -5660,10 +5664,9 @@ p_choicepoint_info(void)
case _count_trust_logical:
case _profiled_retry_logical:
case _profiled_trust_logical:
pe = ipc->u.lld.n->ClPred;
pe = ipc->u.lld.d->ClPred;
t = BuildActivePred(pe, cptr->cp_args);
break;
#endif /* TABLING */
case _or_else:
pe = ipc->u.sla.p0;
t = Yap_MkNewApplTerm(FunctorOr, 2);

View File

@ -95,6 +95,8 @@ CreateNewArena(CELL *ptr, UInt size)
return t;
}
#if COROUTINING
/* pointer to top of an arena */
static inline attvar_record *
DelayArenaPt(Term arena)
@ -181,6 +183,8 @@ GrowDelayArena(Term *arenap, UInt old_size, UInt size, UInt arity)
return arena;
}
#endif
static Term
NewArena(UInt size, UInt arity, CELL *where)
{
@ -247,7 +251,9 @@ p_allocate_default_arena(void)
return FALSE;
}
GlobalArena = NewArena(IntegerOfTerm(t), 2, NULL);
#if COROUTINING
GlobalDelayArena = NewDelayArena(2);
#endif
return TRUE;
}
@ -330,6 +336,8 @@ clean_dirty_tr(tr_fr_ptr TR0) {
}
}
#if COROUTINING
static int
CopyAttVar(CELL *orig, CELL ***to_visit_ptr, CELL *res, Term *att_arenap)
{
@ -361,6 +369,7 @@ CopyAttVar(CELL *orig, CELL ***to_visit_ptr, CELL *res, Term *att_arenap)
*att_arenap = (CELL)(newv);
return TRUE;
}
#endif
static int
copy_complex_term(register CELL *pt0, register CELL *pt0_end, CELL *ptf, CELL *HLow, Term *att_arenap)
@ -627,6 +636,7 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, CELL *ptf, CELL *H
reset_trail(TR0);
return -2;
#if COROUTINING
delay_overflow:
/* oops, we're in trouble */
H = HLow;
@ -644,6 +654,7 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, CELL *ptf, CELL *H
#endif
reset_trail(TR0);
return -2;
#endif
}
@ -655,10 +666,14 @@ CopyTermToArena(Term t, Term arena, UInt arity, Term *newarena, Term *att_arenap
CELL *oldHB = HB;
CELL *oldASP = ASP;
int res;
#if COROUTINING
Term old_delay_arena;
#endif
restart:
#if COROUTINING
old_delay_arena = *att_arenap;
#endif
t = Deref(t);
if (IsVarTerm(t)) {
ASP = ArenaLimit(arena);
@ -769,8 +784,10 @@ CopyTermToArena(Term t, Term arena, UInt arity, Term *newarena, Term *att_arenap
error_handler:
H = HB;
CloseArena(oldH, oldHB, oldASP, newarena, old_size);
#if COROUTINING
if (old_delay_arena != MkIntTerm(0))
ResetDelayArena(old_delay_arena, att_arenap);
#endif
XREGS[arity+1] = t;
XREGS[arity+2] = arena;
XREGS[arity+3] = (CELL)newarena;
@ -788,6 +805,7 @@ CopyTermToArena(Term t, Term arena, UInt arity, Term *newarena, Term *att_arenap
return 0L;
}
break;
#if COROUTINING
case -2:
/* handle delay arena overflow */
old_size = DelayArenaSz(*att_arenap);
@ -796,6 +814,7 @@ CopyTermToArena(Term t, Term arena, UInt arity, Term *newarena, Term *att_arenap
return 0L;
}
break;
#endif
default: /* temporary space overflow */
if (!Yap_ExpandPreAllocCodeSpace(0,NULL)) {
Yap_Error(OUT_OF_AUXSPACE_ERROR, TermNil, Yap_ErrorMessage);
@ -999,7 +1018,10 @@ p_nb_delete(void)
static Int
p_nb_queue(void)
{
Term queue_arena, delay_queue_arena, queue, ar[5], *nar;
Term queue_arena, queue, ar[5], *nar;
#if COROUTINING
Term delay_queue_arena;
#endif
Term t = Deref(ARG1);
UInt arena_sz = (H-H0)/16;
@ -1018,6 +1040,7 @@ p_nb_queue(void)
queue = Yap_MkApplTerm(FunctorNBQueue,5,ar);
if (!Yap_unify(queue,ARG1))
return FALSE;
#if COROUTINING
arena_sz = ((attvar_record *)H0- DelayTop())/16;
if (arena_sz <2)
arena_sz = 2;
@ -1029,6 +1052,7 @@ p_nb_queue(void)
}
nar = RepAppl(Deref(ARG1))+1;
nar[QUEUE_DELAY_ARENA] = delay_queue_arena;
#endif
if (arena_sz < 4*1024)
arena_sz = 4*1024;
queue_arena = NewArena(arena_sz,1,NULL);
@ -1080,6 +1104,7 @@ GetQueueArena(CELL *qd, char* caller)
return t;
}
#if COROUTINING
static void
RecoverDelayArena(Term delay_arena)
{
@ -1089,6 +1114,7 @@ RecoverDelayArena(Term delay_arena)
if (max == pt-DelayArenaSz(delay_arena))
SetDelayTop(pt);
}
#endif
static void
RecoverArena(Term arena)
@ -1116,8 +1142,10 @@ p_nb_queue_close(void)
}
if (qp[QUEUE_ARENA] != MkIntTerm(0))
RecoverArena(qp[QUEUE_ARENA]);
#if COROUTINING
if (qp[QUEUE_DELAY_ARENA] != MkIntTerm(0))
RecoverDelayArena(qp[QUEUE_DELAY_ARENA]);
#endif
if (qp[QUEUE_SIZE] == MkIntTerm(0)) {
return
Yap_unify(ARG3, ARG2);
@ -1293,7 +1321,10 @@ MkZeroApplTerm(Functor f, UInt sz)
static Int
p_nb_heap(void)
{
Term heap_arena, delay_heap_arena, heap, *ar, *nar;
Term heap_arena, heap, *ar, *nar;
#if COROUTINING
Term delay_heap_arena;
#endif
UInt hsize;
Term tsize = Deref(ARG1);
UInt arena_sz = (H-H0)/16;
@ -1331,6 +1362,7 @@ p_nb_heap(void)
}
nar = RepAppl(Deref(ARG2))+1;
nar[HEAP_ARENA] = heap_arena;
#if COROUTINING
arena_sz = ((attvar_record *)H0- DelayTop())/16;
if (arena_sz <2)
arena_sz = 2;
@ -1342,6 +1374,7 @@ p_nb_heap(void)
}
nar = RepAppl(Deref(ARG2))+1;
nar[HEAP_DELAY_ARENA] = delay_heap_arena;
#endif
return TRUE;
}
@ -1355,8 +1388,10 @@ p_nb_heap_close(void)
qp = RepAppl(t)+1;
if (qp[HEAP_ARENA] != MkIntTerm(0))
RecoverArena(qp[HEAP_ARENA]);
#if COROUTINING
if (qp[HEAP_DELAY_ARENA] != MkIntTerm(0))
RecoverDelayArena(qp[HEAP_DELAY_ARENA]);
#endif
qp[-1] = (CELL)Yap_MkFunctor(Yap_LookupAtom("heap"),1);
qp[0] = MkIntegerTerm(0);
return TRUE;
@ -1582,7 +1617,10 @@ p_nb_heap_size(void)
static Int
p_nb_beam(void)
{
Term beam_arena, delay_beam_arena, beam, *ar, *nar;
Term beam_arena, beam, *ar, *nar;
#if COROUTINING
Term delay_beam_arena;
#endif
UInt hsize;
Term tsize = Deref(ARG1);
UInt arena_sz = (H-H0)/16;
@ -1619,6 +1657,7 @@ p_nb_beam(void)
}
nar = RepAppl(Deref(ARG2))+1;
nar[HEAP_ARENA] = beam_arena;
#if COROUTINING
arena_sz = ((attvar_record *)H0- DelayTop())/16;
if (arena_sz <2)
arena_sz = 2;
@ -1630,6 +1669,7 @@ p_nb_beam(void)
}
nar = RepAppl(Deref(ARG2))+1;
nar[HEAP_DELAY_ARENA] = delay_beam_arena;
#endif
return TRUE;
}

View File

@ -599,7 +599,8 @@ static_growglobal(long size, CELL **ptr, CELL *hsplit)
return FALSE;
else if (hsplit == (CELL *)omax)
hsplit = NULL;
if (size+H < ASP+4096) {
if (size+H < ASP+4096 &&
hsplit > H0) {
/* don't need to expand stacks */
do_grow = FALSE;
}

View File

@ -337,10 +337,10 @@ write_var(CELL *t, struct write_globs *wglb)
Yap_Portray_delays = TRUE;
return;
}
#endif
#endif
wrputc('D', wglb->writech);
wrputn((Int) ((attvar_record *)H0-(attvar_record *)t),wglb->writech);
#endif
} else {
wrputn(((Int) (t- H0)),wglb->writech);
}

View File

@ -135,5 +135,4 @@ file_search_path(system, Dir) :-
:- dynamic library_directory/1.
:- yap_flag(index,single).