--- old/src/share/vm/gc/shared/referenceProcessor.cpp 2017-04-25 16:45:12.091173901 +0200 +++ new/src/share/vm/gc/shared/referenceProcessor.cpp 2017-04-25 16:45:11.939173906 +0200 @@ -35,6 +35,7 @@ #include "memory/allocation.hpp" #include "memory/resourceArea.hpp" #include "oops/oop.inline.hpp" +#include "runtime/access.inline.hpp" #include "runtime/java.hpp" #include "runtime/jniHandles.hpp" @@ -326,16 +327,15 @@ assert(java_lang_ref_Reference::next(obj) == NULL, "Reference not active; should not be discovered"); // Self-loop next, so as to make Ref not active. - java_lang_ref_Reference::set_next_raw(obj, obj); + HeapAccess<>::oop_store_at(obj, java_lang_ref_Reference::next_offset, obj); if (next_d != obj) { - oopDesc::bs()->write_ref_field(java_lang_ref_Reference::discovered_addr(obj), next_d); + HeapAccess::oop_store_at(obj, java_lang_ref_Reference::discovered_offset, next_d); } else { // This is the last object. // Swap refs_list into pending list and set obj's // discovered to what we read from the pending list. oop old = Universe::swap_reference_pending_list(refs_list.head()); - java_lang_ref_Reference::set_discovered_raw(obj, old); // old may be NULL - oopDesc::bs()->write_ref_field(java_lang_ref_Reference::discovered_addr(obj), old); + HeapAccess<>::oop_store_at(obj, java_lang_ref_Reference::discovered_offset, old); } } } @@ -404,7 +404,7 @@ void DiscoveredListIterator::remove() { assert(_ref->is_oop(), "Dropping a bad reference"); - oop_store_raw(_discovered_addr, NULL); + BasicAccess<>::oop_store(_discovered_addr, oop(NULL)); // First _prev_next ref actually points into DiscoveredList (gross). oop new_next; @@ -419,13 +419,13 @@ // Remove Reference object from discovered list. Note that G1 does not need a // pre-barrier here because we know the Reference has already been found/marked, // that's how it ended up in the discovered list in the first place. - oop_store_raw(_prev_next, new_next); + BasicAccess<>::oop_store(_prev_next, new_next); NOT_PRODUCT(_removed++); _refs_list.dec_length(1); } void DiscoveredListIterator::clear_referent() { - oop_store_raw(_referent_addr, NULL); + BasicAccess<>::oop_store(_referent_addr, oop(NULL)); } // NOTE: process_phase*() are largely similar, and at a high level @@ -891,8 +891,8 @@ // The last ref must have its discovered field pointing to itself. oop next_discovered = (current_head != NULL) ? current_head : obj; - oop retest = oopDesc::atomic_compare_exchange_oop(next_discovered, discovered_addr, - NULL); + oop retest = HeapAccess::oop_cas(next_discovered, discovered_addr, oop(NULL)); + if (retest == NULL) { // This thread just won the right to enqueue the object. // We have separate lists for enqueueing, so no synchronization @@ -1050,7 +1050,7 @@ oop next_discovered = (current_head != NULL) ? current_head : obj; assert(discovered == NULL, "control point invariant"); - oop_store_raw(discovered_addr, next_discovered); + BasicAccess<>::oop_store(discovered_addr, next_discovered); list->set_head(obj); list->inc_length(1); @@ -1196,4 +1196,3 @@ ShouldNotReachHere(); return NULL; } -