diff options
Diffstat (limited to 'alloc.c')
-rw-r--r-- | alloc.c | 28 |
1 files changed, 24 insertions, 4 deletions
@@ -180,7 +180,8 @@ word GC_adj_words_allocd() /* managed object should not alter result, assuming the client */ /* is playing by the rules. */ result = (signed_word)GC_words_allocd - - (signed_word)GC_mem_freed - expl_managed; + - (signed_word)GC_mem_freed + + (signed_word)GC_finalizer_mem_freed - expl_managed; if (result > (signed_word)GC_words_allocd) { result = GC_words_allocd; /* probably client bug or unfortunate scheduling */ @@ -304,6 +305,9 @@ void GC_maybe_gc() GC_bool GC_try_to_collect_inner(stop_func) GC_stop_func stop_func; { +# ifdef CONDPRINT + CLOCK_TYPE start_time, current_time; +# endif if (GC_incremental && GC_collection_in_progress()) { # ifdef CONDPRINT if (GC_print_stats) { @@ -319,6 +323,7 @@ GC_stop_func stop_func; } # ifdef CONDPRINT if (GC_print_stats) { + if (GC_print_stats) GET_TIME(start_time); GC_printf2( "Initiating full world-stop collection %lu after %ld allocd bytes\n", (unsigned long) GC_gc_no+1, @@ -357,6 +362,13 @@ GC_stop_func stop_func; return(FALSE); } GC_finish_collection(); +# if defined(CONDPRINT) + if (GC_print_stats) { + GET_TIME(current_time); + GC_printf1("Complete collection took %lu msecs\n", + MS_TIME_DIFF(current_time,start_time)); + } +# endif return(TRUE); } @@ -426,6 +438,7 @@ int GC_collect_a_little GC_PROTO(()) result = (int)GC_collection_in_progress(); UNLOCK(); ENABLE_SIGNALS(); + if (!result && GC_debugging_started) GC_print_all_smashed(); return(result); } @@ -444,13 +457,13 @@ GC_stop_func stop_func; CLOCK_TYPE start_time, current_time; # endif - STOP_WORLD(); # ifdef PRINTTIMES GET_TIME(start_time); # endif # if defined(CONDPRINT) && !defined(PRINTTIMES) if (GC_print_stats) GET_TIME(start_time); # endif + STOP_WORLD(); # ifdef CONDPRINT if (GC_print_stats) { GC_printf1("--> Marking for collection %lu ", @@ -514,6 +527,7 @@ GC_stop_func stop_func; (*GC_check_heap)(); } + START_WORLD(); # ifdef PRINTTIMES GET_TIME(current_time); GC_printf1("World-stopped marking took %lu msecs\n", @@ -527,7 +541,6 @@ GC_stop_func stop_func; } # endif # endif - START_WORLD(); return(TRUE); } @@ -604,6 +617,7 @@ void GC_finish_collection() GC_print_address_map(); } # endif + COND_DUMP; if (GC_find_leak) { /* Mark all objects on the free list. All objects should be */ /* marked when we're done. */ @@ -700,6 +714,7 @@ void GC_finish_collection() GC_words_allocd = 0; GC_words_wasted = 0; GC_mem_freed = 0; + GC_finalizer_mem_freed = 0; # ifdef USE_MUNMAP GC_unmap_old(); @@ -723,6 +738,7 @@ void GC_finish_collection() int result; DCL_LOCK_STATE; + if (GC_debugging_started) GC_print_all_smashed(); GC_INVOKE_FINALIZERS(); DISABLE_SIGNALS(); LOCK(); @@ -734,7 +750,10 @@ void GC_finish_collection() EXIT_GC(); UNLOCK(); ENABLE_SIGNALS(); - if(result) GC_INVOKE_FINALIZERS(); + if(result) { + if (GC_debugging_started) GC_print_all_smashed(); + GC_INVOKE_FINALIZERS(); + } return(result); } @@ -742,6 +761,7 @@ void GC_gcollect GC_PROTO(()) { GC_notify_full_gc(); (void)GC_try_to_collect(GC_never_stop_func); + if (GC_have_errors) GC_print_all_errors(); } word GC_n_heap_sects = 0; /* Number of sections currently in heap. */ |