mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-17 01:00:20 +02:00
Add interface to disable automatic finalization
* libguile/finalizers.h: * libguile/finalizers.c (run_finalizers_async_thunk): Call the new scm_run_finalizers helper. (scm_set_automatic_finalization_enabled, scm_run_finalizers): New functions. (scm_init_finalizers): Only set a finalizer notifier if automatic finalization is enabled. * doc/ref/libguile-smobs.texi (Garbage Collecting Smobs): Add discussion of concurrency. * doc/ref/api-smobs.texi (Smobs): Document new functions.
This commit is contained in:
parent
e0da53b4fe
commit
fa1a30726d
4 changed files with 101 additions and 6 deletions
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 2012 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 2012, 2014 Free Software Foundation, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
|
@ -31,6 +31,8 @@
|
|||
|
||||
|
||||
|
||||
static int automatic_finalization_p = 1;
|
||||
|
||||
static size_t finalization_count;
|
||||
|
||||
|
||||
|
@ -130,7 +132,7 @@ static SCM finalizer_async_cell;
|
|||
static SCM
|
||||
run_finalizers_async_thunk (void)
|
||||
{
|
||||
finalization_count += GC_invoke_finalizers ();
|
||||
scm_run_finalizers ();
|
||||
return SCM_UNSPECIFIED;
|
||||
}
|
||||
|
||||
|
@ -169,6 +171,43 @@ GC_set_finalizer_notifier (void (*notifier) (void))
|
|||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
int
|
||||
scm_set_automatic_finalization_enabled (int enabled_p)
|
||||
{
|
||||
int was_enabled_p = automatic_finalization_p;
|
||||
|
||||
if (enabled_p == was_enabled_p)
|
||||
return was_enabled_p;
|
||||
|
||||
if (!scm_initialized_p)
|
||||
{
|
||||
automatic_finalization_p = enabled_p;
|
||||
return was_enabled_p;
|
||||
}
|
||||
|
||||
GC_set_finalizer_notifier (enabled_p ? queue_finalizer_async : 0);
|
||||
|
||||
automatic_finalization_p = enabled_p;
|
||||
|
||||
return was_enabled_p;
|
||||
}
|
||||
|
||||
int
|
||||
scm_run_finalizers (void)
|
||||
{
|
||||
int finalized = GC_invoke_finalizers ();
|
||||
|
||||
finalization_count += finalized;
|
||||
|
||||
return finalized;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void
|
||||
scm_init_finalizers (void)
|
||||
{
|
||||
|
@ -178,5 +217,7 @@ scm_init_finalizers (void)
|
|||
scm_cons (scm_c_make_gsubr ("%run-finalizers", 0, 0, 0,
|
||||
run_finalizers_async_thunk),
|
||||
SCM_BOOL_F);
|
||||
GC_set_finalizer_notifier (queue_finalizer_async);
|
||||
|
||||
if (automatic_finalization_p)
|
||||
GC_set_finalizer_notifier (queue_finalizer_async);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue