diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2011-09-28 13:48:17 +0400 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2011-09-30 17:35:35 +0400 |
commit | 56c8a56f2735b5a2ab50bedbd61a8d5832125265 (patch) | |
tree | f518a4cd92cb0efed553734c3a62dd74a2b22135 /mark.c | |
parent | a60d2568b1a2c657c49ee2852cbed2f57568dbfa (diff) | |
download | bdwgc-56c8a56f2735b5a2ab50bedbd61a8d5832125265.tar.gz |
Review 'disclaim' add-on partially; fix code in some places again
Diffstat (limited to 'mark.c')
-rw-r--r-- | mark.c | 39 |
1 files changed, 20 insertions, 19 deletions
@@ -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; } |