make thread_local compatible with dynamic
git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@977 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
26
C/cdmgr.c
26
C/cdmgr.c
@@ -1053,6 +1053,7 @@ addclause(Term t, yamop *cp, int mode, int mod)
|
||||
}
|
||||
Yap_PutValue(AtomAbol, TermNil);
|
||||
WRITE_LOCK(p->PRWLock);
|
||||
WPP = p;
|
||||
pflags = p->PredFlags;
|
||||
/* we are redefining a prolog module predicate */
|
||||
if (p->ModuleOfPred == 0 && mod != 0) {
|
||||
@@ -1072,6 +1073,7 @@ addclause(Term t, yamop *cp, int mode, int mod)
|
||||
not_was_reconsulted(p, t, TRUE);
|
||||
/* always check if we have a valid error first */
|
||||
if (Yap_ErrorMessage && Yap_Error_TYPE == PERMISSION_ERROR_MODIFY_STATIC_PROCEDURE) {
|
||||
WPP = NULL;
|
||||
WRITE_UNLOCK(p->PRWLock);
|
||||
return TermNil;
|
||||
}
|
||||
@@ -1125,6 +1127,7 @@ addclause(Term t, yamop *cp, int mode, int mod)
|
||||
p->OpcodeOfPred = ((yamop *)(p->CodeOfPred))->opc;
|
||||
}
|
||||
}
|
||||
WPP = NULL;
|
||||
WRITE_UNLOCK(p->PRWLock);
|
||||
if (pflags & LogUpdatePredFlag) {
|
||||
return MkDBRefTerm((DBRef)ClauseCodeToLogUpdClause(cp));
|
||||
@@ -1605,12 +1608,15 @@ p_purge_clauses(void)
|
||||
} else
|
||||
return (FALSE);
|
||||
WRITE_LOCK(pred->PRWLock);
|
||||
WPP = pred;
|
||||
if (pred->PredFlags & StandardPredFlag) {
|
||||
WPP = NULL;
|
||||
WRITE_UNLOCK(pred->PRWLock);
|
||||
Yap_Error(PERMISSION_ERROR_MODIFY_STATIC_PROCEDURE, t, "assert/1");
|
||||
return (FALSE);
|
||||
}
|
||||
purge_clauses(pred);
|
||||
WPP = NULL;
|
||||
WRITE_UNLOCK(pred->PRWLock);
|
||||
return (TRUE);
|
||||
}
|
||||
@@ -1643,10 +1649,10 @@ p_setspy(void)
|
||||
mod = Yap_LookupModule(t2);
|
||||
if (IsAtomTerm(t)) {
|
||||
Atom at = AtomOfTerm(t);
|
||||
pred = RepPredProp(PredPropByAtom(at, mod));
|
||||
pred = RepPredProp(Yap_PredPropByAtomNonThreadLocal(at, mod));
|
||||
} else if (IsApplTerm(t)) {
|
||||
Functor fun = FunctorOfTerm(t);
|
||||
pred = RepPredProp(PredPropByFunc(fun, mod));
|
||||
pred = RepPredProp(Yap_PredPropByFunctorNonThreadLocal(fun, mod));
|
||||
} else {
|
||||
return (FALSE);
|
||||
}
|
||||
@@ -1697,10 +1703,10 @@ p_rmspy(void)
|
||||
return (FALSE);
|
||||
if (IsAtomTerm(t)) {
|
||||
at = AtomOfTerm(t);
|
||||
pred = RepPredProp(PredPropByAtom(at, mod));
|
||||
pred = RepPredProp(Yap_PredPropByAtomNonThreadLocal(at, mod));
|
||||
} else if (IsApplTerm(t)) {
|
||||
Functor fun = FunctorOfTerm(t);
|
||||
pred = RepPredProp(PredPropByFunc(fun, mod));
|
||||
pred = RepPredProp(Yap_PredPropByFunctorNonThreadLocal(fun, mod));
|
||||
} else
|
||||
return (FALSE);
|
||||
WRITE_LOCK(pred->PRWLock);
|
||||
@@ -1708,7 +1714,9 @@ p_rmspy(void)
|
||||
WRITE_UNLOCK(pred->PRWLock);
|
||||
return (FALSE);
|
||||
}
|
||||
if (!(pred->PredFlags & DynamicPredFlag)) {
|
||||
if (!(pred->PredFlags & ThreadLocalPredFlag)) {
|
||||
pred->OpcodeOfPred = Yap_opcode(_thread_local);
|
||||
} else if (!(pred->PredFlags & DynamicPredFlag)) {
|
||||
pred->CodeOfPred = pred->cs.p_code.TrueCodeOfPred;
|
||||
pred->OpcodeOfPred = ((yamop *)(pred->CodeOfPred))->opc;
|
||||
} else if (pred->OpcodeOfPred == Yap_opcode(_spy_or_trymark)) {
|
||||
@@ -3058,6 +3066,7 @@ fetch_next_lu_clause(PredEntry *pe, yamop *i_code, Term th, Term tb, Term tr, ya
|
||||
|
||||
cl = Yap_FollowIndexingCode(pe, i_code, th, tb, tr, NEXTOP(PredLogUpdClause->CodeOfPred,ld), cp_ptr);
|
||||
if (cl == NULL) {
|
||||
WPP = NULL;
|
||||
WRITE_UNLOCK(pe->PRWLock);
|
||||
return FALSE;
|
||||
}
|
||||
@@ -3073,6 +3082,7 @@ fetch_next_lu_clause(PredEntry *pe, yamop *i_code, Term th, Term tb, Term tr, ya
|
||||
TRAIL_CLREF(cl); /* So that fail will erase it */
|
||||
}
|
||||
#endif
|
||||
WPP = NULL;
|
||||
WRITE_UNLOCK(pe->PRWLock);
|
||||
if (cl->ClFlags & FactMask) {
|
||||
if (!Yap_unify(tb, MkAtomTerm(AtomTrue)) ||
|
||||
@@ -3130,6 +3140,7 @@ p_log_update_clause(void)
|
||||
if (pe == NULL || EndOfPAEntr(pe))
|
||||
return FALSE;
|
||||
WRITE_LOCK(pe->PRWLock);
|
||||
WPP = pe;
|
||||
if(pe->OpcodeOfPred == INDEX_OPCODE) {
|
||||
IPred(pe);
|
||||
}
|
||||
@@ -3143,6 +3154,7 @@ p_continue_log_update_clause(void)
|
||||
yamop *ipc = (yamop *)IntegerOfTerm(ARG2);
|
||||
|
||||
WRITE_LOCK(pe->PRWLock);
|
||||
WPP = pe;
|
||||
return fetch_next_lu_clause(pe, ipc, Deref(ARG3), ARG4, ARG5, B->cp_ap, FALSE);
|
||||
}
|
||||
|
||||
@@ -3152,6 +3164,7 @@ fetch_next_lu_clause0(PredEntry *pe, yamop *i_code, Term th, Term tb, yamop *cp_
|
||||
LogUpdClause *cl;
|
||||
|
||||
cl = Yap_FollowIndexingCode(pe, i_code, th, tb, TermNil, NEXTOP(PredLogUpdClause0->CodeOfPred,ld), cp_ptr);
|
||||
WPP = NULL;
|
||||
WRITE_UNLOCK(pe->PRWLock);
|
||||
if (cl == NULL) {
|
||||
return FALSE;
|
||||
@@ -3210,6 +3223,7 @@ p_log_update_clause0(void)
|
||||
if (pe == NULL || EndOfPAEntr(pe))
|
||||
return FALSE;
|
||||
WRITE_LOCK(pe->PRWLock);
|
||||
WPP = pe;
|
||||
if(pe->OpcodeOfPred == INDEX_OPCODE) {
|
||||
IPred(pe);
|
||||
}
|
||||
@@ -3223,6 +3237,7 @@ p_continue_log_update_clause0(void)
|
||||
yamop *ipc = (yamop *)IntegerOfTerm(ARG2);
|
||||
|
||||
WRITE_LOCK(pe->PRWLock);
|
||||
WPP = pe;
|
||||
return fetch_next_lu_clause0(pe, ipc, Deref(ARG3), ARG4, B->cp_ap, FALSE);
|
||||
}
|
||||
|
||||
@@ -3314,6 +3329,7 @@ p_nth_clause(void)
|
||||
if (pe == NULL || EndOfPAEntr(pe))
|
||||
return FALSE;
|
||||
WRITE_LOCK(pe->PRWLock);
|
||||
WPP = pe;
|
||||
if (!(pe->PredFlags & (SourcePredFlag|LogUpdatePredFlag))) {
|
||||
WRITE_UNLOCK(pe->PRWLock);
|
||||
return FALSE;
|
||||
|
Reference in New Issue
Block a user