< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.inline.hpp

Print this page
rev 55317 : 8225483: Shenandoah: Enhance native access barrier


   8  * This code is distributed in the hope that it will be useful, but WITHOUT
   9  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  10  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  11  * version 2 for more details (a copy is included in the LICENSE file that
  12  * accompanied this code).
  13  *
  14  * You should have received a copy of the GNU General Public License version
  15  * 2 along with this work; if not, write to the Free Software Foundation,
  16  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  17  *
  18  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  19  * or visit www.oracle.com if you need additional information or have any
  20  * questions.
  21  *
  22  */
  23 
  24 #ifndef SHARE_GC_SHENANDOAH_SHENANDOAHBARRIERSET_INLINE_HPP
  25 #define SHARE_GC_SHENANDOAH_SHENANDOAHBARRIERSET_INLINE_HPP
  26 
  27 #include "gc/shared/barrierSet.hpp"

  28 #include "gc/shenandoah/shenandoahBarrierSet.hpp"
  29 #include "gc/shenandoah/shenandoahForwarding.inline.hpp"
  30 #include "gc/shenandoah/shenandoahHeap.inline.hpp"
  31 #include "gc/shenandoah/shenandoahHeapRegion.hpp"
  32 #include "gc/shenandoah/shenandoahMarkingContext.inline.hpp"
  33 #include "gc/shenandoah/shenandoahThreadLocalData.hpp"
  34 
  35 inline oop ShenandoahBarrierSet::resolve_forwarded_not_null(oop p) {
  36   return ShenandoahForwarding::get_forwardee(p);
  37 }
  38 
  39 inline oop ShenandoahBarrierSet::resolve_forwarded(oop p) {
  40   if (((HeapWord*) p) != NULL) {
  41     return resolve_forwarded_not_null(p);
  42   } else {
  43     return p;
  44   }
  45 }
  46 
  47 template <DecoratorSet decorators, typename BarrierSetT>
  48 template <typename T>
  49 inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_load_in_heap(T* addr) {
  50   oop value = Raw::oop_load_in_heap(addr);
  51   value = ShenandoahBarrierSet::barrier_set()->load_reference_barrier(value);
  52   keep_alive_if_weak(decorators, value);
  53   return value;
  54 }
  55 
  56 template <DecoratorSet decorators, typename BarrierSetT>
  57 inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_load_in_heap_at(oop base, ptrdiff_t offset) {
  58   oop value = Raw::oop_load_in_heap_at(base, offset);
  59   value = ShenandoahBarrierSet::barrier_set()->load_reference_barrier(value);
  60   keep_alive_if_weak(AccessBarrierSupport::resolve_possibly_unknown_oop_ref_strength<decorators>(base, offset), value);
  61   return value;
  62 }
  63 
  64 template <DecoratorSet decorators, typename BarrierSetT>
  65 template <typename T>
  66 inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_load_not_in_heap(T* addr) {
  67   oop value = Raw::oop_load_not_in_heap(addr);
  68   value = ShenandoahBarrierSet::barrier_set()->load_reference_barrier(value);










  69   keep_alive_if_weak(decorators, value);
  70   return value;
  71 }
  72 
  73 template <DecoratorSet decorators, typename BarrierSetT>
  74 template <typename T>
  75 inline void ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_store_in_heap(T* addr, oop value) {
  76   ShenandoahBarrierSet::barrier_set()->storeval_barrier(value);
  77   const bool keep_alive = (decorators & AS_NO_KEEPALIVE) == 0;
  78   if (keep_alive) {
  79     ShenandoahBarrierSet::barrier_set()->write_ref_field_pre_work(addr, value);
  80   }
  81   Raw::oop_store_in_heap(addr, value);
  82 }











  83 
  84 template <DecoratorSet decorators, typename BarrierSetT>
  85 inline void ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_store_in_heap_at(oop base, ptrdiff_t offset, oop value) {
  86   oop_store_in_heap(AccessInternal::oop_field_addr<decorators>(base, offset), value);
  87 }
  88 
  89 template <DecoratorSet decorators, typename BarrierSetT>
  90 template <typename T>
  91 inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_cmpxchg_not_in_heap(oop new_value, T* addr, oop compare_value) {
  92   oop res;
  93   oop expected = compare_value;
  94   do {
  95     compare_value = expected;
  96     res = Raw::oop_atomic_cmpxchg(new_value, addr, compare_value);
  97     expected = res;
  98   } while ((! oopDesc::equals_raw(compare_value, expected)) && oopDesc::equals_raw(resolve_forwarded(compare_value), resolve_forwarded(expected)));
  99   if (res != NULL) {
 100     return ShenandoahBarrierSet::barrier_set()->load_reference_barrier_not_null(res);
 101   } else {
 102     return res;




   8  * This code is distributed in the hope that it will be useful, but WITHOUT
   9  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  10  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  11  * version 2 for more details (a copy is included in the LICENSE file that
  12  * accompanied this code).
  13  *
  14  * You should have received a copy of the GNU General Public License version
  15  * 2 along with this work; if not, write to the Free Software Foundation,
  16  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  17  *
  18  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  19  * or visit www.oracle.com if you need additional information or have any
  20  * questions.
  21  *
  22  */
  23 
  24 #ifndef SHARE_GC_SHENANDOAH_SHENANDOAHBARRIERSET_INLINE_HPP
  25 #define SHARE_GC_SHENANDOAH_SHENANDOAHBARRIERSET_INLINE_HPP
  26 
  27 #include "gc/shared/barrierSet.hpp"
  28 #include "gc/shenandoah/shenandoahAsserts.hpp"
  29 #include "gc/shenandoah/shenandoahBarrierSet.hpp"
  30 #include "gc/shenandoah/shenandoahForwarding.inline.hpp"
  31 #include "gc/shenandoah/shenandoahHeap.inline.hpp"
  32 #include "gc/shenandoah/shenandoahHeapRegion.hpp"
  33 #include "gc/shenandoah/shenandoahMarkingContext.inline.hpp"
  34 #include "gc/shenandoah/shenandoahThreadLocalData.hpp"
  35 
  36 inline oop ShenandoahBarrierSet::resolve_forwarded_not_null(oop p) {
  37   return ShenandoahForwarding::get_forwardee(p);
  38 }
  39 
  40 inline oop ShenandoahBarrierSet::resolve_forwarded(oop p) {
  41   if (((HeapWord*) p) != NULL) {
  42     return resolve_forwarded_not_null(p);
  43   } else {
  44     return p;
  45   }
  46 }
  47 
  48 template <DecoratorSet decorators, typename BarrierSetT>
  49 template <typename T>
  50 inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_load_in_heap(T* addr) {
  51   oop value = Raw::oop_load_in_heap(addr);
  52   value = ShenandoahBarrierSet::barrier_set()->load_reference_barrier(value);
  53   keep_alive_if_weak(decorators, value);
  54   return value;
  55 }
  56 
  57 template <DecoratorSet decorators, typename BarrierSetT>
  58 inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_load_in_heap_at(oop base, ptrdiff_t offset) {
  59   oop value = Raw::oop_load_in_heap_at(base, offset);
  60   value = ShenandoahBarrierSet::barrier_set()->load_reference_barrier(value);
  61   keep_alive_if_weak(AccessBarrierSupport::resolve_possibly_unknown_oop_ref_strength<decorators>(base, offset), value);
  62   return value;
  63 }
  64 
  65 template <DecoratorSet decorators, typename BarrierSetT>
  66 template <typename T>
  67 inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_load_not_in_heap(T* addr) {
  68   oop value = Raw::oop_load_not_in_heap(addr);
  69   if (CompressedOops::is_null(value)) return value;
  70 
  71   ShenandoahHeap* const heap = ShenandoahHeap::heap();
  72   if (heap->is_evacuation_in_progress()) {
  73     ShenandoahMarkingContext* const marking_context = heap->complete_marking_context();
  74     if (!marking_context->is_marked(value)) {
  75       return NULL;
  76     }
  77   }
  78 
  79   value = ShenandoahBarrierSet::barrier_set()->load_reference_barrier_not_null(value);
  80   keep_alive_if_weak(decorators, value);
  81   return value;
  82 }
  83 
  84 template <DecoratorSet decorators, typename BarrierSetT>
  85 template <typename T>
  86 inline void ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_store_in_heap(T* addr, oop value) {
  87   ShenandoahBarrierSet::barrier_set()->storeval_barrier(value);
  88   const bool keep_alive = (decorators & AS_NO_KEEPALIVE) == 0;
  89   if (keep_alive) {
  90     ShenandoahBarrierSet::barrier_set()->write_ref_field_pre_work(addr, value);
  91   }
  92   Raw::oop_store_in_heap(addr, value);
  93 }
  94 
  95 #ifdef ASSERT
  96 template <DecoratorSet decorators, typename BarrierSetT>
  97 template <typename T>
  98 inline void ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_store_not_in_heap(T* addr, oop value) {
  99   ShenandoahHeap* const heap = ShenandoahHeap::heap();
 100   shenandoah_assert_marked_if(NULL, value, !CompressedOops::is_null(value) && heap->is_evacuation_in_progress());
 101 
 102   Raw::oop_store(addr, value);
 103 }
 104 #endif
 105 
 106 template <DecoratorSet decorators, typename BarrierSetT>
 107 inline void ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_store_in_heap_at(oop base, ptrdiff_t offset, oop value) {
 108   oop_store_in_heap(AccessInternal::oop_field_addr<decorators>(base, offset), value);
 109 }
 110 
 111 template <DecoratorSet decorators, typename BarrierSetT>
 112 template <typename T>
 113 inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_cmpxchg_not_in_heap(oop new_value, T* addr, oop compare_value) {
 114   oop res;
 115   oop expected = compare_value;
 116   do {
 117     compare_value = expected;
 118     res = Raw::oop_atomic_cmpxchg(new_value, addr, compare_value);
 119     expected = res;
 120   } while ((! oopDesc::equals_raw(compare_value, expected)) && oopDesc::equals_raw(resolve_forwarded(compare_value), resolve_forwarded(expected)));
 121   if (res != NULL) {
 122     return ShenandoahBarrierSet::barrier_set()->load_reference_barrier_not_null(res);
 123   } else {
 124     return res;


< prev index next >