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;
}

View File

@ -1304,7 +1304,7 @@ X_API void *
YAP_ReallocSpaceFromYap(void *ptr,unsigned int size) {
void *new_ptr;
BACKUP_MACHINE_REGS();
while ((new_ptr = Yap_ReallocCodeSpace(size,ptr)) == NULL) {
while ((new_ptr = Yap_ReallocCodeSpace(ptr,size)) == NULL) {
if (!Yap_growheap(FALSE, size, NULL)) {
Yap_Error(OUT_OF_HEAP_ERROR, TermNil, Yap_ErrorMessage);
return NULL;
@ -2596,13 +2596,13 @@ YAP_TermNil(void)
X_API int
YAP_AtomGetHold(Atom at)
{
return Yap_AtomGetHold(at);
return Yap_AtomIncreaseHold(at);
}
X_API int
YAP_AtomReleaseHold(Atom at)
{
return Yap_AtomReleaseHold(at);
return Yap_AtomDecreaseHold(at);
}
X_API Agc_hook

View File

@ -55,9 +55,8 @@ Term STD_PROTO(Yap_NStringToListOfAtoms,(char *, size_t));
Term STD_PROTO(Yap_WideStringToListOfAtoms,(wchar_t *));
Term STD_PROTO(Yap_NWideStringToListOfAtoms,(wchar_t *, size_t));
Term STD_PROTO(Yap_NWideStringToDiffListOfAtoms,(wchar_t *, Term, size_t));
struct hold_entry *STD_PROTO(Yap_InitAtomHold,(void));
int STD_PROTO(Yap_AtomGetHold,(Atom));
int STD_PROTO(Yap_AtomReleaseHold,(Atom));
int STD_PROTO(Yap_AtomIncreaseHold,(Atom));
int STD_PROTO(Yap_AtomDecreaseHold,(Atom));
#define Yap_StartSlots() (*--ASP = MkIntTerm(0))
#define Yap_CurrentSlot() IntOfTerm(ASP[0])

View File

@ -1127,6 +1127,7 @@ typedef struct hold_entry
{
Prop NextOfPE; /* used to chain properties */
PropFlags KindOfPE; /* kind of property */
UInt RefsOfPE; /* used to count the number of holds */
} HoldEntry;
#if USE_OFFSETS_IN_PROPS

View File

@ -273,7 +273,6 @@
#define Yap_AllowGlobalExpansion Yap_heap_regs->allow_global_expansion
#define Yap_AllowTrailExpansion Yap_heap_regs->allow_trail_expansion
#define SizeOfOverflow Yap_heap_regs->size_of_overflow
#define GlobalHoldEntry Yap_heap_regs->global_hold_entry
#define AGcLastCall Yap_heap_regs->agc_last_call

View File

@ -273,7 +273,6 @@
int allow_global_expansion;
int allow_trail_expansion;
UInt size_of_overflow;
struct hold_entry *global_hold_entry;
UInt agc_last_call;

View File

@ -273,7 +273,6 @@
Yap_heap_regs->allow_global_expansion = TRUE;
Yap_heap_regs->allow_trail_expansion = TRUE;
Yap_heap_regs->size_of_overflow = 0;
Yap_heap_regs->global_hold_entry = Yap_InitAtomHold();
Yap_heap_regs->agc_last_call = 0;

View File

@ -273,7 +273,6 @@
Yap_heap_regs->global_hold_entry = HoldEntryAdjust(Yap_heap_regs->global_hold_entry);

View File

@ -698,7 +698,9 @@ X_API int PL_get_tail(term_t ts, term_t tl)
*/
X_API atom_t PL_new_atom(const char *c)
{
return AtomToSWIAtom(Yap_LookupAtom((char *)c));
Atom at = Yap_LookupAtom((char *)c);
Yap_AtomIncreaseHold(at);
return AtomToSWIAtom(at);
}
X_API atom_t PL_new_atom_wchars(int len, const wchar_t *c)
@ -1637,17 +1639,15 @@ X_API int PL_unify_term(term_t l,...)
/* end PL_unify_* functions =============================*/
/* SWI: void PL_register_atom(atom_t atom) */
/* SAM TO DO */
X_API void PL_register_atom(atom_t atom)
{
Yap_AtomGetHold(SWIAtomToAtom(atom));
Yap_AtomIncreaseHold(SWIAtomToAtom(atom));
}
/* SWI: void PL_unregister_atom(atom_t atom) */
/* SAM TO DO */
X_API void PL_unregister_atom(atom_t atom)
{
Yap_AtomReleaseHold(SWIAtomToAtom(atom));
Yap_AtomDecreaseHold(SWIAtomToAtom(atom));
}
X_API int PL_get_string_chars(term_t t, char **s, int *len)

View File

@ -307,7 +307,6 @@ int allow_local_expansion Yap_AllowLocalExpansion =TRUE void
int allow_global_expansion Yap_AllowGlobalExpansion =TRUE void
int allow_trail_expansion Yap_AllowTrailExpansion =TRUE void
UInt size_of_overflow SizeOfOverflow =0 void
struct hold_entry *global_hold_entry GlobalHoldEntry =Yap_InitAtomHold() HoldEntryAdjust
/* amount of space recovered in all garbage collections */
UInt agc_last_call AGcLastCall =0 void
/* amount of space recovered in all garbage collections */