=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/gc/finalize.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -p -r1.5 -r1.6 --- OpenXM_contrib2/asir2000/gc/finalize.c 2002/07/24 07:46:17 1.5 +++ OpenXM_contrib2/asir2000/gc/finalize.c 2002/07/24 08:00:08 1.6 @@ -202,15 +202,28 @@ signed_word * log_size_ptr; } new_dl = (struct disappearing_link *) GC_INTERNAL_MALLOC(sizeof(struct disappearing_link),NORMAL); - if (new_dl != 0) { - new_dl -> dl_hidden_obj = HIDE_POINTER(obj); - new_dl -> dl_hidden_link = HIDE_POINTER(link); - dl_set_next(new_dl, dl_head[index]); - dl_head[index] = new_dl; - GC_dl_entries++; - } else { - GC_finalization_failures++; + if (0 == new_dl) { +# ifdef THREADS + UNLOCK(); + ENABLE_SIGNALS(); +# endif + new_dl = (struct disappearing_link *) + GC_oom_fn(sizeof(struct disappearing_link)); + if (0 == new_dl) { + GC_finalization_failures++; + return(0); + } + /* It's not likely we'll make it here, but ... */ +# ifdef THREADS + DISABLE_SIGNALS(); + LOCK(); +# endif } + new_dl -> dl_hidden_obj = HIDE_POINTER(obj); + new_dl -> dl_hidden_link = HIDE_POINTER(link); + dl_set_next(new_dl, dl_head[index]); + dl_head[index] = new_dl; + GC_dl_entries++; # ifdef THREADS UNLOCK(); ENABLE_SIGNALS(); @@ -245,7 +258,7 @@ signed_word * log_size_ptr; UNLOCK(); ENABLE_SIGNALS(); # ifdef DBG_HDRS_ALL - dl_next(curr_dl) = 0; + dl_set_next(curr_dl, 0); # else GC_free((GC_PTR)curr_dl); # endif @@ -416,18 +429,31 @@ finalization_mark_proc * mp; } new_fo = (struct finalizable_object *) GC_INTERNAL_MALLOC(sizeof(struct finalizable_object),NORMAL); - if (new_fo != 0) { - new_fo -> fo_hidden_base = (word)HIDE_POINTER(base); - new_fo -> fo_fn = fn; - new_fo -> fo_client_data = (ptr_t)cd; - new_fo -> fo_object_size = hhdr -> hb_sz; - new_fo -> fo_mark_proc = mp; - fo_set_next(new_fo, fo_head[index]); - GC_fo_entries++; - fo_head[index] = new_fo; - } else { - GC_finalization_failures++; + if (0 == new_fo) { +# ifdef THREADS + UNLOCK(); + ENABLE_SIGNALS(); +# endif + new_fo = (struct finalizable_object *) + GC_oom_fn(sizeof(struct finalizable_object)); + if (0 == new_fo) { + GC_finalization_failures++; + return; + } + /* It's not likely we'll make it here, but ... */ +# ifdef THREADS + DISABLE_SIGNALS(); + LOCK(); +# endif } + new_fo -> fo_hidden_base = (word)HIDE_POINTER(base); + new_fo -> fo_fn = fn; + new_fo -> fo_client_data = (ptr_t)cd; + new_fo -> fo_object_size = hhdr -> hb_sz; + new_fo -> fo_mark_proc = mp; + fo_set_next(new_fo, fo_head[index]); + GC_fo_entries++; + fo_head[index] = new_fo; # ifdef THREADS UNLOCK(); ENABLE_SIGNALS(); @@ -593,7 +619,7 @@ void GC_finalize() GC_words_finalized += ALIGNED_WORDS(curr_fo -> fo_object_size) + ALIGNED_WORDS(sizeof(struct finalizable_object)); - GC_ASSERT(GC_is_marked((ptr_t)curr_fo)); + GC_ASSERT(GC_is_marked(GC_base((ptr_t)curr_fo))); curr_fo = next_fo; } else { prev_fo = curr_fo; @@ -735,8 +761,10 @@ int GC_should_invoke_finalizers GC_PROTO((void)) /* Should be called without allocation lock. */ int GC_invoke_finalizers() { - register struct finalizable_object * curr_fo; - register int count = 0; + struct finalizable_object * curr_fo; + int count = 0; + word mem_freed_before; + GC_bool first_time = TRUE; DCL_LOCK_STATE; while (GC_finalize_now != 0) { @@ -744,6 +772,10 @@ int GC_invoke_finalizers() DISABLE_SIGNALS(); LOCK(); # endif + if (first_time) { + mem_freed_before = GC_mem_freed; + first_time = FALSE; + } curr_fo = GC_finalize_now; # ifdef THREADS if (curr_fo != 0) GC_finalize_now = fo_next(curr_fo); @@ -765,6 +797,11 @@ int GC_invoke_finalizers() GC_free((GC_PTR)curr_fo); # endif } + if (mem_freed_before != GC_mem_freed) { + LOCK(); + GC_finalizer_mem_freed += (GC_mem_freed - mem_freed_before); + UNLOCK(); + } return count; } @@ -814,3 +851,4 @@ void GC_notify_or_invoke_finalizers GC_PROTO((void)) # endif return(result); } +