1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-20 11:40:18 +02:00

Added support for SMOBs free function (via finalizers).

* libguile/smob.c (scm_i_finalize_smob): New.

* libguile/smob.h (SCM_NEWSMOB): Register `scm_i_finalize_smob ()' as a
  finalizer for Z if its SMOB type has a free function.
  (SCM_NEWSMOB3): Likewise.
  (scm_i_finalize_smob): New declaration.

git-archimport-id: lcourtes@laas.fr--2005-libre/guile-core--boehm-gc--1.9--patch-26
This commit is contained in:
Ludovic Courtes 2006-05-23 21:59:42 +00:00 committed by Ludovic Courtès
parent 8574d367a9
commit e9d635e5d8
2 changed files with 28 additions and 4 deletions

View file

@ -37,6 +37,10 @@
#include "libguile/smob.h"
#include <gc/gc.h>
#include <gc/gc_mark.h>
/* scm_smobs scm_numsmob
@ -488,8 +492,6 @@ free_print (SCM exp, SCM port, scm_print_state *pstate SCM_UNUSED)
/* Marking SMOBs using user-supplied mark procedures. */
#include <gc/gc.h>
#include <gc/gc_mark.h>
/* The freelist and GC kind used for SMOB types that provide a custom mark
procedure. */
@ -599,6 +601,19 @@ scm_i_new_smob_with_mark_proc (scm_t_bits tc, scm_t_bits data1,
return cell;
}
/* Finalize SMOB by calling its SMOB type's free function, if any. */
SCM
scm_i_finalize_smob (SCM smob, SCM data)
{
size_t (* free_smob) (SCM);
free_smob = scm_smobs[SCM_SMOBNUM (smob)].free;
if (free_smob)
free_smob (smob);
return SCM_UNSPECIFIED;
}
void

View file

@ -54,10 +54,14 @@ SCM_API SCM scm_i_new_smob_with_mark_proc (scm_t_bits tc,
#define SCM_NEWSMOB(z, tc, data) \
do \
{ \
z = (scm_smobs[SCM_TC2SMOBNUM (tc)].mark \
register scm_t_bits _smobnum = SCM_TC2SMOBNUM (tc); \
z = (scm_smobs[_smobnum].mark \
? scm_i_new_smob_with_mark_proc ((tc), (scm_t_bits)(data), \
0, 0) \
: scm_cell (tc, (scm_t_bits)(data))); \
if (scm_smobs[_smobnum].free) \
scm_gc_register_finalizer ((z), scm_i_finalize_smob, \
SCM_BOOL_F, 0); \
} \
while (0)
@ -79,13 +83,17 @@ while (0)
#define SCM_NEWSMOB3(z, tc, data1, data2, data3) \
do \
{ \
z = (scm_smobs[SCM_TC2SMOBNUM (tc)].mark \
register scm_t_bits _smobnum = SCM_TC2SMOBNUM (tc); \
z = (scm_smobs[_smobnum].mark \
? scm_i_new_smob_with_mark_proc (tc, (scm_t_bits)(data1), \
(scm_t_bits)(data2), \
(scm_t_bits)(data3)) \
: scm_double_cell ((tc), (scm_t_bits)(data1), \
(scm_t_bits)(data2), \
(scm_t_bits)(data3))); \
if (scm_smobs[_smobnum].free) \
scm_gc_register_finalizer ((z), scm_i_finalize_smob, \
SCM_BOOL_F, 0); \
} \
while (0)
@ -131,6 +139,7 @@ SCM_API long scm_numsmob;
SCM_API scm_smob_descriptor scm_smobs[];
SCM_API void scm_i_set_smob_flags (SCM x, scm_t_bits data);
SCM_API SCM scm_i_finalize_smob (SCM smob, SCM data);