1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-25 04:40:19 +02:00

Cleanup mark-during-GC debug checks.

* libguile/__scm.h (SCM_DEBUG): add SCM_DEBUG_MARKING_API

* libguile/gc.h (SCM_SET_GC_MARK): depending on
SCM_DEBUG_MARKING_API crash if someone is touching markbits
outside regular hours.

Rename ensure_marking() to scm_i_ensure_marking().

* libguile/inline.h (scm_double_cell, scm_cell): only set mark bits
for debugging if SCM_DEBUG_MARKING_API is unset

* libguile/gc-mark.c: Issue deprecation warning if we are marking
outside of the GC mark phase.
This commit is contained in:
Han-Wen Nienhuys 2008-09-09 23:08:16 -03:00
parent a8db4a59c8
commit 7ddb9baf80
5 changed files with 35 additions and 9 deletions

View file

@ -197,6 +197,14 @@
#define SCM_DEBUG 0 #define SCM_DEBUG 0
#endif #endif
/* For debugging purposes: define this is to ensure nobody is using
* the mark bits outside of the marking phase. This is meant for
* debugging purposes only.
*/
#ifndef SCM_DEBUG_MARKING_API
#define SCM_DEBUG_MARKING_API 0
#endif
/* If SCM_DEBUG_CELL_ACCESSES is set to 1, cell accesses will perform /* If SCM_DEBUG_CELL_ACCESSES is set to 1, cell accesses will perform
* exhaustive parameter checking: It will be verified that cell parameters * exhaustive parameter checking: It will be verified that cell parameters
* actually point to a valid heap cell. Note: If this option is enabled, * actually point to a valid heap cell. Note: If this option is enabled,

View file

@ -165,12 +165,19 @@ scm_gc_mark (SCM ptr)
if (SCM_GC_MARK_P (ptr)) if (SCM_GC_MARK_P (ptr))
return; return;
if (!scm_i_marking)
{
static const char msg[]
= "Should only call scm_gc_mark() during GC.";
scm_c_issue_deprecation_warning (msg);
}
SCM_SET_GC_MARK (ptr); SCM_SET_GC_MARK (ptr);
scm_gc_mark_dependencies (ptr); scm_gc_mark_dependencies (ptr);
} }
void void
ensure_marking (void) scm_i_ensure_marking (void)
{ {
assert (scm_i_marking); assert (scm_i_marking);
} }

View file

@ -143,7 +143,7 @@ scm_assert_cell_valid (SCM cell)
*/ */
if (scm_expensive_debug_cell_accesses_p) if (scm_expensive_debug_cell_accesses_p)
scm_i_expensive_validation_check (cell); scm_i_expensive_validation_check (cell);
#if (SCM_DEBUG_MARKING_API == 0)
if (!SCM_GC_MARK_P (cell)) if (!SCM_GC_MARK_P (cell))
{ {
fprintf (stderr, fprintf (stderr,
@ -153,6 +153,7 @@ scm_assert_cell_valid (SCM cell)
(unsigned long) SCM_UNPACK (cell)); (unsigned long) SCM_UNPACK (cell));
abort (); abort ();
} }
#endif /* SCM_DEBUG_MARKING_API */
scm_i_cell_validation_already_running = 0; /* re-enable */ scm_i_cell_validation_already_running = 0; /* re-enable */
} }

View file

@ -156,9 +156,16 @@ typedef unsigned long scm_t_c_bvec_long;
/* testing and changing GC marks */ /* testing and changing GC marks */
#define SCM_GC_MARK_P(x) SCM_GC_CELL_GET_BIT (x) #define SCM_GC_MARK_P(x) SCM_GC_CELL_GET_BIT (x)
void ensure_marking(void); SCM_INTERNAL void scm_i_ensure_marking(void);
#define SCM_SET_GC_MARK(x) SCM_GC_CELL_SET_BIT (x)
#define SCM_CLEAR_GC_MARK(x) SCM_GC_CELL_CLEAR_BIT (x) #if (SCM_DEBUG_MARKING_API == 1)
#define SCM_I_ENSURE_MARKING scm_i_ensure_marking(),
#else
#define SCM_I_ENSURE_MARKING
#endif
#define SCM_SET_GC_MARK(x) SCM_I_ENSURE_MARKING SCM_GC_CELL_SET_BIT (x)
#define SCM_CLEAR_GC_MARK(x) SCM_I_ENSURE_MARKING SCM_GC_CELL_CLEAR_BIT (x)
/* Low level cell data accessing macros. These macros should only be used /* Low level cell data accessing macros. These macros should only be used
* from within code related to garbage collection issues, since they will * from within code related to garbage collection issues, since they will

View file

@ -134,11 +134,13 @@ scm_cell (scm_t_bits car, scm_t_bits cdr)
} }
} }
#if (SCM_DEBUG_MARKING_API == 0)
/* /*
Always set mark. Otherwise cells that are alloced before Always set mark. Otherwise cells that are alloced before
scm_debug_cell_accesses_p is toggled seem invalid. scm_debug_cell_accesses_p is toggled seem invalid.
*/ */
SCM_SET_GC_MARK (z); SCM_SET_GC_MARK (z);
#endif /* SCM_DEBUG_MARKING_API */
/* /*
TODO: figure out if this use of mark bits is valid with TODO: figure out if this use of mark bits is valid with
@ -202,9 +204,10 @@ scm_double_cell (scm_t_bits car, scm_t_bits cbr,
abort(); abort();
} }
} }
#if (SCM_DEBUG_MARKING_API == 0)
/* see above. */ /* see above. */
SCM_SET_GC_MARK (z); SCM_SET_GC_MARK (z);
#endif /* SCM_DEBUG_MARKING_API */
#endif #endif