/* * 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 #include 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; } }