#ifdef GC_ASSERTIONS
/* Check that all mark bits for the free list whose first entry is q */
/* are set. */
- void GC_check_fl_marks(ptr_t q)
+ void GC_check_fl_marks(AO_t *q)
{
- ptr_t p;
- for (p = q; p != 0; p = obj_link(p)) {
- if (!GC_is_marked(p)) {
- GC_err_printf("Unmarked object %p on list %p\n", p, q);
- ABORT("Unmarked local free list entry");
- }
- }
+ AO_t *p, *p_next;
+ p = (AO_t *)AO_load_acquire_read(q);
+ if ((word)p < HBLKSIZE)
+ return;
+ while (p != NULL) {
+ if (!GC_is_marked(p)) {
+ GC_err_printf("Unmarked object %p on list %p\n", p, q);
+ ABORT("Unmarked local free list entry");
+ }
+ p_next = (AO_t *)AO_load_acquire_read(p);
+ if (p != (AO_t *)AO_load_acquire_read(q))
+ break;
+ q = p;
+ p = p_next;
+ }
}
#endif
/* Set all mark bits associated with */
/* a free list. */
#ifdef GC_ASSERTIONS
- void GC_check_fl_marks(ptr_t p);
+ void GC_check_fl_marks(AO_t *p);
/* Check that all mark bits */
/* associated with a free list are */
/* set. Abort if not. */
/* Check that all thread-local free-lists in p are completely marked. */
void GC_check_tls_for(GC_tlfs p)
{
- ptr_t q;
int j;
for (j = 1; j < TINY_FREELISTS; ++j) {
- q = p -> ptrfree_freelists[j];
- if ((word)q > HBLKSIZE) GC_check_fl_marks(q);
- q = p -> normal_freelists[j];
- if ((word)q > HBLKSIZE) GC_check_fl_marks(q);
+ GC_check_fl_marks((AO_t *)&p -> ptrfree_freelists[j]);
+ GC_check_fl_marks((AO_t *)&p -> normal_freelists[j]);
# ifdef GC_GCJ_SUPPORT
- q = p -> gcj_freelists[j];
- if ((word)q > HBLKSIZE) GC_check_fl_marks(q);
+ GC_check_fl_marks((AO_t *)&p -> gcj_freelists[j]);
# endif
# ifdef ENABLE_DISCLAIM
- q = p -> finalized_freelists[j];
- if ((word)q > HBLKSIZE)
- GC_check_fl_marks(q);
+ GC_check_fl_marks((AO_t *)&p -> finalized_freelists[j]);
# endif
}
}