Created
July 6, 2011 10:46
-
-
Save aragozin/1066988 to your computer and use it in GitHub Desktop.
OpenJDK GC patch, original code
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void ClearNoncleanCardWrapper::do_MemRegion(MemRegion mr) { | |
assert(mr.word_size() > 0, "Error"); | |
assert(_ct->is_aligned(mr.start()), "mr.start() should be card aligned"); | |
// mr.end() may not necessarily be card aligned. | |
jbyte* cur_entry = _ct->byte_for(mr.last()); | |
const jbyte* limit = _ct->byte_for(mr.start()); | |
HeapWord* end_of_non_clean = mr.end(); | |
HeapWord* start_of_non_clean = end_of_non_clean; | |
while (cur_entry >= limit) { | |
HeapWord* cur_hw = _ct->addr_for(cur_entry); | |
if ((*cur_entry != CardTableRS::clean_card_val()) && clear_card(cur_entry)) { | |
// Continue the dirty range by opening the | |
// dirty window one card to the left. | |
start_of_non_clean = cur_hw; | |
} else { | |
// We hit a "clean" card; process any non-empty | |
// "dirty" range accumulated so far. | |
if (start_of_non_clean < end_of_non_clean) { | |
const MemRegion mrd(start_of_non_clean, end_of_non_clean); | |
_dirty_card_closure->do_MemRegion(mrd); | |
} | |
// Reset the dirty window, while continuing to look | |
// for the next dirty card that will start a | |
// new dirty window. | |
end_of_non_clean = cur_hw; | |
start_of_non_clean = cur_hw; | |
} | |
// Note that "cur_entry" leads "start_of_non_clean" in | |
// its leftward excursion after this point | |
// in the loop and, when we hit the left end of "mr", | |
// will point off of the left end of the card-table | |
// for "mr". | |
cur_entry--; | |
} | |
// If the first card of "mr" was dirty, we will have | |
// been left with a dirty window, co-initial with "mr", | |
// which we now process. | |
if (start_of_non_clean < end_of_non_clean) { | |
const MemRegion mrd(start_of_non_clean, end_of_non_clean); | |
_dirty_card_closure->do_MemRegion(mrd); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment