diff --git a/fnlz_mlc.c b/fnlz_mlc.c index b51d7c166..6a995f3aa 100644 --- a/fnlz_mlc.c +++ b/fnlz_mlc.c @@ -288,6 +288,7 @@ void GC_finalize_buffer(GC_finalization_buffer_hdr* buffer) { word finalizer_word = (*(word *)obj) & ~(word)FINALIZER_CLOSURE_FLAG; GC_disclaim_proc finalizer = (GC_disclaim_proc) finalizer_word; (finalizer)(obj); + GC_num_finalized++; /* Prevent the object from being re-added to the finalization queue */ *(word *)obj = finalizer_word | HAS_BEEN_FINALIZED_FLAG; cursor++; @@ -327,6 +328,10 @@ GC_INNER void GC_maybe_spawn_finalize_thread() GC_finalizer_thread_exists = 1; } +GC_API size_t GC_finalized_total(void) { + return GC_num_finalized; +} + # endif #endif /* ENABLE_DISCLAIM */ diff --git a/include/gc/gc_disclaim.h b/include/gc/gc_disclaim.h index 9bae2c5ee..f0ea6b7e0 100644 --- a/include/gc/gc_disclaim.h +++ b/include/gc/gc_disclaim.h @@ -103,6 +103,8 @@ GC_API int GC_CALL GC_buffered_finalize_posix_memalign(void ** /* memptr */, siz GC_API void GC_CALL GC_finalize_objects(void); +GC_API size_t GC_finalized_total(void); + #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/include/private/gc_priv.h b/include/private/gc_priv.h index e08ea4270..330594390 100644 --- a/include/private/gc_priv.h +++ b/include/private/gc_priv.h @@ -1609,6 +1609,8 @@ struct _GC_arrays { struct GC_current_buffer _fin_buffer_current; # define GC_finalizer_thread_exists GC_arrays._fin_thread_exists int _fin_thread_exists; +# define GC_num_finalized GC_arrays._fin_total + unsigned _fin_total; # endif # endif # define n_root_sets GC_arrays._n_root_sets