improve functor locking.
This commit is contained in:
parent
2400911db9
commit
ec881b8e13
91
C/adtdefs.c
91
C/adtdefs.c
@ -699,10 +699,10 @@ Yap_GetPredPropByFunc(Functor f, Term cur_mod)
|
|||||||
{
|
{
|
||||||
Prop p0;
|
Prop p0;
|
||||||
|
|
||||||
READ_LOCK(f->FRWLock);
|
FUNC_READ_LOCK(f);
|
||||||
|
|
||||||
p0 = GetPredPropByFuncHavingLock(f, cur_mod);
|
p0 = GetPredPropByFuncHavingLock(f, cur_mod);
|
||||||
READ_UNLOCK(f->FRWLock);
|
FUNC_READ_UNLOCK(f);
|
||||||
return (p0);
|
return (p0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -712,9 +712,9 @@ Yap_GetPredPropByFuncInThisModule(Functor f, Term cur_mod)
|
|||||||
{
|
{
|
||||||
Prop p0;
|
Prop p0;
|
||||||
|
|
||||||
READ_LOCK(f->FRWLock);
|
FUNC_READ_LOCK(f);
|
||||||
p0 = GetPredPropByFuncHavingLock(f, cur_mod);
|
p0 = GetPredPropByFuncHavingLock(f, cur_mod);
|
||||||
READ_UNLOCK(f->FRWLock);
|
FUNC_READ_UNLOCK(f);
|
||||||
return (p0);
|
return (p0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -730,9 +730,9 @@ Yap_GetPredPropHavingLock(Atom ap, unsigned int arity, Term mod)
|
|||||||
GetPredPropByAtomHavingLock(ae, mod);
|
GetPredPropByAtomHavingLock(ae, mod);
|
||||||
}
|
}
|
||||||
f = InlinedUnlockedMkFunctor(ae, arity);
|
f = InlinedUnlockedMkFunctor(ae, arity);
|
||||||
READ_LOCK(f->FRWLock);
|
FUNC_READ_LOCK(f);
|
||||||
p0 = GetPredPropByFuncHavingLock(f, mod);
|
p0 = GetPredPropByFuncHavingLock(f, mod);
|
||||||
READ_UNLOCK(f->FRWLock);
|
FUNC_READ_UNLOCK(f);
|
||||||
return (p0);
|
return (p0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -804,47 +804,14 @@ Yap_NewPredPropByFunctor(FunctorEntry *fe, Term cur_mod)
|
|||||||
PredEntry *p = (PredEntry *) Yap_AllocAtomSpace(sizeof(*p));
|
PredEntry *p = (PredEntry *) Yap_AllocAtomSpace(sizeof(*p));
|
||||||
|
|
||||||
if (p == NULL) {
|
if (p == NULL) {
|
||||||
WRITE_UNLOCK(fe->FRWLock);
|
FUNC_WRITE_UNLOCK(fe);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (cur_mod == TermProlog)
|
if (cur_mod == TermProlog)
|
||||||
p->ModuleOfPred = 0L;
|
p->ModuleOfPred = 0L;
|
||||||
else
|
else
|
||||||
p->ModuleOfPred = cur_mod;
|
p->ModuleOfPred = cur_mod;
|
||||||
if (fe->PropsOfFE) {
|
TRUE_FUNC_WRITE_LOCK(fe);
|
||||||
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;
|
|
||||||
}
|
|
||||||
INIT_LOCK(p->PELock);
|
INIT_LOCK(p->PELock);
|
||||||
p->KindOfPE = PEProp;
|
p->KindOfPE = PEProp;
|
||||||
p->ArityOfPE = fe->ArityOfFE;
|
p->ArityOfPE = fe->ArityOfFE;
|
||||||
@ -886,7 +853,41 @@ Yap_NewPredPropByFunctor(FunctorEntry *fe, Term cur_mod)
|
|||||||
p->ExtraPredFlags |= NoDebugPredFlag;
|
p->ExtraPredFlags |= NoDebugPredFlag;
|
||||||
}
|
}
|
||||||
p->FunctorOfPred = fe;
|
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);
|
Yap_inform_profiler_of_clause(&(p->OpcodeOfPred), &(p->OpcodeOfPred)+1, p, GPROF_NEW_PRED_FUNC);
|
||||||
if (!(p->PredFlags & (CPredFlag|AsmPredFlag))) {
|
if (!(p->PredFlags & (CPredFlag|AsmPredFlag))) {
|
||||||
@ -1027,7 +1028,7 @@ Yap_PredPropByFunctorNonThreadLocal(Functor f, Term cur_mod)
|
|||||||
{
|
{
|
||||||
PredEntry *p;
|
PredEntry *p;
|
||||||
|
|
||||||
WRITE_LOCK(f->FRWLock);
|
FUNC_WRITE_LOCK(f);
|
||||||
if (!(p = RepPredProp(f->PropsOfFE)))
|
if (!(p = RepPredProp(f->PropsOfFE)))
|
||||||
return Yap_NewPredPropByFunctor(f,cur_mod);
|
return Yap_NewPredPropByFunctor(f,cur_mod);
|
||||||
|
|
||||||
@ -1037,7 +1038,7 @@ Yap_PredPropByFunctorNonThreadLocal(Functor f, Term cur_mod)
|
|||||||
p->ModuleOfPred ||
|
p->ModuleOfPred ||
|
||||||
!cur_mod ||
|
!cur_mod ||
|
||||||
cur_mod == TermProlog) {
|
cur_mod == TermProlog) {
|
||||||
WRITE_UNLOCK(f->FRWLock);
|
FUNC_WRITE_UNLOCK(f);
|
||||||
return AbsPredProp(p);
|
return AbsPredProp(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1051,7 +1052,7 @@ Yap_PredPropByFunctorNonThreadLocal(Functor f, Term cur_mod)
|
|||||||
p->ModuleOfPred == cur_mod)
|
p->ModuleOfPred == cur_mod)
|
||||||
{
|
{
|
||||||
READ_UNLOCK(PredHashRWLock);
|
READ_UNLOCK(PredHashRWLock);
|
||||||
WRITE_UNLOCK(f->FRWLock);
|
FUNC_WRITE_UNLOCK(f);
|
||||||
return AbsPredProp(p);
|
return AbsPredProp(p);
|
||||||
}
|
}
|
||||||
p = RepPredProp(p->NextOfPE);
|
p = RepPredProp(p->NextOfPE);
|
||||||
|
@ -2718,7 +2718,7 @@ new_lu_entry(Term t)
|
|||||||
if (IsApplTerm(t)) {
|
if (IsApplTerm(t)) {
|
||||||
Functor f = FunctorOfTerm(t);
|
Functor f = FunctorOfTerm(t);
|
||||||
|
|
||||||
WRITE_LOCK(f->FRWLock);
|
FUNC_WRITE_LOCK(f);
|
||||||
p0 = Yap_NewPredPropByFunctor(f,IDB_MODULE);
|
p0 = Yap_NewPredPropByFunctor(f,IDB_MODULE);
|
||||||
} else if (IsAtomTerm(t)) {
|
} else if (IsAtomTerm(t)) {
|
||||||
Atom at = AtomOfTerm(t);
|
Atom at = AtomOfTerm(t);
|
||||||
@ -2726,7 +2726,7 @@ new_lu_entry(Term t)
|
|||||||
WRITE_LOCK(RepAtom(at)->ARWLock);
|
WRITE_LOCK(RepAtom(at)->ARWLock);
|
||||||
p0 = Yap_NewPredPropByAtom(at,IDB_MODULE);
|
p0 = Yap_NewPredPropByAtom(at,IDB_MODULE);
|
||||||
} else {
|
} else {
|
||||||
WRITE_LOCK(FunctorList->FRWLock);
|
FUNC_WRITE_LOCK(FunctorList);
|
||||||
p0 = Yap_NewPredPropByFunctor(FunctorList,IDB_MODULE);
|
p0 = Yap_NewPredPropByFunctor(FunctorList,IDB_MODULE);
|
||||||
}
|
}
|
||||||
pe = RepPredProp(p0);
|
pe = RepPredProp(p0);
|
||||||
|
@ -840,7 +840,7 @@ cont_current_predicate_for_atom( USES_REGS1 )
|
|||||||
FunctorEntry *pp = RepFunctorProp(pf);
|
FunctorEntry *pp = RepFunctorProp(pf);
|
||||||
if (IsFunctorProperty(pp->KindOfPE)) {
|
if (IsFunctorProperty(pp->KindOfPE)) {
|
||||||
Prop p0;
|
Prop p0;
|
||||||
READ_LOCK(pp->FRWLock);
|
FUNC_READ_LOCK(pp);
|
||||||
p0 = pp->PropsOfFE;
|
p0 = pp->PropsOfFE;
|
||||||
if (p0) {
|
if (p0) {
|
||||||
PredEntry *p = RepPredProp(p0);
|
PredEntry *p = RepPredProp(p0);
|
||||||
@ -849,7 +849,7 @@ cont_current_predicate_for_atom( USES_REGS1 )
|
|||||||
UInt ar = p->ArityOfPE;
|
UInt ar = p->ArityOfPE;
|
||||||
/* we found the predicate */
|
/* we found the predicate */
|
||||||
EXTRA_CBACK_ARG(3,1) = MkIntegerTerm((Int)(pp->NextOfPE));
|
EXTRA_CBACK_ARG(3,1) = MkIntegerTerm((Int)(pp->NextOfPE));
|
||||||
READ_UNLOCK(pp->FRWLock);
|
FUNC_READ_UNLOCK(pp);
|
||||||
return
|
return
|
||||||
Yap_unify(ARG3,MkIntegerTerm(ar));
|
Yap_unify(ARG3,MkIntegerTerm(ar));
|
||||||
} else if (p->NextOfPE) {
|
} else if (p->NextOfPE) {
|
||||||
@ -862,7 +862,7 @@ cont_current_predicate_for_atom( USES_REGS1 )
|
|||||||
p->ModuleOfPred == mod)
|
p->ModuleOfPred == mod)
|
||||||
{
|
{
|
||||||
READ_UNLOCK(PredHashRWLock);
|
READ_UNLOCK(PredHashRWLock);
|
||||||
READ_UNLOCK(pp->FRWLock);
|
FUNC_READ_UNLOCK(pp);
|
||||||
/* we found the predicate */
|
/* we found the predicate */
|
||||||
EXTRA_CBACK_ARG(3,1) = MkIntegerTerm((Int)(p->NextOfPE));
|
EXTRA_CBACK_ARG(3,1) = MkIntegerTerm((Int)(p->NextOfPE));
|
||||||
return Yap_unify(ARG3,MkIntegerTerm(p->ArityOfPE));
|
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) {
|
} else if (pp->KindOfPE == PEProp) {
|
||||||
PredEntry *pe = RepPredProp(pf);
|
PredEntry *pe = RepPredProp(pf);
|
||||||
PELOCK(31,pe);
|
PELOCK(31,pe);
|
||||||
|
@ -1655,10 +1655,10 @@ PredPropByFunc (Functor fe, Term cur_mod)
|
|||||||
{
|
{
|
||||||
Prop p0;
|
Prop p0;
|
||||||
|
|
||||||
WRITE_LOCK (fe->FRWLock);
|
FUNC_WRITE_LOCK (fe);
|
||||||
p0 = GetPredPropByFuncHavingLock(fe, cur_mod);
|
p0 = GetPredPropByFuncHavingLock(fe, cur_mod);
|
||||||
if (p0) {
|
if (p0) {
|
||||||
WRITE_UNLOCK (fe->FRWLock);
|
FUNC_WRITE_UNLOCK (fe);
|
||||||
return p0;
|
return p0;
|
||||||
}
|
}
|
||||||
return Yap_NewPredPropByFunctor (fe, cur_mod);
|
return Yap_NewPredPropByFunctor (fe, cur_mod);
|
||||||
@ -1713,10 +1713,10 @@ PredPropByFuncAndMod (Functor fe, Term cur_mod)
|
|||||||
{
|
{
|
||||||
Prop p0;
|
Prop p0;
|
||||||
|
|
||||||
WRITE_LOCK (fe->FRWLock);
|
FUNC_WRITE_LOCK (fe);
|
||||||
p0 = GetPredPropByFuncAndModHavingLock(fe, cur_mod);
|
p0 = GetPredPropByFuncAndModHavingLock(fe, cur_mod);
|
||||||
if (p0) {
|
if (p0) {
|
||||||
WRITE_UNLOCK (fe->FRWLock);
|
FUNC_WRITE_UNLOCK (fe);
|
||||||
return p0;
|
return p0;
|
||||||
}
|
}
|
||||||
return Yap_NewPredPropByFunctor (fe, cur_mod);
|
return Yap_NewPredPropByFunctor (fe, cur_mod);
|
||||||
|
@ -64,6 +64,15 @@ xIS_UNLOCKED(pthread_mutex_t *LOCK_VAR) {
|
|||||||
#define WRITE_LOCK(X) pthread_rwlock_wrlock(&(X))
|
#define WRITE_LOCK(X) pthread_rwlock_wrlock(&(X))
|
||||||
#define WRITE_UNLOCK(X) pthread_rwlock_unlock(&(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
|
#if THREADS
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user