--- old/src/share/vm/gc/parallel/cardTableExtension.cpp 2016-04-06 17:17:27.458383703 +0200 +++ new/src/share/vm/gc/parallel/cardTableExtension.cpp 2016-04-06 17:17:27.346383702 +0200 @@ -139,19 +139,19 @@ // It is a waste to get here if empty. assert(sp->bottom() < sp->top(), "Should not be called if empty"); oop* sp_top = (oop*)space_top; - jbyte* start_card = byte_for(sp->bottom()); - jbyte* end_card = byte_for(sp_top - 1) + 1; + volatile jbyte* start_card = byte_for(sp->bottom()); + volatile jbyte* end_card = byte_for(sp_top - 1) + 1; oop* last_scanned = NULL; // Prevent scanning objects more than once // The width of the stripe ssize*stripe_total must be // consistent with the number of stripes so that the complete slice // is covered. size_t slice_width = ssize * stripe_total; - for (jbyte* slice = start_card; slice < end_card; slice += slice_width) { - jbyte* worker_start_card = slice + stripe_number * ssize; + for (volatile jbyte* slice = start_card; slice < end_card; slice += slice_width) { + volatile jbyte* worker_start_card = slice + stripe_number * ssize; if (worker_start_card >= end_card) return; // We're done. - jbyte* worker_end_card = worker_start_card + ssize; + volatile jbyte* worker_end_card = worker_start_card + ssize; if (worker_end_card > end_card) worker_end_card = end_card; @@ -208,13 +208,13 @@ assert(worker_start_card <= end_card, "worker start card beyond end card"); assert(worker_end_card <= end_card, "worker end card beyond end card"); - jbyte* current_card = worker_start_card; + volatile jbyte* current_card = worker_start_card; while (current_card < worker_end_card) { // Find an unclean card. while (current_card < worker_end_card && card_is_clean(*current_card)) { current_card++; } - jbyte* first_unclean_card = current_card; + volatile jbyte* first_unclean_card = current_card; // Find the end of a run of contiguous unclean cards while (current_card < worker_end_card && !card_is_clean(*current_card)) { @@ -231,7 +231,7 @@ HeapWord* last_object_in_dirty_region = start_array->object_start(addr_for(current_card)-1); size_t size_of_last_object = oop(last_object_in_dirty_region)->size(); HeapWord* end_of_last_object = last_object_in_dirty_region + size_of_last_object; - jbyte* ending_card_of_last_object = byte_for(end_of_last_object); + volatile jbyte* ending_card_of_last_object = byte_for(end_of_last_object); assert(ending_card_of_last_object <= worker_end_card, "ending_card_of_last_object is greater than worker_end_card"); if (ending_card_of_last_object > current_card) { // This means the object spans the next complete card. @@ -240,7 +240,7 @@ } } } - jbyte* following_clean_card = current_card; + volatile jbyte* following_clean_card = current_card; if (first_unclean_card < worker_end_card) { oop* p = (oop*) start_array->object_start(addr_for(first_unclean_card)); @@ -346,8 +346,8 @@ CardTableExtension* card_table = barrier_set_cast(ParallelScavengeHeap::heap()->barrier_set()); - jbyte* bot = card_table->byte_for(mr.start()); - jbyte* top = card_table->byte_for(mr.end()); + volatile jbyte* bot = card_table->byte_for(mr.start()); + volatile jbyte* top = card_table->byte_for(mr.end()); while(bot <= top) { assert(*bot == clean_card || *bot == verify_card, "Found unwanted or unknown card mark"); if (*bot == verify_card) @@ -357,7 +357,7 @@ } bool CardTableExtension::addr_is_marked_imprecise(void *addr) { - jbyte* p = byte_for(addr); + volatile jbyte* p = byte_for(addr); jbyte val = *p; if (card_is_dirty(val)) @@ -376,7 +376,7 @@ // Also includes verify_card bool CardTableExtension::addr_is_marked_precise(void *addr) { - jbyte* p = byte_for(addr); + volatile jbyte* p = byte_for(addr); jbyte val = *p; if (card_is_newgen(val)) @@ -472,13 +472,13 @@ int ind = changed_region; log_trace(gc, barrier)("CardTableModRefBS::resize_covered_region: "); log_trace(gc, barrier)(" _covered[%d].start(): " INTPTR_FORMAT " _covered[%d].last(): " INTPTR_FORMAT, - ind, p2i(_covered[ind].start()), ind, p2i(_covered[ind].last())); + ind, p2i(_covered[ind].start()), ind, p2i(_covered[ind].last())); log_trace(gc, barrier)(" _committed[%d].start(): " INTPTR_FORMAT " _committed[%d].last(): " INTPTR_FORMAT, - ind, p2i(_committed[ind].start()), ind, p2i(_committed[ind].last())); + ind, p2i(_committed[ind].start()), ind, p2i(_committed[ind].last())); log_trace(gc, barrier)(" byte_for(start): " INTPTR_FORMAT " byte_for(last): " INTPTR_FORMAT, - p2i(byte_for(_covered[ind].start())), p2i(byte_for(_covered[ind].last()))); + p2i((jbyte*)byte_for(_covered[ind].start())), p2i((jbyte*)byte_for(_covered[ind].last()))); log_trace(gc, barrier)(" addr_for(start): " INTPTR_FORMAT " addr_for(last): " INTPTR_FORMAT, - p2i(addr_for((jbyte*) _committed[ind].start())), p2i(addr_for((jbyte*) _committed[ind].last()))); + p2i(addr_for((volatile jbyte*) _committed[ind].start())), p2i(addr_for((volatile jbyte*) _committed[ind].last()))); debug_only(verify_guard();) } @@ -510,7 +510,7 @@ "Starts should have proper alignment"); #endif - jbyte* new_start = byte_for(new_region.start()); + volatile jbyte* new_start = byte_for(new_region.start()); // Round down because this is for the start address HeapWord* new_start_aligned = (HeapWord*)align_size_down((uintptr_t)new_start, os::vm_page_size()); @@ -583,7 +583,7 @@ void CardTableExtension::resize_update_committed_table(int changed_region, MemRegion new_region) { - jbyte* new_start = byte_for(new_region.start()); + volatile jbyte* new_start = byte_for(new_region.start()); // Set the new start of the committed region HeapWord* new_start_aligned = (HeapWord*)align_size_down((uintptr_t)new_start, @@ -600,13 +600,13 @@ MemRegion original_covered = _covered[changed_region]; // Initialize the card entries. Only consider the // region covered by the card table (_whole_heap) - jbyte* entry; + volatile jbyte* entry; if (new_region.start() < _whole_heap.start()) { entry = byte_for(_whole_heap.start()); } else { entry = byte_for(new_region.start()); } - jbyte* end = byte_for(original_covered.start()); + volatile jbyte* end = byte_for(original_covered.start()); // If _whole_heap starts at the original covered regions start, // this loop will not execute. while (entry < end) { *entry++ = clean_card; }