--- a/hotspot/src/share/vm/memory/cardTableModRefBS.hpp Mon Mar 09 13:34:00 2009 -0700
+++ b/hotspot/src/share/vm/memory/cardTableModRefBS.hpp Thu Mar 12 18:16:36 2009 -0700
@@ -52,11 +52,15 @@
enum CardValues {
clean_card = -1,
+ // The mask contains zeros in places for all other values.
+ clean_card_mask = clean_card - 31,
+
dirty_card = 0,
precleaned_card = 1,
- claimed_card = 3,
- last_card = 4,
- CT_MR_BS_last_reserved = 10
+ claimed_card = 2,
+ deferred_card = 4,
+ last_card = 8,
+ CT_MR_BS_last_reserved = 16
};
// dirty and precleaned are equivalent wrt younger_refs_iter.
@@ -254,9 +258,11 @@
};
static int clean_card_val() { return clean_card; }
+ static int clean_card_mask_val() { return clean_card_mask; }
static int dirty_card_val() { return dirty_card; }
static int claimed_card_val() { return claimed_card; }
static int precleaned_card_val() { return precleaned_card; }
+ static int deferred_card_val() { return deferred_card; }
// For RTTI simulation.
bool is_a(BarrierSet::Name bsn) {
@@ -329,7 +335,8 @@
}
bool is_card_claimed(size_t card_index) {
- return _byte_map[card_index] == claimed_card_val();
+ jbyte val = _byte_map[card_index];
+ return (val & (clean_card_mask_val() | claimed_card_val())) == claimed_card_val();
}
bool claim_card(size_t card_index);
@@ -338,6 +345,13 @@
return _byte_map[card_index] == clean_card_val();
}
+ bool is_card_deferred(size_t card_index) {
+ jbyte val = _byte_map[card_index];
+ return (val & (clean_card_mask_val() | deferred_card_val())) == deferred_card_val();
+ }
+
+ bool mark_card_deferred(size_t card_index);
+
// Card marking array base (adjusted for heap low boundary)
// This would be the 0th element of _byte_map, if the heap started at 0x0.
// But since the heap starts at some higher address, this points to somewhere
@@ -434,6 +448,10 @@
return byte_for(p) - _byte_map;
}
+ const jbyte* byte_for_index(const size_t card_index) const {
+ return _byte_map + card_index;
+ }
+
void verify();
void verify_guard();