diff options
author | Andy Wingo <wingo@pobox.com> | 2017-03-13 15:47:51 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2017-03-13 15:47:51 +0100 |
commit | c9910c604279f438728cd268272e1839cbc53835 (patch) | |
tree | cb20e718574bacce1e9356d1b4585e4cbb5b4906 /libguile/finalizers.h | |
parent | e3374320415df973a6d8b0e1065b5b74e9e3e5e0 (diff) | |
download | guile-c9910c604279f438728cd268272e1839cbc53835.tar.gz |
Fix finalizer resuscitation causing excessive GC
* libguile/finalizers.c (async_gc_finalizer):
(scm_i_register_async_gc_callback): Replace "weak gc callback"
mechanism with "async gc callback" mechanism. Very similar but the
new API is designed to be called a bounded number of times, to avoid
running afoul of libgc heuristics.
* libguile/weak-list.h: New internal header.
* libguile/Makefile.am (noinst_HEADERS): Add weak-list.h.
* libguile/weak-set.c (vacuum_all_weak_sets):
(scm_c_make_weak_set, scm_init_weak_set):
* libguile/weak-table.c (vacuum_all_weak_tables):
(scm_c_make_weak_table, scm_init_weak_table): Arrange to vacuum all
weak sets from a single async GC callback, and likewise for weak
tables.
Thanks to Ludovic Courtès for tracking this bug down!
Diffstat (limited to 'libguile/finalizers.h')
-rw-r--r-- | libguile/finalizers.h | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/libguile/finalizers.h b/libguile/finalizers.h index d01d1b734..27b2cbf82 100644 --- a/libguile/finalizers.h +++ b/libguile/finalizers.h @@ -36,10 +36,10 @@ SCM_INTERNAL void scm_i_add_resuscitator (void *obj, scm_t_finalizer_proc, SCM_INTERNAL void scm_i_finalizer_pre_fork (void); -/* CALLBACK will be called on OBJ after each garbage collection, as long - as OBJ is accessible. It will be called from a finalizer, which may - be from an async or from another thread. */ -SCM_INTERNAL void scm_i_register_weak_gc_callback (SCM obj, void (*callback) (SCM)); +/* CALLBACK will be called after each garbage collection. It will be + called from a finalizer, which may be from an async or from another + thread. */ +SCM_INTERNAL void scm_i_register_async_gc_callback (void (*callback) (void)); SCM_API int scm_set_automatic_finalization_enabled (int enabled_p); SCM_API int scm_run_finalizers (void); |