Permalink
Browse files

Code refactoring of GC_check_tls_for/GC_check_fl_marks

* alloc.c (GC_check_fl_marks): Change prototype (pass pointer to
"freelist" element instead of value); do not define the function if
THREAD_LOCAL_ALLOC undefined.
* include/private/gc_priv.h (GC_check_fl_marks): Likewise.
* alloc.c (GC_check_fl_marks): Skip check if the argument points to
a special (non-pointer) value; update comment; rename "q" local
variable to "list".
* thread_local_alloc.c (GC_check_tls_for): Update code according to
GC_check_fl_marks functionality change (remove checks for special
value).
  • Loading branch information...
1 parent 490bf29 commit e67ab084068f6fc192b3d7505565f7d825cb82da @ivmai committed Apr 20, 2012
Showing with 19 additions and 21 deletions.
  1. +13 −9 alloc.c
  2. +2 −2 include/private/gc_priv.h
  3. +4 −10 thread_local_alloc.c
View
22 alloc.c
@@ -729,20 +729,24 @@ GC_INNER void GC_set_fl_marks(ptr_t q)
}
}
-#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)
+#if defined(GC_ASSERTIONS) && defined(THREADS) && defined(THREAD_LOCAL_ALLOC)
+ /* Check that all mark bits for the free list whose first entry is */
+ /* (*pfreelist) are set. Check skipped if points to a special value. */
+ void GC_check_fl_marks(void **pfreelist)
{
- ptr_t p;
- for (p = q; p != 0; p = obj_link(p)) {
+ ptr_t list = *pfreelist;
+ ptr_t p;
+
+ if ((word)list <= HBLKSIZE) return;
+
+ for (p = list; p != 0; p = obj_link(p)) {
if (!GC_is_marked(p)) {
- GC_err_printf("Unmarked object %p on list %p\n", p, q);
+ GC_err_printf("Unmarked object %p on list %p\n", p, list);
ABORT("Unmarked local free list entry");
}
- }
+ }
}
-#endif
+#endif /* GC_ASSERTIONS && THREAD_LOCAL_ALLOC */
/* Clear all mark bits for the free list whose first entry is q */
/* Decrement GC_bytes_found by number of bytes on free list. */
@@ -1587,8 +1587,8 @@ GC_INNER void GC_set_hdr_marks(hdr * hhdr);
GC_INNER void GC_set_fl_marks(ptr_t p);
/* Set all mark bits associated with */
/* a free list. */
-#ifdef GC_ASSERTIONS
- void GC_check_fl_marks(ptr_t p);
+#if defined(GC_ASSERTIONS) && defined(THREADS) && defined(THREAD_LOCAL_ALLOC)
+ void GC_check_fl_marks(void **);
/* Check that all mark bits */
/* associated with a free list are */
/* set. Abort if not. */
View
@@ -310,22 +310,16 @@ GC_INNER void GC_mark_thread_local_fls_for(GC_tlfs p)
/* 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(&p->ptrfree_freelists[j]);
+ GC_check_fl_marks(&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(&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(&p->finalized_freelists[j]);
# endif
}
}

0 comments on commit e67ab08

Please sign in to comment.