mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-16 08:40:19 +02:00
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!
This commit is contained in:
parent
e337432041
commit
c9910c6042
6 changed files with 137 additions and 43 deletions
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue