make atom locking compatible with SWI-Prolog.

This commit is contained in:
Vitor Santos Costa
2009-12-21 10:12:47 -02:00
parent 6ec92ac5c0
commit 6d1eec34db
10 changed files with 48 additions and 45 deletions

View File

@@ -1391,8 +1391,8 @@ Yap_PutInSlot(long slot, Term t)
LCL0[slot] = t;
}
HoldEntry *
Yap_InitAtomHold(void)
static HoldEntry *
InitAtomHold(void)
{
HoldEntry *x = (HoldEntry *)Yap_AllocAtomSpace(sizeof(struct hold_entry));
if (x == NULL) {
@@ -1400,54 +1400,62 @@ Yap_InitAtomHold(void)
}
x->KindOfPE = HoldProperty;
x->NextOfPE = NIL;
x->RefsOfPE = 1;
return x;
}
int
Yap_AtomGetHold(Atom at)
Yap_AtomIncreaseHold(Atom at)
{
AtomEntry *ae = RepAtom(at);
PropEntry *pp, *opp = NULL;
HoldEntry *pp;
Prop *opp = &(ae->PropsOfAE);
WRITE_LOCK(ae->ARWLock);
pp = RepProp(ae->PropsOfAE);
while (!EndOfPAEntr(pp)) {
pp = RepProp(pp->NextOfPE);
opp = pp;
pp = RepHoldProp(ae->PropsOfAE);
while (!EndOfPAEntr(pp)
&& pp->KindOfPE != HoldProperty) {
opp = &(pp->NextOfPE);
pp = RepHoldProp(pp->NextOfPE);
}
if (!pp) {
ae->PropsOfAE = AbsHoldProp(GlobalHoldEntry);
} else if (opp->KindOfPE != HoldProperty) {
opp->NextOfPE = AbsHoldProp(GlobalHoldEntry);
HoldEntry *new = InitAtomHold();
if (!new) {
WRITE_UNLOCK(ae->ARWLock);
return FALSE;
}
*opp = AbsHoldProp(new);
} else {
WRITE_UNLOCK(ae->ARWLock);
return FALSE;
pp->RefsOfPE++;
}
WRITE_UNLOCK(ae->ARWLock);
return TRUE;
}
int
Yap_AtomReleaseHold(Atom at)
Yap_AtomDecreaseHold(Atom at)
{
AtomEntry *ae = RepAtom(at);
PropEntry *pp, *opp = NULL;
HoldEntry *pp;
Prop *opp = &(ae->PropsOfAE);
WRITE_LOCK(ae->ARWLock);
pp = RepProp(ae->PropsOfAE);
while (!EndOfPAEntr(pp)) {
if (pp->KindOfPE == HoldProperty) {
if (!opp) {
ae->PropsOfAE = NIL;
} else {
opp->NextOfPE = NIL;
}
WRITE_UNLOCK(ae->ARWLock);
return TRUE;
}
pp = RepProp(pp->NextOfPE);
opp = pp;
pp = RepHoldProp(ae->PropsOfAE);
while (!EndOfPAEntr(pp)
&& pp->KindOfPE != HoldProperty) {
opp = &(pp->NextOfPE);
pp = RepHoldProp(pp->NextOfPE);
}
if (!pp) {
WRITE_UNLOCK(ae->ARWLock);
return FALSE;
}
pp->RefsOfPE--;
if (!pp->RefsOfPE) {
*opp = pp->NextOfPE;
Yap_FreeCodeSpace((ADDR)pp);
}
WRITE_UNLOCK(ae->ARWLock);
return FALSE;
return TRUE;
}