void GC_register_finalizer_no_order(void * obj, GC_finalization_proc fn, void * cd, GC_finalization_proc *ofn, void ** ocd) { GC_register_finalizer_inner(obj, fn, cd, ofn, ocd, GC_null_finalize_mark_proc); }
void GC_register_finalizer_ignore_self(void * obj, GC_finalization_proc fn, void * cd, GC_finalization_proc *ofn, void ** ocd) { GC_register_finalizer_inner(obj, fn, cd, ofn, ocd, GC_ignore_self_finalize_mark_proc); }
GC_API void GC_CALL GC_register_finalizer(void * obj, GC_finalization_proc fn, void * cd, GC_finalization_proc *ofn, void ** ocd) { GC_register_finalizer_inner(obj, fn, cd, ofn, ocd, GC_normal_finalize_mark_proc); }
GC_INNER int GC_clone_finalizer(void * src_p, void * dest_p) { struct finalizable_object * curr_fo; size_t index; ptr_t base, result; GC_finalization_proc fn; ptr_t cd; finalization_mark_proc mp; DCL_LOCK_STATE; base = (ptr_t)src_p; result = (ptr_t)dest_p; LOCK(); index = HASH2(base, log_fo_table_size); curr_fo = GC_fo_head[index]; while (curr_fo != 0) { GC_ASSERT(GC_size(curr_fo) >= sizeof(struct finalizable_object)); if (curr_fo -> fo_hidden_base == GC_HIDE_POINTER(base)) { fn = curr_fo -> fo_fn; cd = curr_fo -> fo_client_data; mp = curr_fo -> fo_mark_proc; UNLOCK(); return GC_register_finalizer_inner(result, fn, cd, 0, 0, mp); } curr_fo = fo_next(curr_fo); } UNLOCK(); return TRUE; }
/* PLTSCHEME: eager finalizers */ void GC_register_eager_finalizer(void * obj, int eager_level, GC_finalization_proc fn, void * cd, GC_finalization_proc *ofn, void ** ocd) { GC_register_finalizer_inner(obj, fn, cd, ofn, ocd, GC_normal_finalize_mark_proc, eager_level); }
void GC_register_finalizer(void * obj, GC_finalization_proc fn, void * cd, GC_finalization_proc *ofn, void ** ocd) { GC_register_finalizer_inner(obj, fn, cd, ofn, ocd, GC_normal_finalize_mark_proc, 0); /* PLTSCHEME */ }
void GC_register_finalizer_unreachable(void * obj, GC_finalization_proc fn, void * cd, GC_finalization_proc *ofn, void ** ocd) { need_unreachable_finalization = TRUE; GC_ASSERT(GC_java_finalization); GC_register_finalizer_inner(obj, fn, cd, ofn, ocd, GC_unreachable_finalize_mark_proc); }