summaryrefslogtreecommitdiff
path: root/libguile/finalizers.h
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2017-03-13 15:47:51 +0100
committerAndy Wingo <wingo@pobox.com>2017-03-13 15:47:51 +0100
commitc9910c604279f438728cd268272e1839cbc53835 (patch)
treecb20e718574bacce1e9356d1b4585e4cbb5b4906 /libguile/finalizers.h
parente3374320415df973a6d8b0e1065b5b74e9e3e5e0 (diff)
downloadguile-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.h8
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);