/*
* sGCfinalize.c -- dummy implementation of PCedar finalization.
* taken from Mike Agostino's pseudo PCR.
* spcr has finalization available, but the PCedar interface relies
* on multiple threads, and thus can't really be implememnted.
*
* Hans-J. Boehm January 25, 1993 12:48:56 pm PST
*/
#include <xr/GC.h>
#include <xr/sMisc.h>
XR←FinalizationHandle GC←finalizeListHead;
static void
XR←RemoveFromFQInternal();
XR←FinalizationState
XR←DisableFinalization(h)
XR←FinalizationHandle h;
{
XR←FinalizationHandle p, prev;
XR←FinalizationState q;
word w;
if( h == NIL ) return fzsDisabled;
if( h->associatedFQ == NIL ) {
q = fzsDisabled;
} else if( !XR←IsDisguised(h) ) {
q = fzsOnFQ;
XR←RemoveFromFQInternal(h);
} else {
q = fzsEnabled;
p = GC←finalizeListHead;
prev = NIL;
for(;;) {
if( p == NIL ) break;
if( p == h ) {
if( prev == NIL )
GC←finalizeListHead = p->next;
else
prev->next = p->next;
break;
}
prev = p;
p = p->next;
}
w = XR←FetchFromDisguised(h);
XR←StoreUndisguised(w,h);
h->associatedFQ = NIL;
}
h->next = NIL;
return q;
}
XR←FinalizationState
XR←ReenableFinalization(h, fq)
XR←FinalizationHandle h;
XR←FinalizationQueue fq;
{
XR←FinalizationState q;
word object;
if( (h == NIL) || (fq == NIL) ) return fzsDisabled;
if( XR←IsDisguised(h) ) {
q = fzsEnabled;
} else {
if( h->associatedFQ == NIL ) {
q = fzsDisabled;
} else {
q = fzsOnFQ;
XR←RemoveFromFQInternal(h);
}
object = XR←FetchFromUndisguised(h);
XR←StoreDisguised(object,h);
h->next = GC←finalizeListHead;
GC←finalizeListHead = h;
}
h->associatedFQ = fq;
return q;
}
void
XR←EnableFinalization(object, fq, h)
XR←Pointer object;
XR←FinalizationQueue fq;
XR←FinalizationHandle h;
{
if (object == NIL || fq == NIL || h == NIL) return;
XR←StoreDisguised(object, h);
h->associatedFQ = fq;
h->next = GC←finalizeListHead;
GC←finalizeListHead = h;
}
bool
XR←FQEmpty(fq)
XR←FinalizationQueue fq;
{
return fq == NIL || fq->head == NIL;
}
XR←FinalizationHandle
XR←FQNextNoAbort(fq)
XR←FinalizationQueue fq;
{
SPCR←NotImplemented("XR←FQNextNoAbort");
}
XR←FinalizationState
XR←GetFinalizationState(h)
XR←FinalizationHandle h;
{
XR←FinalizationState q;
if( h == NIL ) return fzsDisabled;
if( XR←IsDisguised(h) ) {
q = fzsEnabled;
} else if( h->associatedFQ != NIL ) {
q = fzsOnFQ;
} else {
q = fzsDisabled;
}
return q;
}
XR←Pointer
XR←HandleToObject(h)
XR←FinalizationHandle h;
{
word w;
if (h == NIL) return NIL;
if( XR←IsDisguised(h) ) {
w = XR←FetchFromDisguised(h);
} else {
w = XR←FetchFromUndisguised(h);
}
return (XR←Pointer)w;
}
XR←FinalizationQueue
XR←NewFQ() {
XR←FinalizationQueue fq;
fq = (XR←FinalizationQueue)
GC←malloc(sizeof(struct XR←FinalizationQueueStructure));
fq->head = NIL;
fq->tail = NIL;
return fq;
}
XR←FinalizationHandle
XR←NewFinalizationHandle() {
XR←FinalizationHandle h = (XR←FinalizationHandle)
GC←malloc(sizeof(struct XR←FinalizableObjectStructure));
h->firstword = 0;
h->secondword = 0;
h->associatedFQ = NIL;
h->next = NIL;
return h;
}
static void
XR←RemoveFromFQInternal (h)
XR←FinalizationHandle h;
{
XR←FinalizationQueue fq;
XR←FinalizationHandle p, prev;
fq = h->associatedFQ;
p = fq->head;
prev = NIL;
for(;;) {
if( p == h ) {
if( prev == NIL ) fq->head = p->next; else prev->next = p->next;
if( fq->tail == p ) fq->tail = prev;
p->next = NIL;
p->associatedFQ = NIL;
break;
}
if( p == NIL ) XR←Panic("RemoveFromFQInternal 0");
prev = p;
p = p->next;
}
}