diff options
Diffstat (limited to 'libguile/guardians.c')
-rw-r--r-- | libguile/guardians.c | 48 |
1 files changed, 26 insertions, 22 deletions
diff --git a/libguile/guardians.c b/libguile/guardians.c index 81313df31..a3d03230a 100644 --- a/libguile/guardians.c +++ b/libguile/guardians.c @@ -57,7 +57,6 @@ #include "libguile/validate.h" #include "libguile/root.h" #include "libguile/hashtab.h" -#include "libguile/weaks.h" #include "libguile/deprecation.h" #include "libguile/eval.h" @@ -87,16 +86,16 @@ guardian_print (SCM guardian, SCM port, scm_print_state *pstate SCM_UNUSED) { t_guardian *g = GUARDIAN_DATA (guardian); - scm_puts ("#<guardian ", port); + scm_puts_unlocked ("#<guardian ", port); scm_uintprint ((scm_t_bits) g, 16, port); - scm_puts (" (reachable: ", port); + scm_puts_unlocked (" (reachable: ", port); scm_display (scm_from_uint (g->live), port); - scm_puts (" unreachable: ", port); + scm_puts_unlocked (" unreachable: ", port); scm_display (scm_length (g->zombies), port); - scm_puts (")", port); + scm_puts_unlocked (")", port); - scm_puts (">", port); + scm_puts_unlocked (">", port); return 1; } @@ -109,9 +108,9 @@ finalize_guarded (GC_PTR ptr, GC_PTR finalizer_data) SCM cell_pool; SCM obj, guardian_list, proxied_finalizer; - obj = PTR2SCM (ptr); - guardian_list = SCM_CDR (PTR2SCM (finalizer_data)); - proxied_finalizer = SCM_CAR (PTR2SCM (finalizer_data)); + obj = SCM_PACK_POINTER (ptr); + guardian_list = SCM_CDR (SCM_PACK_POINTER (finalizer_data)); + proxied_finalizer = SCM_CAR (SCM_PACK_POINTER (finalizer_data)); #ifdef DEBUG_GUARDIANS printf ("finalizing guarded %p (%u guardians)\n", @@ -131,9 +130,12 @@ finalize_guarded (GC_PTR ptr, GC_PTR finalizer_data) guardian_list = SCM_CDR (guardian_list)) { SCM zombies; + SCM guardian; t_guardian *g; - if (SCM_WEAK_PAIR_CAR_DELETED_P (guardian_list)) + guardian = scm_c_weak_vector_ref (scm_car (guardian_list), 0); + + if (scm_is_false (guardian)) { /* The guardian itself vanished in the meantime. */ #ifdef DEBUG_GUARDIANS @@ -142,7 +144,7 @@ finalize_guarded (GC_PTR ptr, GC_PTR finalizer_data) continue; } - g = GUARDIAN_DATA (SCM_CAR (guardian_list)); + g = GUARDIAN_DATA (guardian); if (g->live == 0) abort (); @@ -166,8 +168,8 @@ finalize_guarded (GC_PTR ptr, GC_PTR finalizer_data) GC_finalization_proc finalizer, prev_finalizer; GC_PTR finalizer_data, prev_finalizer_data; - finalizer = (GC_finalization_proc) SCM2PTR (SCM_CAR (proxied_finalizer)); - finalizer_data = SCM2PTR (SCM_CDR (proxied_finalizer)); + finalizer = (GC_finalization_proc) SCM_UNPACK_POINTER (SCM_CAR (proxied_finalizer)); + finalizer_data = SCM_UNPACK_POINTER (SCM_CDR (proxied_finalizer)); if (finalizer == NULL) abort (); @@ -191,7 +193,7 @@ scm_i_guard (SCM guardian, SCM obj) { t_guardian *g = GUARDIAN_DATA (guardian); - if (SCM_NIMP (obj)) + if (SCM_HEAP_OBJECT_P (obj)) { /* Register a finalizer and pass a pair as the ``client data'' argument. The pair contains in its car `#f' or a pair describing a @@ -209,13 +211,15 @@ scm_i_guard (SCM guardian, SCM obj) g->live++; - /* Note: GUARDIANS_FOR_OBJ is a weak list so that a guardian can be - collected before the objects it guards (see `guardians.test'). */ - guardians_for_obj = scm_weak_car_pair (guardian, SCM_EOL); + /* Note: GUARDIANS_FOR_OBJ holds weak references to guardians so + that a guardian can be collected before the objects it guards + (see `guardians.test'). */ + guardians_for_obj = scm_cons (scm_make_weak_vector (SCM_INUM1, guardian), + SCM_EOL); finalizer_data = scm_cons (SCM_BOOL_F, guardians_for_obj); - GC_REGISTER_FINALIZER_NO_ORDER (SCM2PTR (obj), finalize_guarded, - SCM2PTR (finalizer_data), + GC_REGISTER_FINALIZER_NO_ORDER (SCM_UNPACK_POINTER (obj), finalize_guarded, + SCM_UNPACK_POINTER (finalizer_data), &prev_finalizer, &prev_data); if (prev_finalizer == finalize_guarded) @@ -227,7 +231,7 @@ scm_i_guard (SCM guardian, SCM obj) if (prev_data == NULL) abort (); - prev_finalizer_data = PTR2SCM (prev_data); + prev_finalizer_data = SCM_PACK_POINTER (prev_data); if (!scm_is_pair (prev_finalizer_data)) abort (); @@ -244,8 +248,8 @@ scm_i_guard (SCM guardian, SCM obj) `finalize_guarded ()' has finished. */ SCM proxied_finalizer; - proxied_finalizer = scm_cons (PTR2SCM (prev_finalizer), - PTR2SCM (prev_data)); + proxied_finalizer = scm_cons (SCM_PACK_POINTER (prev_finalizer), + SCM_PACK_POINTER (prev_data)); SCM_SETCAR (finalizer_data, proxied_finalizer); } } |