--- a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp Tue Jan 10 20:02:41 2012 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp Tue Jan 10 18:58:13 2012 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -575,6 +575,40 @@
oops_in_mr_iterate(MemRegion(bottom(), saved_mark_word()), cl);
}
+void HeapRegion::note_self_forwarding_removal_start(bool during_initial_mark,
+ bool during_conc_mark) {
+ // We always recreate the prev marking info and we'll explicitly
+ // mark all objects we find to be self-forwarded on the prev
+ // bitmap. So all objects need to be below PTAMS.
+ _prev_top_at_mark_start = top();
+ _prev_marked_bytes = 0;
+
+ if (during_initial_mark) {
+ // During initial-mark, we'll also explicitly mark all objects
+ // we find to be self-forwarded on the next bitmap. So all
+ // objects need to be below NTAMS.
+ _next_top_at_mark_start = top();
+ set_top_at_conc_mark_count(bottom());
+ _next_marked_bytes = 0;
+ } else if (during_conc_mark) {
+ // During concurrent mark, all objects in the CSet (including
+ // the ones we find to be self-forwarded) are implicitly live.
+ // So all objects need to be above NTAMS.
+ _next_top_at_mark_start = bottom();
+ set_top_at_conc_mark_count(bottom());
+ _next_marked_bytes = 0;
+ }
+}
+
+void HeapRegion::note_self_forwarding_removal_end(bool during_initial_mark,
+ bool during_conc_mark,
+ size_t marked_bytes) {
+ assert(0 <= marked_bytes && marked_bytes <= used(),
+ err_msg("marked: "SIZE_FORMAT" used: "SIZE_FORMAT,
+ marked_bytes, used()));
+ _prev_marked_bytes = marked_bytes;
+}
+
HeapWord*
HeapRegion::object_iterate_mem_careful(MemRegion mr,
ObjectClosure* cl) {