diff --git a/C/adtdefs.c b/C/adtdefs.c index 3206870ba..ad2019bec 100755 --- a/C/adtdefs.c +++ b/C/adtdefs.c @@ -699,10 +699,10 @@ Yap_GetPredPropByFunc(Functor f, Term cur_mod) { Prop p0; - READ_LOCK(f->FRWLock); + FUNC_READ_LOCK(f); p0 = GetPredPropByFuncHavingLock(f, cur_mod); - READ_UNLOCK(f->FRWLock); + FUNC_READ_UNLOCK(f); return (p0); } @@ -712,9 +712,9 @@ Yap_GetPredPropByFuncInThisModule(Functor f, Term cur_mod) { Prop p0; - READ_LOCK(f->FRWLock); + FUNC_READ_LOCK(f); p0 = GetPredPropByFuncHavingLock(f, cur_mod); - READ_UNLOCK(f->FRWLock); + FUNC_READ_UNLOCK(f); return (p0); } @@ -730,9 +730,9 @@ Yap_GetPredPropHavingLock(Atom ap, unsigned int arity, Term mod) GetPredPropByAtomHavingLock(ae, mod); } f = InlinedUnlockedMkFunctor(ae, arity); - READ_LOCK(f->FRWLock); + FUNC_READ_LOCK(f); p0 = GetPredPropByFuncHavingLock(f, mod); - READ_UNLOCK(f->FRWLock); + FUNC_READ_UNLOCK(f); return (p0); } @@ -804,47 +804,14 @@ Yap_NewPredPropByFunctor(FunctorEntry *fe, Term cur_mod) PredEntry *p = (PredEntry *) Yap_AllocAtomSpace(sizeof(*p)); if (p == NULL) { - WRITE_UNLOCK(fe->FRWLock); + FUNC_WRITE_UNLOCK(fe); return NULL; } if (cur_mod == TermProlog) p->ModuleOfPred = 0L; else p->ModuleOfPred = cur_mod; - if (fe->PropsOfFE) { - UInt hsh = PRED_HASH(fe, cur_mod, PredHashTableSize); - - WRITE_LOCK(PredHashRWLock); - if (10*(PredsInHashTable+1) > 6*PredHashTableSize) { - if (!ExpandPredHash()) { - Yap_FreeCodeSpace((ADDR)p); - WRITE_UNLOCK(PredHashRWLock); - WRITE_UNLOCK(fe->FRWLock); - return NULL; - } - /* retry hashing */ - hsh = PRED_HASH(fe, cur_mod, PredHashTableSize); - } - PredsInHashTable++; - if (p->ModuleOfPred == 0L) { - PredEntry *pe = RepPredProp(fe->PropsOfFE); - - hsh = PRED_HASH(fe, pe->ModuleOfPred, PredHashTableSize); - /* should be the first one */ - pe->NextOfPE = AbsPredProp(PredHash[hsh]); - PredHash[hsh] = pe; - fe->PropsOfFE = AbsPredProp(p); - } else { - p->NextOfPE = AbsPredProp(PredHash[hsh]); - PredHash[hsh] = p; - } - WRITE_UNLOCK(PredHashRWLock); - /* make sure that we have something here: note that this is not a valid pointer!! */ - RepPredProp(fe->PropsOfFE)->NextOfPE = fe->PropsOfFE; - } else { - fe->PropsOfFE = AbsPredProp(p); - p->NextOfPE = NIL; - } + TRUE_FUNC_WRITE_LOCK(fe); INIT_LOCK(p->PELock); p->KindOfPE = PEProp; p->ArityOfPE = fe->ArityOfFE; @@ -886,7 +853,41 @@ Yap_NewPredPropByFunctor(FunctorEntry *fe, Term cur_mod) p->ExtraPredFlags |= NoDebugPredFlag; } p->FunctorOfPred = fe; - WRITE_UNLOCK(fe->FRWLock); + if (fe->PropsOfFE) { + UInt hsh = PRED_HASH(fe, cur_mod, PredHashTableSize); + + WRITE_LOCK(PredHashRWLock); + if (10*(PredsInHashTable+1) > 6*PredHashTableSize) { + if (!ExpandPredHash()) { + Yap_FreeCodeSpace((ADDR)p); + WRITE_UNLOCK(PredHashRWLock); + TRUE_FUNC_WRITE_UNLOCK(fe); + return NULL; + } + /* retry hashing */ + hsh = PRED_HASH(fe, cur_mod, PredHashTableSize); + } + PredsInHashTable++; + if (p->ModuleOfPred == 0L) { + PredEntry *pe = RepPredProp(fe->PropsOfFE); + + hsh = PRED_HASH(fe, pe->ModuleOfPred, PredHashTableSize); + /* should be the first one */ + pe->NextOfPE = AbsPredProp(PredHash[hsh]); + PredHash[hsh] = pe; + fe->PropsOfFE = AbsPredProp(p); + } else { + p->NextOfPE = AbsPredProp(PredHash[hsh]); + PredHash[hsh] = p; + } + WRITE_UNLOCK(PredHashRWLock); + /* make sure that we have something here: note that this is not a valid pointer!! */ + RepPredProp(fe->PropsOfFE)->NextOfPE = fe->PropsOfFE; + } else { + fe->PropsOfFE = AbsPredProp(p); + p->NextOfPE = NIL; + } + TRUE_FUNC_WRITE_UNLOCK(fe); { Yap_inform_profiler_of_clause(&(p->OpcodeOfPred), &(p->OpcodeOfPred)+1, p, GPROF_NEW_PRED_FUNC); if (!(p->PredFlags & (CPredFlag|AsmPredFlag))) { @@ -1027,7 +1028,7 @@ Yap_PredPropByFunctorNonThreadLocal(Functor f, Term cur_mod) { PredEntry *p; - WRITE_LOCK(f->FRWLock); + FUNC_WRITE_LOCK(f); if (!(p = RepPredProp(f->PropsOfFE))) return Yap_NewPredPropByFunctor(f,cur_mod); @@ -1037,7 +1038,7 @@ Yap_PredPropByFunctorNonThreadLocal(Functor f, Term cur_mod) p->ModuleOfPred || !cur_mod || cur_mod == TermProlog) { - WRITE_UNLOCK(f->FRWLock); + FUNC_WRITE_UNLOCK(f); return AbsPredProp(p); } } @@ -1051,7 +1052,7 @@ Yap_PredPropByFunctorNonThreadLocal(Functor f, Term cur_mod) p->ModuleOfPred == cur_mod) { READ_UNLOCK(PredHashRWLock); - WRITE_UNLOCK(f->FRWLock); + FUNC_WRITE_UNLOCK(f); return AbsPredProp(p); } p = RepPredProp(p->NextOfPE); diff --git a/C/dbase.c b/C/dbase.c index 70eb25e98..9fd7836cc 100755 --- a/C/dbase.c +++ b/C/dbase.c @@ -2718,7 +2718,7 @@ new_lu_entry(Term t) if (IsApplTerm(t)) { Functor f = FunctorOfTerm(t); - WRITE_LOCK(f->FRWLock); + FUNC_WRITE_LOCK(f); p0 = Yap_NewPredPropByFunctor(f,IDB_MODULE); } else if (IsAtomTerm(t)) { Atom at = AtomOfTerm(t); @@ -2726,7 +2726,7 @@ new_lu_entry(Term t) WRITE_LOCK(RepAtom(at)->ARWLock); p0 = Yap_NewPredPropByAtom(at,IDB_MODULE); } else { - WRITE_LOCK(FunctorList->FRWLock); + FUNC_WRITE_LOCK(FunctorList); p0 = Yap_NewPredPropByFunctor(FunctorList,IDB_MODULE); } pe = RepPredProp(p0); diff --git a/C/stdpreds.c b/C/stdpreds.c index b55e06595..a6503e470 100755 --- a/C/stdpreds.c +++ b/C/stdpreds.c @@ -840,7 +840,7 @@ cont_current_predicate_for_atom( USES_REGS1 ) FunctorEntry *pp = RepFunctorProp(pf); if (IsFunctorProperty(pp->KindOfPE)) { Prop p0; - READ_LOCK(pp->FRWLock); + FUNC_READ_LOCK(pp); p0 = pp->PropsOfFE; if (p0) { PredEntry *p = RepPredProp(p0); @@ -849,7 +849,7 @@ cont_current_predicate_for_atom( USES_REGS1 ) UInt ar = p->ArityOfPE; /* we found the predicate */ EXTRA_CBACK_ARG(3,1) = MkIntegerTerm((Int)(pp->NextOfPE)); - READ_UNLOCK(pp->FRWLock); + FUNC_READ_UNLOCK(pp); return Yap_unify(ARG3,MkIntegerTerm(ar)); } else if (p->NextOfPE) { @@ -862,7 +862,7 @@ cont_current_predicate_for_atom( USES_REGS1 ) p->ModuleOfPred == mod) { READ_UNLOCK(PredHashRWLock); - READ_UNLOCK(pp->FRWLock); + FUNC_READ_UNLOCK(pp); /* we found the predicate */ EXTRA_CBACK_ARG(3,1) = MkIntegerTerm((Int)(p->NextOfPE)); return Yap_unify(ARG3,MkIntegerTerm(p->ArityOfPE)); @@ -871,7 +871,7 @@ cont_current_predicate_for_atom( USES_REGS1 ) } } } - READ_UNLOCK(pp->FRWLock); + FUNC_READ_UNLOCK(pp); } else if (pp->KindOfPE == PEProp) { PredEntry *pe = RepPredProp(pf); PELOCK(31,pe); diff --git a/H/Yatom.h b/H/Yatom.h index f9ebac1ca..58bbd881d 100755 --- a/H/Yatom.h +++ b/H/Yatom.h @@ -1655,10 +1655,10 @@ PredPropByFunc (Functor fe, Term cur_mod) { Prop p0; - WRITE_LOCK (fe->FRWLock); + FUNC_WRITE_LOCK (fe); p0 = GetPredPropByFuncHavingLock(fe, cur_mod); if (p0) { - WRITE_UNLOCK (fe->FRWLock); + FUNC_WRITE_UNLOCK (fe); return p0; } return Yap_NewPredPropByFunctor (fe, cur_mod); @@ -1713,10 +1713,10 @@ PredPropByFuncAndMod (Functor fe, Term cur_mod) { Prop p0; - WRITE_LOCK (fe->FRWLock); + FUNC_WRITE_LOCK (fe); p0 = GetPredPropByFuncAndModHavingLock(fe, cur_mod); if (p0) { - WRITE_UNLOCK (fe->FRWLock); + FUNC_WRITE_UNLOCK (fe); return p0; } return Yap_NewPredPropByFunctor (fe, cur_mod); diff --git a/OPTYap/locks_pthread.h b/OPTYap/locks_pthread.h index dbec9676d..fff2821d6 100755 --- a/OPTYap/locks_pthread.h +++ b/OPTYap/locks_pthread.h @@ -64,6 +64,15 @@ xIS_UNLOCKED(pthread_mutex_t *LOCK_VAR) { #define WRITE_LOCK(X) pthread_rwlock_wrlock(&(X)) #define WRITE_UNLOCK(X) pthread_rwlock_unlock(&(X)) +#define FUNC_READ_LOCK(F) +#define FUNC_READ_UNLOCK(F) + +#define FUNC_WRITE_LOCK(F) +#define FUNC_WRITE_UNLOCK(F) + +#define TRUE_FUNC_WRITE_LOCK(F) WRITE_LOCK((F)->FRWLock) +#define TRUE_FUNC_WRITE_UNLOCK(F) WRITE_UNLOCK((F)->FRWLock) + #if THREADS