diff --git a/C/absmi.c b/C/absmi.c index 8c45b6e65..1cddc7e99 100644 --- a/C/absmi.c +++ b/C/absmi.c @@ -10,8 +10,11 @@ * * * File: absmi.c * * comments: Portable abstract machine interpreter * -* Last rev: $Date: 2008-04-04 16:11:40 $,$Author: vsc $ * +* Last rev: $Date: 2008-06-04 14:47:18 $,$Author: vsc $ * * $Log: not supported by cvs2svn $ +* Revision 1.240 2008/04/04 16:11:40 vsc +* yapor had gotten broken with recent thread changes +* * Revision 1.239 2008/04/03 13:26:37 vsc * protect signal handling with locks for threaded version. * fix close/1 entry in manual (obs from Nicos). @@ -2192,182 +2195,7 @@ Yap_absmi(int inp) #endif /* TABLING */ trim_trail: HBREG = PROTECT_FROZEN_H(B->cp_b); -#ifdef FROZEN_STACKS - { - tr_fr_ptr pt0, pt1, pbase; - - pbase = B->cp_tr; - pt0 = pt1 = TR - 1; - while (pt1 >= pbase) { - BEGD(d1); - d1 = TrailTerm(pt1); - if (IsVarTerm(d1)) { - if (d1 < (CELL)HBREG || d1 > Unsigned(B->cp_b)) { - TrailTerm(pt0) = d1; - TrailVal(pt0) = TrailVal(pt1); - pt0--; - } - pt1--; - } else if (IsPairTerm(d1)) { - CELL *pt = RepPair(d1); -#ifdef LIMIT_TABLING - if ((ADDR) pt == Yap_TrailBase) { - sg_fr_ptr sg_fr = (sg_fr_ptr) TrailVal(pt1); - SgFr_state(sg_fr)--; /* complete_in_use --> complete : compiled_in_use --> compiled */ - insert_into_global_sg_fr_list(sg_fr); - } else -#endif /* LIMIT_TABLING */ - if ((ADDR) pt >= Yap_TrailBase) { - /* skip, this is a problem because we lose information, - namely active references */ - pt1 = (tr_fr_ptr)pt; - } else if (IN_BETWEEN(Yap_GlobalBase, pt, H0)) { - CELL val = Deref(*pt); - if (IsVarTerm(val)) { - Bind(pt, MkAtomTerm(AtomCut)); - Yap_WakeUp(pt); - } - pt1--; - } else if ((*pt & (LogUpdMask|IndexMask)) == (LogUpdMask|IndexMask)) { - LogUpdIndex *cl = ClauseFlagsToLogUpdIndex(pt); - int erase; -#if defined(THREADS) || defined(YAPOR) - PredEntry *ap = cl->ClPred; -#endif - - LOCK(ap->PELock); - DEC_CLREF_COUNT(cl); - cl->ClFlags &= ~InUseMask; - erase = (cl->ClFlags & (ErasedMask|DirtyMask)) && !(cl->ClRefCount); - if (erase) { - /* at this point, we are the only ones accessing the clause, - hence we don't need to have a lock it */ - saveregs(); - if (cl->ClFlags & ErasedMask) - Yap_ErLogUpdIndex(cl); - else - Yap_CleanUpIndex(cl); - setregs(); - } - UNLOCK(ap->PELock); - } else { - TrailTerm(pt0) = d1; - TrailVal(pt0) = TrailVal(pt1); - pt0--; - } - pt1--; - } else if (IsApplTerm(d1)) { - if (IN_BETWEEN(HBREG,RepAppl(d1),B->cp_b)) { - /* deterministic binding to multi-assignment variable */ - pt1 -= 2; - } else { - TrailVal(pt0) = TrailVal(pt1); - TrailTerm(pt0) = d1; - TrailVal(pt0-1) = TrailVal(pt1-1); - TrailTerm(pt0-1) = TrailTerm(pt1-1); - pt0 -= 2; - pt1 -= 2; - } - } else { - TrailTerm(pt0) = d1; - TrailVal(pt0) = TrailVal(pt1); - pt0--; - pt1--; - } - ENDD(d1); - } - if (pt0 != pt1) { - int size; - pt0++; - size = TR - pt0; - memcpy(pbase, pt0, size * sizeof(struct trail_frame)); - TR = pbase + size; - } - } -#else - { - tr_fr_ptr pt1, pt0; - pt1 = pt0 = B->cp_tr; - while (pt1 != TR) { - BEGD(d1); - d1 = TrailTerm(pt1); - if (IsVarTerm(d1)) { - if (d1 < (CELL)HBREG || d1 > Unsigned(B->cp_b)) { -#ifdef FROZEN_STACKS - TrailVal(pt0) = TrailVal(pt1); -#endif /* FROZEN_STACKS */ - TrailTerm(pt0) = d1; - pt0++; - } - pt1++; - } else if (IsApplTerm(d1)) { - if (IN_BETWEEN(HBREG,RepAppl(d1),B->cp_b)) { -#ifdef FROZEN_STACKS - pt1 += 2; -#else - pt1 += 3; -#endif - } else { -#ifdef FROZEN_STACKS - TrailVal(pt0) = TrailVal(pt1); - TrailTerm(pt0) = d1; - TrailVal(pt0+1) = TrailVal(pt1+1); - TrailTerm(pt0+1) = TrailTerm(pt1+1); - pt0 += 2; - pt1 += 2; -#else - TrailTerm(pt0+1) = TrailTerm(pt1+1); - TrailTerm(pt0) = TrailTerm(pt0+2) = d1; - pt0 += 3; - pt1 += 3; -#endif /* FROZEN_STACKS */ - } - } else if (IsPairTerm(d1)) { - CELL *pt = RepPair(d1); - - if (IN_BETWEEN(Yap_GlobalBase, pt, H0)) { - CELL val = Deref(*pt); - if (IsVarTerm(val)) { - Bind(VarOfTerm(val), MkAtomTerm(AtomCut)); - Yap_WakeUp(pt); - } - } else if ((*pt & (LogUpdMask|IndexMask)) == (LogUpdMask|IndexMask)) { - LogUpdIndex *cl = ClauseFlagsToLogUpdIndex(pt); -#if defined(YAPOR) || defined(THREADS) - PredEntry *ap = cl->ClPred; -#endif - int erase; - - LOCK(ap->PELock); - DEC_CLREF_COUNT(cl); - cl->ClFlags &= ~InUseMask; - erase = (cl->ClFlags & (DirtyMask|ErasedMask)) && !(cl->ClRefCount); - if (erase) { - /* at this point, we are the only ones accessing the clause, - hence we don't need to have a lock it */ - saveregs(); - if (cl->ClFlags & ErasedMask) - Yap_ErLogUpdIndex(cl); - else - Yap_CleanUpIndex(cl); - setregs(); - } - UNLOCK(ap->PELock); - } else { - TrailTerm(pt0) = d1; - pt0++; - } - pt1++; - } else { - TrailTerm(pt0) = d1; - pt0++; - pt1++; - } - ENDD(d1); - } - TR = pt0; - } -#endif /* FROZEN_STACKS */ +#include "trim_trail.h" B = B->cp_b; SET_BB(PROTECT_FROZEN_B(B)); } diff --git a/C/c_interface.c b/C/c_interface.c index 903986744..de8035ad2 100644 --- a/C/c_interface.c +++ b/C/c_interface.c @@ -10,8 +10,11 @@ * File: c_interface.c * * comments: c_interface primitives definition * * * -* Last rev: $Date: 2008-06-04 13:58:36 $,$Author: vsc $ * +* Last rev: $Date: 2008-06-04 14:47:18 $,$Author: vsc $ * * $Log: not supported by cvs2svn $ +* Revision 1.117 2008/06/04 13:58:36 vsc +* more fixes to C-interface +* * Revision 1.116 2008/04/28 23:02:32 vsc * fix bug in current_predicate/2 * fix bug in c_interface. @@ -964,6 +967,7 @@ YAP_cut_up(void) B = B->cp_b; /* cut_fail */ #endif HB = B->cp_h; /* cut_fail */ + Yap_TrimTrail(); RECOVER_B(); } @@ -1407,6 +1411,8 @@ YAP_LeaveGoal(int backtrack, YAP_dogoalinfo *dgi) DEPTH = B->cp_depth; #endif /* DEPTH_LIMIT */ YENV = ENV = B->cp_env; + } else { + Yap_TrimTrail(); } /* recover local stack */ ASP = (CELL *)(B+1); @@ -1464,6 +1470,7 @@ YAP_RunGoalOnce(Term t) CUT_prune_to(cut_pt); #endif B = cut_pt; + Yap_TrimTrail(); } ASP = B->cp_env; ENV = (CELL *)ASP[E_E]; @@ -1530,6 +1537,7 @@ YAP_ShutdownGoal(int backtrack) ASP = cut_pt->cp_env; ENV = (CELL *)ASP[E_E]; B = (choiceptr)ASP[E_CB]; + Yap_TrimTrail(); #ifdef DEPTH_LIMIT DEPTH = ASP[E_DEPTH]; #endif @@ -1563,6 +1571,7 @@ YAP_PruneGoal(void) } B = B->cp_b; + Yap_TrimTrail(); RECOVER_B(); } diff --git a/C/exec.c b/C/exec.c index 0c45810f5..64b492be2 100644 --- a/C/exec.c +++ b/C/exec.c @@ -1789,7 +1789,7 @@ p_restore_regs2(void) #endif /* TABLING */ B = pt0; HB = B->cp_h; - /* trim_trail();*/ + Yap_TrimTrail(); } return(TRUE); } @@ -1852,7 +1852,8 @@ p_cut_up_to_next_disjunction(void) { abolish_incomplete_subgoals(B); #endif /* TABLING */ } - /* trim_trail(); */ + HB = B->cp_h; + Yap_TrimTrail(); return TRUE; } diff --git a/C/inlines.c b/C/inlines.c index 455f03e57..3161d6dad 100755 --- a/C/inlines.c +++ b/C/inlines.c @@ -801,7 +801,7 @@ p_cut_by( void) #endif /* TABLING */ B = pt0; HB = B->cp_h; - /* trim_trail();*/ + Yap_TrimTrail(); } ENDCHO(pt0); return(TRUE); diff --git a/C/unify.c b/C/unify.c index 0dd18c348..40f64f2bc 100644 --- a/C/unify.c +++ b/C/unify.c @@ -680,3 +680,8 @@ Yap_InitAbsmi(void) #endif } +void +Yap_TrimTrail(void) +{ +#include "trim_trail.h" +} diff --git a/H/Yapproto.h b/H/Yapproto.h index 7c8c906f0..9c0cbc4bf 100644 --- a/H/Yapproto.h +++ b/H/Yapproto.h @@ -10,7 +10,7 @@ * File: Yap.proto * * mods: * * comments: Function declarations for YAP * -* version: $Id: Yapproto.h,v 1.85 2008-03-27 00:41:32 vsc Exp $ * +* version: $Id: Yapproto.h,v 1.86 2008-06-04 14:47:18 vsc Exp $ * *************************************************************************/ /* prototype file for Yap */ @@ -325,6 +325,7 @@ void STD_PROTO(Yap_InitLowLevelTrace,(void)); /* unify.c */ void STD_PROTO(Yap_InitAbsmi,(void)); void STD_PROTO(Yap_InitUnify,(void)); +void STD_PROTO(Yap_TrimTrail,(void)); int STD_PROTO(Yap_IUnify,(register CELL d0,register CELL d1)); /* userpreds.c */ diff --git a/H/trim_trail.h b/H/trim_trail.h new file mode 100644 index 000000000..79cd58bb0 --- /dev/null +++ b/H/trim_trail.h @@ -0,0 +1,176 @@ +#ifdef FROZEN_STACKS + { + tr_fr_ptr pt0, pt1, pbase; + + pbase = B->cp_tr; + pt0 = pt1 = TR - 1; + while (pt1 >= pbase) { + BEGD(d1); + d1 = TrailTerm(pt1); + if (IsVarTerm(d1)) { + if (d1 < (CELL)HBREG || d1 > Unsigned(B->cp_b)) { + TrailTerm(pt0) = d1; + TrailVal(pt0) = TrailVal(pt1); + pt0--; + } + pt1--; + } else if (IsPairTerm(d1)) { + CELL *pt = RepPair(d1); +#ifdef LIMIT_TABLING + if ((ADDR) pt == Yap_TrailBase) { + sg_fr_ptr sg_fr = (sg_fr_ptr) TrailVal(pt1); + SgFr_state(sg_fr)--; /* complete_in_use --> complete : compiled_in_use --> compiled */ + insert_into_global_sg_fr_list(sg_fr); + } else +#endif /* LIMIT_TABLING */ + if ((ADDR) pt >= Yap_TrailBase) { + /* skip, this is a problem because we lose information, + namely active references */ + pt1 = (tr_fr_ptr)pt; + } else if (IN_BETWEEN(Yap_GlobalBase, pt, H0)) { + CELL val = Deref(*pt); + if (IsVarTerm(val)) { + Bind(pt, MkAtomTerm(AtomCut)); + Yap_WakeUp(pt); + } + pt1--; + } else if ((*pt & (LogUpdMask|IndexMask)) == (LogUpdMask|IndexMask)) { + LogUpdIndex *cl = ClauseFlagsToLogUpdIndex(pt); + int erase; +#if defined(THREADS) || defined(YAPOR) + PredEntry *ap = cl->ClPred; +#endif + + LOCK(ap->PELock); + DEC_CLREF_COUNT(cl); + cl->ClFlags &= ~InUseMask; + erase = (cl->ClFlags & (ErasedMask|DirtyMask)) && !(cl->ClRefCount); + if (erase) { + /* at this point, we are the only ones accessing the clause, + hence we don't need to have a lock it */ + saveregs(); + if (cl->ClFlags & ErasedMask) + Yap_ErLogUpdIndex(cl); + else + Yap_CleanUpIndex(cl); + setregs(); + } + UNLOCK(ap->PELock); + } else { + TrailTerm(pt0) = d1; + TrailVal(pt0) = TrailVal(pt1); + pt0--; + } + pt1--; + } else if (IsApplTerm(d1)) { + if (IN_BETWEEN(HBREG,RepAppl(d1),B->cp_b)) { + /* deterministic binding to multi-assignment variable */ + pt1 -= 2; + } else { + TrailVal(pt0) = TrailVal(pt1); + TrailTerm(pt0) = d1; + TrailVal(pt0-1) = TrailVal(pt1-1); + TrailTerm(pt0-1) = TrailTerm(pt1-1); + pt0 -= 2; + pt1 -= 2; + } + } else { + TrailTerm(pt0) = d1; + TrailVal(pt0) = TrailVal(pt1); + pt0--; + pt1--; + } + ENDD(d1); + } + if (pt0 != pt1) { + int size; + pt0++; + size = TR - pt0; + memcpy(pbase, pt0, size * sizeof(struct trail_frame)); + TR = pbase + size; + } + } +#else + { + tr_fr_ptr pt1, pt0; + pt1 = pt0 = B->cp_tr; + while (pt1 != TR) { + BEGD(d1); + d1 = TrailTerm(pt1); + if (IsVarTerm(d1)) { + if (d1 < (CELL)HBREG || d1 > Unsigned(B->cp_b)) { +#ifdef FROZEN_STACKS + TrailVal(pt0) = TrailVal(pt1); +#endif /* FROZEN_STACKS */ + TrailTerm(pt0) = d1; + pt0++; + } + pt1++; + } else if (IsApplTerm(d1)) { + if (IN_BETWEEN(HBREG,RepAppl(d1),B->cp_b)) { +#ifdef FROZEN_STACKS + pt1 += 2; +#else + pt1 += 3; +#endif + } else { +#ifdef FROZEN_STACKS + TrailVal(pt0) = TrailVal(pt1); + TrailTerm(pt0) = d1; + TrailVal(pt0+1) = TrailVal(pt1+1); + TrailTerm(pt0+1) = TrailTerm(pt1+1); + pt0 += 2; + pt1 += 2; +#else + TrailTerm(pt0+1) = TrailTerm(pt1+1); + TrailTerm(pt0) = TrailTerm(pt0+2) = d1; + pt0 += 3; + pt1 += 3; +#endif /* FROZEN_STACKS */ + } + } else if (IsPairTerm(d1)) { + CELL *pt = RepPair(d1); + + if (IN_BETWEEN(Yap_GlobalBase, pt, H0)) { + CELL val = Deref(*pt); + if (IsVarTerm(val)) { + Bind(VarOfTerm(val), MkAtomTerm(AtomCut)); + Yap_WakeUp(pt); + } + } else if ((*pt & (LogUpdMask|IndexMask)) == (LogUpdMask|IndexMask)) { + LogUpdIndex *cl = ClauseFlagsToLogUpdIndex(pt); +#if defined(YAPOR) || defined(THREADS) + PredEntry *ap = cl->ClPred; +#endif + int erase; + + LOCK(ap->PELock); + DEC_CLREF_COUNT(cl); + cl->ClFlags &= ~InUseMask; + erase = (cl->ClFlags & (DirtyMask|ErasedMask)) && !(cl->ClRefCount); + if (erase) { + /* at this point, we are the only ones accessing the clause, + hence we don't need to have a lock it */ + saveregs(); + if (cl->ClFlags & ErasedMask) + Yap_ErLogUpdIndex(cl); + else + Yap_CleanUpIndex(cl); + setregs(); + } + UNLOCK(ap->PELock); + } else { + TrailTerm(pt0) = d1; + pt0++; + } + pt1++; + } else { + TrailTerm(pt0) = d1; + pt0++; + pt1++; + } + ENDD(d1); + } + TR = pt0; + } +#endif /* FROZEN_STACKS */ diff --git a/Makefile.in b/Makefile.in index 8bd2b1d9a..c3e0dfb64 100644 --- a/Makefile.in +++ b/Makefile.in @@ -111,8 +111,9 @@ HEADERS = \ $(srcdir)/H/index.h $(srcdir)/H/iopreds.h \ $(srcdir)/H/rclause.h \ $(srcdir)/H/rheap.h \ - $(srcdir)/H/tracer.h \ $(srcdir)/H/threads.h \ + $(srcdir)/H/tracer.h \ + $(srcdir)/H/trim_trail.h \ $(srcdir)/H/yapio.h \ $(srcdir)/BEAM/eam.h $(srcdir)/BEAM/eamamasm.h \ $(srcdir)/OPTYap/opt.config.h \