From 02204f9a57e6608a23db6944f9176059966f9fd6 Mon Sep 17 00:00:00 2001 From: Jonas Hahnfeld Date: Fri, 2 Jul 2021 23:16:32 +0200 Subject: [PATCH 3/3] Delay Java finalization for guardians It is only needed once the first guardian is created. * libguile/guardians.c (scm_make_guardian): Move call to enable Java finalization from scm_init_guardians. --- libguile/guardians.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/libguile/guardians.c b/libguile/guardians.c index fa8c8b8f7..357c8dbd1 100644 --- a/libguile/guardians.c +++ b/libguile/guardians.c @@ -306,6 +306,8 @@ guardian_apply (SCM guardian, SCM obj, SCM throw_p) return scm_i_get_one_zombie (guardian); } +static scm_i_pthread_mutex_t gc_java_mutex; + SCM_DEFINE (scm_make_guardian, "make-guardian", 0, 0, 0, (), "Create a new guardian. A guardian protects a set of objects from\n" @@ -349,6 +351,11 @@ SCM_DEFINE (scm_make_guardian, "make-guardian", 0, 0, 0, "value, it is eligible to be returned from a guardian.\n") #define FUNC_NAME s_scm_make_guardian { + /* For guardians, we use unordered finalization `a la Java. */ + scm_i_pthread_mutex_lock (&gc_java_mutex); + GC_set_java_finalization (1); + scm_i_pthread_mutex_unlock (&gc_java_mutex); + t_guardian *g = scm_gc_malloc (sizeof (t_guardian), "guardian"); SCM z; @@ -369,8 +376,7 @@ SCM_DEFINE (scm_make_guardian, "make-guardian", 0, 0, 0, void scm_init_guardians () { - /* We use unordered finalization `a la Java. */ - GC_set_java_finalization (1); + scm_i_pthread_mutex_init (&gc_java_mutex, NULL); tc16_guardian = scm_make_smob_type ("guardian", 0); -- 2.32.0