trail_ref cleanup
git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@64 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
parent
be02a4f6ab
commit
95a113aac9
21
C/absmi.c
21
C/absmi.c
@ -904,11 +904,11 @@ absmi(int inp)
|
|||||||
#if defined(YAPOR) || defined(THREADS)
|
#if defined(YAPOR) || defined(THREADS)
|
||||||
/* just store a reference */
|
/* just store a reference */
|
||||||
INC_CLREF_COUNT(cl);
|
INC_CLREF_COUNT(cl);
|
||||||
TRAIL_REF(&(cl->ClFlags));
|
TRAIL_CLREF(cl);
|
||||||
#else
|
#else
|
||||||
if (!(cl->ClFlags & InUseMask)) {
|
if (!(cl->ClFlags & InUseMask)) {
|
||||||
cl->ClFlags |= InUseMask;
|
cl->ClFlags |= InUseMask;
|
||||||
TRAIL_REF(&(cl->ClFlags));
|
TRAIL_CLREF(cl);
|
||||||
cl->u2.ClUse = TR-(tr_fr_ptr)(TrailBase);
|
cl->u2.ClUse = TR-(tr_fr_ptr)(TrailBase);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -967,7 +967,7 @@ absmi(int inp)
|
|||||||
LOCK(cl->ClLock);
|
LOCK(cl->ClLock);
|
||||||
/* always add an extra reference */
|
/* always add an extra reference */
|
||||||
INC_CLREF_COUNT(cl);
|
INC_CLREF_COUNT(cl);
|
||||||
TRAIL_REF(&(cl->ClFlags));
|
TRAIL_CLREF(cl);
|
||||||
UNLOCK(cl->ClLock);
|
UNLOCK(cl->ClLock);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@ -978,7 +978,7 @@ absmi(int inp)
|
|||||||
PREG->u.EC.ClTrail = TR-(tr_fr_ptr)TrailBase;
|
PREG->u.EC.ClTrail = TR-(tr_fr_ptr)TrailBase;
|
||||||
PREG->u.EC.ClENV = LCL0-YENV;
|
PREG->u.EC.ClENV = LCL0-YENV;
|
||||||
cl->ClFlags |= InUseMask;
|
cl->ClFlags |= InUseMask;
|
||||||
TRAIL_REF(&(cl->ClFlags));
|
TRAIL_CLREF(cl);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
PREG = NEXTOP(PREG, EC);
|
PREG = NEXTOP(PREG, EC);
|
||||||
@ -1104,14 +1104,12 @@ absmi(int inp)
|
|||||||
#if defined(YAPOR) || defined(THREADS)
|
#if defined(YAPOR) || defined(THREADS)
|
||||||
INC_CLREF_COUNT(ClauseCodeToClause(PREG));
|
INC_CLREF_COUNT(ClauseCodeToClause(PREG));
|
||||||
UNLOCK(DynamicLock(PREG));
|
UNLOCK(DynamicLock(PREG));
|
||||||
TRAIL_REF((CELL *)&DynamicFlags(PREG));
|
TRAIL_CLREF(ClauseCodeToClause(PREG));
|
||||||
#else
|
#else
|
||||||
if (FlagOff(InUseMask, DynamicFlags(PREG))) {
|
if (FlagOff(InUseMask, DynamicFlags(PREG))) {
|
||||||
CELL *pt0 = (CELL *)&DynamicFlags(PREG);
|
|
||||||
|
|
||||||
SetFlag(InUseMask, DynamicFlags(PREG));
|
SetFlag(InUseMask, DynamicFlags(PREG));
|
||||||
|
TRAIL_CLREF(ClauseCodeToClause(PREG));
|
||||||
TRAIL_REF(pt0);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
PREG = NEXTOP(PREG,ld);
|
PREG = NEXTOP(PREG,ld);
|
||||||
@ -1149,14 +1147,13 @@ absmi(int inp)
|
|||||||
ENDCACHE_Y();
|
ENDCACHE_Y();
|
||||||
#if defined(YAPOR) || defined(THREADS)
|
#if defined(YAPOR) || defined(THREADS)
|
||||||
INC_CLREF_COUNT(ClauseCodeToClause(PREG));
|
INC_CLREF_COUNT(ClauseCodeToClause(PREG));
|
||||||
TRAIL_REF((CELL *)&DynamicFlags(PREG));
|
TRAIL_CLREF(ClauseCodeToClause(PREG));
|
||||||
UNLOCK(DynamicLock(PREG));
|
UNLOCK(DynamicLock(PREG));
|
||||||
#else
|
#else
|
||||||
if (FlagOff(InUseMask, DynamicFlags(PREG))) {
|
if (FlagOff(InUseMask, DynamicFlags(PREG))) {
|
||||||
CELL *pt0 = (CELL *)&DynamicFlags(PREG);
|
|
||||||
|
|
||||||
SetFlag(InUseMask, DynamicFlags(PREG));
|
SetFlag(InUseMask, DynamicFlags(PREG));
|
||||||
TRAIL_REF(pt0);
|
TRAIL_CLREF(ClauseCodeToClause(PREG));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
PREG = NEXTOP(PREG,ld);
|
PREG = NEXTOP(PREG,ld);
|
||||||
@ -1212,7 +1209,7 @@ absmi(int inp)
|
|||||||
#endif /* SBA */
|
#endif /* SBA */
|
||||||
{
|
{
|
||||||
TR = TR_FZ;
|
TR = TR_FZ;
|
||||||
TRAIL_REF(pt0);
|
TRAIL_LINK(pt0);
|
||||||
}
|
}
|
||||||
#endif /* FROZEN_REGS */
|
#endif /* FROZEN_REGS */
|
||||||
SP = SP0;
|
SP = SP0;
|
||||||
|
@ -234,12 +234,12 @@ AccessNamedArray(Atom a, Int indx)
|
|||||||
#if defined(YAPOR) || defined(THREADS)
|
#if defined(YAPOR) || defined(THREADS)
|
||||||
LOCK(ref->lock);
|
LOCK(ref->lock);
|
||||||
INC_DBREF_COUNT(ref);
|
INC_DBREF_COUNT(ref);
|
||||||
TRAIL_REF(&(ref->Flags)); /* So that fail will erase it */
|
TRAIL_REF(ref); /* So that fail will erase it */
|
||||||
UNLOCK(ref->lock);
|
UNLOCK(ref->lock);
|
||||||
#else
|
#else
|
||||||
if (!(ref->Flags & InUseMask)) {
|
if (!(ref->Flags & InUseMask)) {
|
||||||
ref->Flags |= InUseMask;
|
ref->Flags |= InUseMask;
|
||||||
TRAIL_REF(&(ref->Flags)); /* So that fail will erase it */
|
TRAIL_REF(ref); /* So that fail will erase it */
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
|
@ -1413,14 +1413,14 @@ p_find_dynamic(void)
|
|||||||
{
|
{
|
||||||
Clause *cl = ClauseCodeToClause(q);
|
Clause *cl = ClauseCodeToClause(q);
|
||||||
LOCK(cl->ClLock);
|
LOCK(cl->ClLock);
|
||||||
TRAIL_REF((CELL *)(cl->ClFlags));
|
TRAIL_CLREF(cl->ClFlags);
|
||||||
INC_CLREF_COUNT(cl);
|
INC_CLREF_COUNT(cl);
|
||||||
UNLOCK(cl->ClLock);
|
UNLOCK(cl->ClLock);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if (!(ClauseCodeToClause(q)->ClFlags & InUseMask)) {
|
if (!(ClauseCodeToClause(q)->ClFlags & InUseMask)) {
|
||||||
OPREG *opp = &(ClauseCodeToClause(q)->ClFlags);
|
OPREG *opp = &(ClauseCodeToClause(q)->ClFlags);
|
||||||
TRAIL_REF(opp);
|
TRAIL_CLREF(ClauseCodeToClause(q));
|
||||||
*opp |= InUseMask;
|
*opp |= InUseMask;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
70
C/dbase.c
70
C/dbase.c
@ -1475,7 +1475,7 @@ record(int Flag, Term key, Term t_data, Term t_code)
|
|||||||
}
|
}
|
||||||
if ((Flag & MkIfNot) && found_one)
|
if ((Flag & MkIfNot) && found_one)
|
||||||
return (NULL);
|
return (NULL);
|
||||||
TRAIL_REF(&(x->Flags));
|
TRAIL_REF(x);
|
||||||
if (x->Flags & (DBNoVars|DBComplex))
|
if (x->Flags & (DBNoVars|DBComplex))
|
||||||
x->Mask = EvalMasks(t_data, &x->Key);
|
x->Mask = EvalMasks(t_data, &x->Key);
|
||||||
else
|
else
|
||||||
@ -2266,13 +2266,13 @@ i_log_upd_recorded(LogUpdDBProp AtProp)
|
|||||||
if (unify(ARG3, TRef)) {
|
if (unify(ARG3, TRef)) {
|
||||||
#if defined(YAPOR) || defined(THREADS)
|
#if defined(YAPOR) || defined(THREADS)
|
||||||
LOCK(ref->lock);
|
LOCK(ref->lock);
|
||||||
TRAIL_REF(&(ref->Flags)); /* So that fail will erase it */
|
TRAIL_REF(ref); /* So that fail will erase it */
|
||||||
INC_DBREF_COUNT(ref);
|
INC_DBREF_COUNT(ref);
|
||||||
UNLOCK(ref->lock);
|
UNLOCK(ref->lock);
|
||||||
#else
|
#else
|
||||||
if (!(ref->Flags & InUseMask)) {
|
if (!(ref->Flags & InUseMask)) {
|
||||||
ref->Flags |= InUseMask;
|
ref->Flags |= InUseMask;
|
||||||
TRAIL_REF(&(ref->Flags)); /* So that fail will erase it */
|
TRAIL_REF(ref); /* So that fail will erase it */
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
cut_succeed();
|
cut_succeed();
|
||||||
@ -2285,25 +2285,25 @@ i_log_upd_recorded(LogUpdDBProp AtProp)
|
|||||||
EXTRA_CBACK_ARG(3,1) = AbsAppl((CELL *)ep);
|
EXTRA_CBACK_ARG(3,1) = AbsAppl((CELL *)ep);
|
||||||
#if defined(YAPOR) || defined(THREADS)
|
#if defined(YAPOR) || defined(THREADS)
|
||||||
LOCK(table->lock);
|
LOCK(table->lock);
|
||||||
TRAIL_REF(&(table->Flags)); /* So that fail will erase it */
|
TRAIL_REF(table); /* So that fail will erase it */
|
||||||
INC_DBREF_COUNT(table);
|
INC_DBREF_COUNT(table);
|
||||||
UNLOCK(table->lock);
|
UNLOCK(table->lock);
|
||||||
LOCK(ref->lock);
|
LOCK(ref->lock);
|
||||||
TRAIL_REF(&(ref->Flags)); /* So that fail will erase it */
|
TRAIL_REF(ref); /* So that fail will erase it */
|
||||||
INC_DBREF_COUNT(ref);
|
INC_DBREF_COUNT(ref);
|
||||||
UNLOCK(ref->lock);
|
UNLOCK(ref->lock);
|
||||||
#else
|
#else
|
||||||
if (!(table->Flags & InUseMask)) {
|
if (!(table->Flags & InUseMask)) {
|
||||||
table->Flags |= InUseMask;
|
table->Flags |= InUseMask;
|
||||||
if (B->cp_tr == TR) {
|
if (B->cp_tr == TR) {
|
||||||
TRAIL_REF(&(table->Flags)); /* So that fail will erase it */
|
TRAIL_REF(table); /* So that fail will erase it */
|
||||||
|
|
||||||
B->cp_tr = TR; /* protect this entry so that it will not be
|
B->cp_tr = TR; /* protect this entry so that it will not be
|
||||||
undone by backtracking */
|
undone by backtracking */
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
Term new;
|
Term new;
|
||||||
TRAIL_REF(&(table->Flags)); /* So that fail will erase it */
|
TRAIL_REF(table); /* So that fail will erase it */
|
||||||
/* swap this with what was pointed by the choicepoint */
|
/* swap this with what was pointed by the choicepoint */
|
||||||
new = TrailTerm(TR-1);
|
new = TrailTerm(TR-1);
|
||||||
TrailTerm(TR-1) = TrailTerm(B->cp_tr);
|
TrailTerm(TR-1) = TrailTerm(B->cp_tr);
|
||||||
@ -2321,7 +2321,7 @@ i_log_upd_recorded(LogUpdDBProp AtProp)
|
|||||||
}
|
}
|
||||||
if (!(ref->Flags & InUseMask)) {
|
if (!(ref->Flags & InUseMask)) {
|
||||||
ref->Flags |= InUseMask;
|
ref->Flags |= InUseMask;
|
||||||
TRAIL_REF(&(ref->Flags)); /* So that fail will erase it */
|
TRAIL_REF(ref); /* So that fail will erase it */
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return (unify(ARG3, TRef));
|
return (unify(ARG3, TRef));
|
||||||
@ -2469,13 +2469,13 @@ i_recorded(DBProp AtProp)
|
|||||||
TRef = MkDBRefTerm(ref);
|
TRef = MkDBRefTerm(ref);
|
||||||
#if defined(YAPOR) || defined(THREADS)
|
#if defined(YAPOR) || defined(THREADS)
|
||||||
LOCK(ref->lock);
|
LOCK(ref->lock);
|
||||||
TRAIL_REF(&(ref->Flags)); /* So that fail will erase it */
|
TRAIL_REF(ref); /* So that fail will erase it */
|
||||||
INC_DBREF_COUNT(ref);
|
INC_DBREF_COUNT(ref);
|
||||||
UNLOCK(ref->lock);
|
UNLOCK(ref->lock);
|
||||||
#else
|
#else
|
||||||
if (!(ref->Flags & InUseMask)) {
|
if (!(ref->Flags & InUseMask)) {
|
||||||
ref->Flags |= InUseMask;
|
ref->Flags |= InUseMask;
|
||||||
TRAIL_REF(&(ref->Flags)); /* So that fail will erase it */
|
TRAIL_REF(ref); /* So that fail will erase it */
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return (unify(ARG3, TRef));
|
return (unify(ARG3, TRef));
|
||||||
@ -2562,13 +2562,13 @@ c_log_upd_recorded(DBRef *ep, int flags)
|
|||||||
EXTRA_CBACK_ARG(3,1) = AbsAppl((CELL *)ep);
|
EXTRA_CBACK_ARG(3,1) = AbsAppl((CELL *)ep);
|
||||||
#if defined(YAPOR) || defined(THREADS)
|
#if defined(YAPOR) || defined(THREADS)
|
||||||
LOCK(ref->lock);
|
LOCK(ref->lock);
|
||||||
TRAIL_REF(&(ref->Flags)); /* So that fail will erase it */
|
TRAIL_REF(ref); /* So that fail will erase it */
|
||||||
INC_DBREF_COUNT(ref);
|
INC_DBREF_COUNT(ref);
|
||||||
UNLOCK(ref->lock);
|
UNLOCK(ref->lock);
|
||||||
#else
|
#else
|
||||||
if (!(ref->Flags & InUseMask)) {
|
if (!(ref->Flags & InUseMask)) {
|
||||||
ref->Flags |= InUseMask;
|
ref->Flags |= InUseMask;
|
||||||
TRAIL_REF(&(ref->Flags)); /* So that fail will erase it */
|
TRAIL_REF(ref); /* So that fail will erase it */
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (!unify(ARG3, TRef))
|
if (!unify(ARG3, TRef))
|
||||||
@ -2705,13 +2705,13 @@ c_recorded(int flags)
|
|||||||
EXTRA_CBACK_ARG(3,1) = (CELL)ref;
|
EXTRA_CBACK_ARG(3,1) = (CELL)ref;
|
||||||
#if defined(YAPOR) || defined(THREADS)
|
#if defined(YAPOR) || defined(THREADS)
|
||||||
LOCK(ref->lock);
|
LOCK(ref->lock);
|
||||||
TRAIL_REF(&(ref->Flags)); /* So that fail will erase it */
|
TRAIL_REF(ref); /* So that fail will erase it */
|
||||||
INC_DBREF_COUNT(ref);
|
INC_DBREF_COUNT(ref);
|
||||||
UNLOCK(ref->lock);
|
UNLOCK(ref->lock);
|
||||||
#else
|
#else
|
||||||
if (!(ref->Flags & InUseMask)) {
|
if (!(ref->Flags & InUseMask)) {
|
||||||
ref->Flags |= InUseMask;
|
ref->Flags |= InUseMask;
|
||||||
TRAIL_REF(&(ref->Flags)); /* So that fail will erase it */
|
TRAIL_REF(ref); /* So that fail will erase it */
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return (unify(ARG3, TRef));
|
return (unify(ARG3, TRef));
|
||||||
@ -2843,13 +2843,13 @@ p_first_instance(void)
|
|||||||
/* we have a pointer to the term available */
|
/* we have a pointer to the term available */
|
||||||
#if defined(YAPOR) || defined(THREADS)
|
#if defined(YAPOR) || defined(THREADS)
|
||||||
LOCK(ref->lock);
|
LOCK(ref->lock);
|
||||||
TRAIL_REF(&(ref->Flags)); /* So that fail will erase it */
|
TRAIL_REF(ref); /* So that fail will erase it */
|
||||||
INC_DBREF_COUNT(ref);
|
INC_DBREF_COUNT(ref);
|
||||||
UNLOCK(ref->lock);
|
UNLOCK(ref->lock);
|
||||||
#else
|
#else
|
||||||
if (!(ref->Flags & InUseMask)) {
|
if (!(ref->Flags & InUseMask)) {
|
||||||
ref->Flags |= InUseMask;
|
ref->Flags |= InUseMask;
|
||||||
TRAIL_REF(&(ref->Flags)); /* So that fail will erase it */
|
TRAIL_REF(ref); /* So that fail will erase it */
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
while ((TermDB = GetDBTerm(ref)) == (CELL)0) {
|
while ((TermDB = GetDBTerm(ref)) == (CELL)0) {
|
||||||
@ -3031,14 +3031,14 @@ find_next_clause(DBRef ref0)
|
|||||||
Clause *cl = ClauseCodeToClause(newp);
|
Clause *cl = ClauseCodeToClause(newp);
|
||||||
|
|
||||||
LOCK(cl->ClLock);
|
LOCK(cl->ClLock);
|
||||||
TRAIL_REF(&(cl->ClFlags));
|
TRAIL_CLREF(cl));
|
||||||
INC_DBREF_COUNT(cl);
|
INC_DBREF_COUNT(cl);
|
||||||
UNLOCK(cl->ClLock);
|
UNLOCK(cl->ClLock);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if (!DynamicFlags(newp) & InUseMask) {
|
if (!DynamicFlags(newp) & InUseMask) {
|
||||||
DynamicFlags(newp) |= InUseMask;
|
DynamicFlags(newp) |= InUseMask;
|
||||||
TRAIL_REF(&DynamicFlags(newp));
|
TRAIL_CLREF(ClauseCodeToClause(newp));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return(newp);
|
return(newp);
|
||||||
@ -3451,6 +3451,24 @@ p_erase(void)
|
|||||||
return (TRUE);
|
return (TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* erase(+Ref) */
|
||||||
|
static Int
|
||||||
|
p_smash(void)
|
||||||
|
{
|
||||||
|
Term t1 = Deref(ARG1);
|
||||||
|
|
||||||
|
if (IsVarTerm(t1)) {
|
||||||
|
Error(INSTANTIATION_ERROR, t1, "erase");
|
||||||
|
return (FALSE);
|
||||||
|
}
|
||||||
|
if (!IsDBRefTerm(t1)) {
|
||||||
|
Error(TYPE_ERROR_DBREF, t1, "erase");
|
||||||
|
return (FALSE);
|
||||||
|
}
|
||||||
|
EraseEntry(DBRefOfTerm(t1));
|
||||||
|
return (TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
/* eraseall(+Key) */
|
/* eraseall(+Key) */
|
||||||
static Int
|
static Int
|
||||||
p_eraseall(void)
|
p_eraseall(void)
|
||||||
@ -3844,7 +3862,7 @@ keepdbrefs(DBRef entryref)
|
|||||||
LOCK(ref->lock);
|
LOCK(ref->lock);
|
||||||
if(!(ref->Flags & InUseMask)) {
|
if(!(ref->Flags & InUseMask)) {
|
||||||
ref->Flags |= InUseMask;
|
ref->Flags |= InUseMask;
|
||||||
TRAIL_REF(&(ref->Flags)); /* So that fail will erase it */
|
TRAIL_REF(ref); /* So that fail will erase it */
|
||||||
}
|
}
|
||||||
UNLOCK(ref->lock);
|
UNLOCK(ref->lock);
|
||||||
}
|
}
|
||||||
@ -3890,7 +3908,6 @@ p_dequeue(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
This is a hack, to steal the first element of a key.
|
This is a hack, to steal the first element of a key.
|
||||||
|
|
||||||
It first fetches the first element in the chain, and then erases it
|
It first fetches the first element in the chain, and then erases it
|
||||||
@ -4028,13 +4045,13 @@ p_db_nb_to_ref(void)
|
|||||||
tref = MkDBRefTerm(myref);
|
tref = MkDBRefTerm(myref);
|
||||||
#if defined(YAPOR) || defined(THREADS)
|
#if defined(YAPOR) || defined(THREADS)
|
||||||
LOCK(myref->lock);
|
LOCK(myref->lock);
|
||||||
TRAIL_REF(&(myref->Flags)); /* So that fail will erase it */
|
TRAIL_REF(myref); /* So that fail will erase it */
|
||||||
INC_DBREF_COUNT(myref);
|
INC_DBREF_COUNT(myref);
|
||||||
UNLOCK(myref->lock);
|
UNLOCK(myref->lock);
|
||||||
#else
|
#else
|
||||||
if (!(myref->Flags & InUseMask)) {
|
if (!(myref->Flags & InUseMask)) {
|
||||||
myref->Flags |= InUseMask;
|
myref->Flags |= InUseMask;
|
||||||
TRAIL_REF(&(myref->Flags)); /* So that fail will erase it */
|
TRAIL_REF(myref); /* So that fail will erase it */
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return(unify(ARG3,tref));
|
return(unify(ARG3,tref));
|
||||||
@ -4103,13 +4120,13 @@ p_hold_index(void)
|
|||||||
/* now, stash the index */
|
/* now, stash the index */
|
||||||
#if defined(YAPOR) || defined(THREADS)
|
#if defined(YAPOR) || defined(THREADS)
|
||||||
LOCK(index->lock);
|
LOCK(index->lock);
|
||||||
TRAIL_REF(&(index->Flags)); /* So that fail will erase it */
|
TRAIL_REF(index); /* So that fail will erase it */
|
||||||
INC_DBREF_COUNT(index);
|
INC_DBREF_COUNT(index);
|
||||||
UNLOCK(index->lock);
|
UNLOCK(index->lock);
|
||||||
#else
|
#else
|
||||||
if (!(index->Flags & InUseMask)) {
|
if (!(index->Flags & InUseMask)) {
|
||||||
index->Flags |= InUseMask;
|
index->Flags |= InUseMask;
|
||||||
TRAIL_REF(&(index->Flags));
|
TRAIL_REF(index);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return(unify(ARG2, MkDBRefTerm(index)) &&
|
return(unify(ARG2, MkDBRefTerm(index)) &&
|
||||||
@ -4133,13 +4150,13 @@ p_fetch_reference_from_index(void)
|
|||||||
el = (DBRef)(table->Contents[pos]);
|
el = (DBRef)(table->Contents[pos]);
|
||||||
#if defined(YAPOR) || defined(THREADS)
|
#if defined(YAPOR) || defined(THREADS)
|
||||||
LOCK(el->lock);
|
LOCK(el->lock);
|
||||||
TRAIL_REF(&(el->Flags)); /* So that fail will erase it */
|
TRAIL_REF(el); /* So that fail will erase it */
|
||||||
INC_DBREF_COUNT(el);
|
INC_DBREF_COUNT(el);
|
||||||
UNLOCK(el->lock);
|
UNLOCK(el->lock);
|
||||||
#else
|
#else
|
||||||
if (!(el->Flags & InUseMask)) {
|
if (!(el->Flags & InUseMask)) {
|
||||||
el->Flags |= InUseMask;
|
el->Flags |= InUseMask;
|
||||||
TRAIL_REF(&(el->Flags));
|
TRAIL_REF(el);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return(unify(ARG3, MkDBRefTerm(el)));
|
return(unify(ARG3, MkDBRefTerm(el)));
|
||||||
@ -4170,6 +4187,7 @@ InitDBPreds(void)
|
|||||||
InitCPred("$recordzp", 4, p_drcdzp, SafePredFlag|SyncPredFlag);
|
InitCPred("$recordzp", 4, p_drcdzp, SafePredFlag|SyncPredFlag);
|
||||||
InitCPred("$recordaifnot", 3, p_rcdaifnot, SafePredFlag|SyncPredFlag);
|
InitCPred("$recordaifnot", 3, p_rcdaifnot, SafePredFlag|SyncPredFlag);
|
||||||
InitCPred("$recordzifnot", 3, p_rcdzifnot, SafePredFlag|SyncPredFlag);
|
InitCPred("$recordzifnot", 3, p_rcdzifnot, SafePredFlag|SyncPredFlag);
|
||||||
|
InitCPred("$db_smash", 1, p_smash, SafePredFlag|SyncPredFlag);
|
||||||
InitCPred("erase", 1, p_erase, SafePredFlag|SyncPredFlag);
|
InitCPred("erase", 1, p_erase, SafePredFlag|SyncPredFlag);
|
||||||
InitCPred("erased", 1, p_erased, TestPredFlag | SafePredFlag|SyncPredFlag);
|
InitCPred("erased", 1, p_erased, TestPredFlag | SafePredFlag|SyncPredFlag);
|
||||||
InitCPred("instance", 2, p_instance, SyncPredFlag);
|
InitCPred("instance", 2, p_instance, SyncPredFlag);
|
||||||
|
4
C/exec.c
4
C/exec.c
@ -113,14 +113,14 @@ CallProlog(PredEntry *pen, unsigned int arity, Int position)
|
|||||||
Clause *cl = ClauseCodeToClause(q);
|
Clause *cl = ClauseCodeToClause(q);
|
||||||
|
|
||||||
LOCK(cl->ClLock);
|
LOCK(cl->ClLock);
|
||||||
TRAIL_REF(&(cl->ClFlags));
|
TRAIL_CLREF(cl);
|
||||||
INC_DBREF_COUNT(cl);
|
INC_DBREF_COUNT(cl);
|
||||||
UNLOCK(cl->ClLock);
|
UNLOCK(cl->ClLock);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if (!(ClauseCodeToClause(q)->ClFlags & InUseMask)) {
|
if (!(ClauseCodeToClause(q)->ClFlags & InUseMask)) {
|
||||||
OPREG *opp = &(ClauseCodeToClause(q)->ClFlags);
|
OPREG *opp = &(ClauseCodeToClause(q)->ClFlags);
|
||||||
TRAIL_REF(opp);
|
TRAIL_CLREF(ClauseCodeToClause(q));
|
||||||
*opp |= InUseMask;
|
*opp |= InUseMask;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -663,7 +663,7 @@ init_dbtable(tr_fr_ptr trail_ptr) {
|
|||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
|
||||||
#define INSTRUMENT_GC 1
|
#define INSTRUMENT_GC 1
|
||||||
#define CHECK_CHOICEPOINTS 1
|
/* #define CHECK_CHOICEPOINTS 1 */
|
||||||
|
|
||||||
#ifdef INSTRUMENT_GC
|
#ifdef INSTRUMENT_GC
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
2
C/save.c
2
C/save.c
@ -1092,7 +1092,7 @@ restore_codes(void)
|
|||||||
#endif
|
#endif
|
||||||
heap_regs->term_refound_var = AtomTermAdjust(heap_regs->term_refound_var);
|
heap_regs->term_refound_var = AtomTermAdjust(heap_regs->term_refound_var);
|
||||||
heap_regs->file_aliases =
|
heap_regs->file_aliases =
|
||||||
(void *)AddrAdjust((ADDR)heap_regs->file_aliases);
|
(struct AliasDescS *)AddrAdjust((ADDR)heap_regs->file_aliases);
|
||||||
heap_regs->yap_lib_dir =
|
heap_regs->yap_lib_dir =
|
||||||
(char *)AddrAdjust((ADDR)heap_regs->yap_lib_dir);
|
(char *)AddrAdjust((ADDR)heap_regs->yap_lib_dir);
|
||||||
heap_regs->pred_goal_expansion =
|
heap_regs->pred_goal_expansion =
|
||||||
|
@ -299,7 +299,12 @@ Binding Macros for Multiple Assignment Variables.
|
|||||||
#endif /* TABLING */
|
#endif /* TABLING */
|
||||||
|
|
||||||
|
|
||||||
#define TRAIL_REF(REF) TrailTerm(TR++) = AbsPair(((CELL *)(REF)))
|
#define REF_TO_TRENTRY(REF) AbsPair(((CELL *)&((REF)->Flags)))
|
||||||
|
#define CLREF_TO_TRENTRY(REF) AbsPair(((CELL *)&((REF)->ClFlags)))
|
||||||
|
|
||||||
|
#define TRAIL_REF(REF) TrailTerm(TR++) = REF_TO_TRENTRY(REF)
|
||||||
|
#define TRAIL_CLREF(REF) TrailTerm(TR++) = CLREF_TO_TRENTRY(REF)
|
||||||
|
#define TRAIL_LINK(REF) TrailTerm(TR++) = AbsPair((CELL *)(REF))
|
||||||
|
|
||||||
#define Bind(A,D) TRAIL(A,D); *(A) = (D)
|
#define Bind(A,D) TRAIL(A,D); *(A) = (D)
|
||||||
|
|
||||||
|
@ -16,6 +16,10 @@
|
|||||||
|
|
||||||
<h2>Yap-4.3.19:</h2>
|
<h2>Yap-4.3.19:</h2>
|
||||||
<ul>
|
<ul>
|
||||||
|
<li>CLEANUP: split TRAIL_REF.</li>
|
||||||
|
<li>FIXED: give correct type to FreeBlocks.</li>
|
||||||
|
<li>FIXED: give correct type to alias list.</li>
|
||||||
|
<li>FIXED: format ~NN wasn't implemented (report from Markus Walther).</li>
|
||||||
<li>DELETED: shell/1 is now available through system library.</li>
|
<li>DELETED: shell/1 is now available through system library.</li>
|
||||||
<li>FIXED: ! in meta-call wasn't cutting.</li>
|
<li>FIXED: ! in meta-call wasn't cutting.</li>
|
||||||
<li>FIXED: MkLongIntTerm (from Stasinos Konstantinos).</li>
|
<li>FIXED: MkLongIntTerm (from Stasinos Konstantinos).</li>
|
||||||
|
30
docs/yap.tex
30
docs/yap.tex
@ -7445,6 +7445,36 @@ for the command is returned in @var{Status}.
|
|||||||
Fetch the current directory at @var{CurDir}. If @var{NextDir} is bound
|
Fetch the current directory at @var{CurDir}. If @var{NextDir} is bound
|
||||||
to an atom, make its value the current working directory.
|
to an atom, make its value the current working directory.
|
||||||
|
|
||||||
|
@item shell
|
||||||
|
@findex shell/0
|
||||||
|
@syindex shell/0
|
||||||
|
@cnindex shell/0
|
||||||
|
Start a new shell and leave Yap in background until the shell
|
||||||
|
completes. Yap uses the shell given by the environment variable
|
||||||
|
@code{SHELL}. In WIN32 environment YAP will use @code{COMSPEC} if
|
||||||
|
@code{SHELL} is undefined.
|
||||||
|
|
||||||
|
@item shell(+@var{Command})
|
||||||
|
@findex shell/1
|
||||||
|
@syindex shell/1
|
||||||
|
@cnindex shell/1
|
||||||
|
Execute command @var{Command} under a new shell. Yap will be in
|
||||||
|
background until the command completes. In Unix environments Yap uses
|
||||||
|
the shell given by the environment variable @code{SHELL} with the option
|
||||||
|
@code{" -c "}. In WIN32 environment YAP will use @code{COMSPEC} if
|
||||||
|
@code{SHELL} is undefined, in this case with the option @code{" /c "}.
|
||||||
|
|
||||||
|
@item shell(+@var{Command},-@var{Status})
|
||||||
|
@findex shell/1
|
||||||
|
@syindex shell/1
|
||||||
|
@cnindex shell/1
|
||||||
|
Execute command @var{Command} under a new shell and unify @var{Status}
|
||||||
|
with the exit for the command. Yap will be in background until the
|
||||||
|
command completes. In Unix environments Yap uses the shell given by the
|
||||||
|
environment variable @code{SHELL} with the option @code{" -c "}. In
|
||||||
|
WIN32 environment YAP will use @code{COMSPEC} if @code{SHELL} is
|
||||||
|
undefined, in this case with the option @code{" /c "}.
|
||||||
|
|
||||||
@item sleep(+@var{Time})
|
@item sleep(+@var{Time})
|
||||||
@findex sleep/1
|
@findex sleep/1
|
||||||
@syindex sleep/1
|
@syindex sleep/1
|
||||||
|
@ -282,8 +282,7 @@ check_mode(Mode, G) :-
|
|||||||
|
|
||||||
shell :-
|
shell :-
|
||||||
G = shell,
|
G = shell,
|
||||||
get_shell(Shell),
|
get_shell0(FullCommand),
|
||||||
atom_codes(FullCommand, Shell),
|
|
||||||
exec_command(FullCommand, '$stream'(0),'$stream'(1), '$stream'(2), PID, Error),
|
exec_command(FullCommand, '$stream'(0),'$stream'(1), '$stream'(2), PID, Error),
|
||||||
handle_system_error(Error, off, G),
|
handle_system_error(Error, off, G),
|
||||||
wait(PID, _Status, Error),
|
wait(PID, _Status, Error),
|
||||||
@ -313,11 +312,18 @@ shell(Command, Status) :-
|
|||||||
wait(PID, Status,Error),
|
wait(PID, Status,Error),
|
||||||
handle_system_error(Error, off, G).
|
handle_system_error(Error, off, G).
|
||||||
|
|
||||||
|
get_shell0(Shell) :-
|
||||||
|
getenv('SHELL', Shell), !.
|
||||||
|
get_shell0(Shell) :-
|
||||||
|
win,
|
||||||
|
getenv('COMSPEC', Shell0).
|
||||||
|
|
||||||
get_shell(Shell) :-
|
get_shell(Shell) :-
|
||||||
getenv('SHELL', Shell0), !,
|
getenv('SHELL', Shell0), !,
|
||||||
atom_codes(Shell0, Codes),
|
atom_codes(Shell0, Codes),
|
||||||
append(Codes," -c ", Shell).
|
append(Codes," -c ", Shell).
|
||||||
get_shell(Shell) :-
|
get_shell(Shell) :-
|
||||||
|
win,
|
||||||
getenv('COMPSEC', Shell0),
|
getenv('COMPSEC', Shell0),
|
||||||
atom_codes(Shell0, Codes),
|
atom_codes(Shell0, Codes),
|
||||||
append(Codes," /c ", Shell).
|
append(Codes," /c ", Shell).
|
||||||
|
@ -672,6 +672,16 @@ pid(void)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
win(void)
|
||||||
|
{
|
||||||
|
#if defined(__MINGW32__) || _MSC_VER
|
||||||
|
return(TRUE);
|
||||||
|
#else
|
||||||
|
return(FALSE);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
p_kill(void)
|
p_kill(void)
|
||||||
{
|
{
|
||||||
@ -732,6 +742,7 @@ init_sys(void)
|
|||||||
UserCPredicate("rename_file", rename_file, 3);
|
UserCPredicate("rename_file", rename_file, 3);
|
||||||
UserCPredicate("sleep", p_sleep, 2);
|
UserCPredicate("sleep", p_sleep, 2);
|
||||||
UserCPredicate("error_message", error_message, 2);
|
UserCPredicate("error_message", error_message, 2);
|
||||||
|
UserCPredicate("win", win, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
Reference in New Issue
Block a user