summaryrefslogtreecommitdiff
path: root/mark.c
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2011-09-28 13:48:17 +0400
committerIvan Maidanski <ivmai@mail.ru>2011-09-30 17:35:35 +0400
commit56c8a56f2735b5a2ab50bedbd61a8d5832125265 (patch)
treef518a4cd92cb0efed553734c3a62dd74a2b22135 /mark.c
parenta60d2568b1a2c657c49ee2852cbed2f57568dbfa (diff)
downloadbdwgc-56c8a56f2735b5a2ab50bedbd61a8d5832125265.tar.gz
Review 'disclaim' add-on partially; fix code in some places again
Diffstat (limited to 'mark.c')
-rw-r--r--mark.c39
1 files changed, 20 insertions, 19 deletions
diff --git a/mark.c b/mark.c
index 14e6afec..2ea24b9a 100644
--- a/mark.c
+++ b/mark.c
@@ -51,26 +51,26 @@ GC_INNER unsigned GC_n_mark_procs = GC_RESERVED_MARK_PROCS;
/* It's done here, since we need to deal with mark descriptors. */
GC_INNER struct obj_kind GC_obj_kinds[MAXOBJKINDS] = {
/* PTRFREE */ { &GC_aobjfreelist[0], 0 /* filled in dynamically */,
- 0 | GC_DS_LENGTH, FALSE, FALSE,
- OK_DISCLAIM_INITZ },
+ 0 | GC_DS_LENGTH, FALSE, FALSE
+ /*, */ OK_DISCLAIM_INITZ },
/* NORMAL */ { &GC_objfreelist[0], 0,
0 | GC_DS_LENGTH, /* Adjusted in GC_init for EXTRA_BYTES */
- TRUE /* add length to descr */, TRUE,
- OK_DISCLAIM_INITZ },
+ TRUE /* add length to descr */, TRUE
+ /*, */ OK_DISCLAIM_INITZ },
/* UNCOLLECTABLE */
{ &GC_uobjfreelist[0], 0,
- 0 | GC_DS_LENGTH, TRUE /* add length to descr */, TRUE,
- OK_DISCLAIM_INITZ },
+ 0 | GC_DS_LENGTH, TRUE /* add length to descr */, TRUE
+ /*, */ OK_DISCLAIM_INITZ },
# ifdef ATOMIC_UNCOLLECTABLE
/* AUNCOLLECTABLE */
{ &GC_auobjfreelist[0], 0,
- 0 | GC_DS_LENGTH, FALSE /* add length to descr */, FALSE,
- OK_DISCLAIM_INITZ },
+ 0 | GC_DS_LENGTH, FALSE /* add length to descr */, FALSE
+ /*, */ OK_DISCLAIM_INITZ },
# endif
# ifdef STUBBORN_ALLOC
/*STUBBORN*/ { (void **)&GC_sobjfreelist[0], 0,
- 0 | GC_DS_LENGTH, TRUE /* add length to descr */, TRUE,
- OK_DISCLAIM_INITZ },
+ 0 | GC_DS_LENGTH, TRUE /* add length to descr */, TRUE
+ /*, */ OK_DISCLAIM_INITZ },
# endif
};
@@ -1764,7 +1764,7 @@ STATIC void GC_push_marked(struct hblk *h, hdr *hhdr)
}
}
-#ifdef MARK_UNCONDITIONALLY
+#ifdef ENABLE_DISCLAIM
/* Unconditionally mark from all objects which have not been reclaimed. */
/* This is useful in order to retain pointes which are reachable from */
/* the disclaim notifiers. */
@@ -1774,8 +1774,8 @@ STATIC void GC_push_marked(struct hblk *h, hdr *hhdr)
/* first word. On the other hand, a reclaimed object is a members of */
/* free-lists, and thus contains a word-aligned next-pointer as the */
/* first word. */
-void GC_push_unconditionally(struct hblk *h, hdr *hhdr)
-{
+ STATIC void GC_push_unconditionally(struct hblk *h, hdr *hhdr)
+ {
size_t sz = hhdr -> hb_sz;
word descr = hhdr -> hb_descr;
ptr_t p;
@@ -1783,8 +1783,9 @@ void GC_push_unconditionally(struct hblk *h, hdr *hhdr)
mse * GC_mark_stack_top_reg;
mse * mark_stack_limit = GC_mark_stack_limit;
- /* Shortcut */
- if ((0 | GC_DS_LENGTH) == descr) return;
+ if ((0 | GC_DS_LENGTH) == descr)
+ return;
+
GC_n_rescuing_pages++;
GC_objects_are_marked = TRUE;
if (sz > MAXOBJBYTES)
@@ -1797,8 +1798,8 @@ void GC_push_unconditionally(struct hblk *h, hdr *hhdr)
if ((*(GC_word *)p & 0x3) != 0)
PUSH_OBJ(p, hhdr, GC_mark_stack_top_reg, mark_stack_limit);
GC_mark_stack_top = GC_mark_stack_top_reg;
-}
-#endif
+ }
+#endif /* ENABLE_DISCLAIM */
#ifndef GC_DISABLE_INCREMENTAL
/* Test whether any page in the given block is dirty. */
@@ -1884,8 +1885,8 @@ STATIC struct hblk * GC_push_next_marked_uncollectable(struct hblk *h)
GC_push_marked(h, hhdr);
break;
}
-# ifdef MARK_UNCONDITIONALLY
- if (hhdr -> hb_flags & MARK_UNCONDITIONALLY) {
+# ifdef ENABLE_DISCLAIM
+ if ((hhdr -> hb_flags & MARK_UNCONDITIONALLY) != 0) {
GC_push_unconditionally(h, hhdr);
break;
}