--- a/hotspot/src/share/vm/gc_implementation/g1/sparsePRT.hpp Tue Feb 09 13:56:09 2010 -0800
+++ b/hotspot/src/share/vm/gc_implementation/g1/sparsePRT.hpp Thu Feb 11 15:52:19 2010 -0800
@@ -32,21 +32,28 @@
// insertions only enqueue old versions for deletions, but do not delete
// old versions synchronously.
-
class SparsePRTEntry: public CHeapObj {
public:
-
enum SomePublicConstants {
- CardsPerEntry = 4,
- NullEntry = -1
+ NullEntry = -1,
+ UnrollFactor = 4
};
-
private:
RegionIdx_t _region_ind;
int _next_index;
- CardIdx_t _cards[CardsPerEntry];
-
+ CardIdx_t _cards[1];
+ // WARNING: Don't put any data members beyond this line. Card array has, in fact, variable length.
+ // It should always be the last data member.
public:
+ // Returns the size of the entry, used for entry allocation.
+ static size_t size() { return sizeof(SparsePRTEntry) + sizeof(CardIdx_t) * (cards_num() - 1); }
+ // Returns the size of the card array.
+ static int cards_num() {
+ // The number of cards should be a multiple of 4, because that's our current
+ // unrolling factor.
+ static const int s = MAX2<int>(G1RSetSparseRegionEntries & ~(UnrollFactor - 1), UnrollFactor);
+ return s;
+ }
// Set the region_ind to the given value, and delete all cards.
inline void init(RegionIdx_t region_ind);
@@ -134,12 +141,15 @@
bool add_card(RegionIdx_t region_id, CardIdx_t card_index);
bool get_cards(RegionIdx_t region_id, CardIdx_t* cards);
+
bool delete_entry(RegionIdx_t region_id);
bool contains_card(RegionIdx_t region_id, CardIdx_t card_index) const;
void add_entry(SparsePRTEntry* e);
+ SparsePRTEntry* get_entry(RegionIdx_t region_id);
+
void clear();
size_t capacity() const { return _capacity; }
@@ -148,7 +158,7 @@
size_t occupied_cards() const { return _occupied_cards; }
size_t mem_size() const;
- SparsePRTEntry* entry(int i) const { return &_entries[i]; }
+ SparsePRTEntry* entry(int i) const { return (SparsePRTEntry*)((char*)_entries + SparsePRTEntry::size() * i); }
void print();
};
@@ -157,7 +167,7 @@
class RSHashTableIter VALUE_OBJ_CLASS_SPEC {
int _tbl_ind; // [-1, 0.._rsht->_capacity)
int _bl_ind; // [-1, 0.._rsht->_capacity)
- short _card_ind; // [0..CardsPerEntry)
+ short _card_ind; // [0..SparsePRTEntry::cards_num())
RSHashTable* _rsht;
size_t _heap_bot_card_ind;
@@ -176,7 +186,7 @@
RSHashTableIter(size_t heap_bot_card_ind) :
_tbl_ind(RSHashTable::NullEntry),
_bl_ind(RSHashTable::NullEntry),
- _card_ind((SparsePRTEntry::CardsPerEntry-1)),
+ _card_ind((SparsePRTEntry::cards_num() - 1)),
_rsht(NULL),
_heap_bot_card_ind(heap_bot_card_ind)
{}
@@ -185,7 +195,7 @@
_rsht = rsht;
_tbl_ind = -1; // So that first increment gets to 0.
_bl_ind = RSHashTable::NullEntry;
- _card_ind = (SparsePRTEntry::CardsPerEntry-1);
+ _card_ind = (SparsePRTEntry::cards_num() - 1);
}
bool has_next(size_t& card_index);
@@ -241,9 +251,13 @@
// If the table hold an entry for "region_ind", Copies its
// cards into "cards", which must be an array of length at least
- // "CardsPerEntry", and returns "true"; otherwise, returns "false".
+ // "SparePRTEntry::cards_num()", and returns "true"; otherwise,
+ // returns "false".
bool get_cards(RegionIdx_t region_ind, CardIdx_t* cards);
+ // Return the pointer to the entry associated with the given region.
+ SparsePRTEntry* get_entry(RegionIdx_t region_ind);
+
// If there is an entry for "region_ind", removes it and return "true";
// otherwise returns "false."
bool delete_entry(RegionIdx_t region_ind);