Skip to content
  • Andy Wingo's avatar
    Fix finalizer resuscitation causing excessive GC · c9910c60
    Andy Wingo authored
    * 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!
    c9910c60