improve functor locking.
This commit is contained in:
91
C/adtdefs.c
91
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);
|
||||
|
Reference in New Issue
Block a user