summaryrefslogtreecommitdiff
path: root/libguile/ports.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2012-02-19 12:23:29 +0100
committerAndy Wingo <wingo@pobox.com>2012-02-19 20:46:14 +0100
commit6978c673393a960d7caf604b8c72ff2b5fe0f4ec (patch)
treef768bd982fed6c784aada48070518c1eb2f13bb9 /libguile/ports.c
parent6e9ec86dc0dad255ac120e1a5e77e10f1c544fbc (diff)
downloadguile-6978c673393a960d7caf604b8c72ff2b5fe0f4ec.tar.gz
use the new finalizer helpers
* libguile/foreign.c (scm_set_pointer_finalizer_x) * libguile/ports.c (finalize_port, scm_c_make_port_with_encoding) (open_iconv_descriptors) * libguile/smob.c (scm_i_new_smob, scm_i_new_double_smob) * libguile/struct.c (scm_i_alloc_struct) * libguile/weak-set.c (weak_gc_finalizer) (scm_c_register_weak_gc_callback) * libguile/weak-table.c (scm_c_register_weak_gc_callback) (weak_gc_finalizer) * libguile/numbers.c (make_bignum): Use the new API.
Diffstat (limited to 'libguile/ports.c')
-rw-r--r--libguile/ports.c32
1 files changed, 5 insertions, 27 deletions
diff --git a/libguile/ports.c b/libguile/ports.c
index a989088f3..12174bc8f 100644
--- a/libguile/ports.c
+++ b/libguile/ports.c
@@ -533,22 +533,6 @@ SCM scm_i_port_weak_set;
/* Port finalization. */
-static void finalize_port (GC_PTR, GC_PTR);
-
-/* Register a finalizer for PORT. */
-static SCM_C_INLINE_KEYWORD void
-register_finalizer_for_port (SCM port)
-{
- GC_finalization_proc prev_finalizer;
- GC_PTR prev_finalization_data;
-
- /* Register a finalizer for PORT so that its iconv CDs get freed and
- optionally its type's `free' function gets called. */
- GC_REGISTER_FINALIZER_NO_ORDER (SCM2PTR (port), finalize_port, 0,
- &prev_finalizer,
- &prev_finalization_data);
-}
-
struct do_free_data
{
scm_t_ptob_descriptor *ptob;
@@ -627,12 +611,12 @@ scm_c_make_port_with_encoding (scm_t_bits tag, unsigned long mode_bits,
entry->ilseq_handler = handler;
entry->iconv_descriptors = NULL;
+ if (SCM_PORT_DESCRIPTOR (ret)->free)
+ scm_i_set_finalizer (SCM2PTR (ret), finalize_port, NULL);
+
if (SCM_PORT_DESCRIPTOR (ret)->flags & SCM_PORT_TYPE_HAS_FLUSH)
scm_weak_set_add_x (scm_i_port_weak_set, ret);
- if (SCM_PORT_DESCRIPTOR (ret)->free)
- register_finalizer_for_port (ret);
-
return ret;
}
@@ -906,14 +890,8 @@ open_iconv_descriptors (const char *encoding, int reading, int writing)
id->input_cd = input_cd;
id->output_cd = output_cd;
- {
- GC_finalization_proc prev_finalizer;
- GC_PTR prev_finalization_data;
-
- /* Register a finalizer to close the descriptors. */
- GC_REGISTER_FINALIZER_NO_ORDER (id, finalize_iconv_descriptors, 0,
- &prev_finalizer, &prev_finalization_data);
- }
+ /* Register a finalizer to close the descriptors. */
+ scm_i_set_finalizer (id, finalize_iconv_descriptors, NULL);
return id;