diff --git a/libguile/struct.c b/libguile/struct.c index 2d36303b4..ad88ac844 100644 --- a/libguile/struct.c +++ b/libguile/struct.c @@ -364,7 +364,7 @@ scm_free_structs (void *dummy1 SCM_UNUSED, { SCM vtable = SCM_STRUCT_VTABLE (chain); if (SCM_STRUCT_GC_CHAIN (vtable) != 0 && vtable != chain) - SCM_SET_GC_MARK (vtable); + SCM_SET_STRUCT_MARK (vtable); chain = SCM_STRUCT_GC_CHAIN (chain); } /* Free unmarked structs. */ @@ -374,9 +374,9 @@ scm_free_structs (void *dummy1 SCM_UNUSED, { SCM obj = chain; chain = SCM_STRUCT_GC_CHAIN (chain); - if (SCM_GC_MARK_P (obj)) + if (SCM_STRUCT_MARK_P (obj)) { - SCM_CLEAR_GC_MARK (obj); + SCM_CLEAR_STRUCT_MARK (obj); SCM_SET_STRUCT_GC_CHAIN (obj, newchain); newchain = obj; } @@ -897,8 +897,8 @@ scm_struct_prehistory () { scm_i_structs_to_free = SCM_EOL; scm_c_hook_add (&scm_before_sweep_c_hook, scm_struct_gc_init, 0, 0); - /* With the new lazy sweep GC, the point at which the entire heap is - swept is just before the mark phase. */ + /* With lazy sweep GC, the point at which the entire heap is swept + is just before the mark phase. */ scm_c_hook_add (&scm_before_mark_c_hook, scm_free_structs, 0, 0); } diff --git a/libguile/struct.h b/libguile/struct.h index f00a8d844..10c0d65c3 100644 --- a/libguile/struct.h +++ b/libguile/struct.h @@ -79,6 +79,15 @@ SCM_API SCM scm_struct_table; #define SCM_STRUCT_GC_CHAIN(X) SCM_CELL_OBJECT_3 (X) #define SCM_SET_STRUCT_GC_CHAIN(X, Y) SCM_SET_CELL_OBJECT_3 (X, Y) + +/* For clearing structs. We can't use the regular GC mark bits, as + meddling with them at random times would mess up the invariants of + the garbage collector. + */ +#define SCM_STRUCT_MARK_P(X) SCM_CELL_WORD_2 (X) +#define SCM_SET_STRUCT_MARK(X) SCM_SET_CELL_WORD_2 (X, 0x1) +#define SCM_CLEAR_STRUCT_MARK(X) SCM_SET_CELL_WORD_2 (X, 0x0) + SCM_INTERNAL SCM scm_i_structs_to_free;