src/hotspot/share/gc/shared/modRefBarrierSet.hpp
changeset 47998 fb0275c320a0
parent 47658 c2b7fb8e5144
child 48961 120b61d50f85
equal deleted inserted replaced
47997:55c43e677ded 47998:fb0275c320a0
    24 
    24 
    25 #ifndef SHARE_VM_GC_SHARED_MODREFBARRIERSET_HPP
    25 #ifndef SHARE_VM_GC_SHARED_MODREFBARRIERSET_HPP
    26 #define SHARE_VM_GC_SHARED_MODREFBARRIERSET_HPP
    26 #define SHARE_VM_GC_SHARED_MODREFBARRIERSET_HPP
    27 
    27 
    28 #include "gc/shared/barrierSet.hpp"
    28 #include "gc/shared/barrierSet.hpp"
       
    29 #include "memory/memRegion.hpp"
    29 
    30 
    30 // This kind of "BarrierSet" allows a "CollectedHeap" to detect and
    31 class Klass;
    31 // enumerate ref fields that have been modified (since the last
       
    32 // enumeration), using a card table.
       
    33 
       
    34 class OopClosure;
       
    35 class Generation;
       
    36 
    32 
    37 class ModRefBarrierSet: public BarrierSet {
    33 class ModRefBarrierSet: public BarrierSet {
    38 protected:
    34 protected:
    39   ModRefBarrierSet(const BarrierSet::FakeRtti& fake_rtti)
    35   ModRefBarrierSet(const BarrierSet::FakeRtti& fake_rtti)
    40     : BarrierSet(fake_rtti.add_tag(BarrierSet::ModRef)) { }
    36     : BarrierSet(fake_rtti.add_tag(BarrierSet::ModRef)) { }
    41   ~ModRefBarrierSet() { }
    37   ~ModRefBarrierSet() { }
    42 
    38 
    43 public:
    39 public:
       
    40   template <DecoratorSet decorators, typename T>
       
    41   inline void write_ref_field_pre(T* addr) {}
       
    42 
       
    43   template <DecoratorSet decorators, typename T>
       
    44   inline void write_ref_field_post(T *addr, oop new_value) {}
       
    45 
    44   // Causes all refs in "mr" to be assumed to be modified.
    46   // Causes all refs in "mr" to be assumed to be modified.
    45   virtual void invalidate(MemRegion mr) = 0;
    47   virtual void invalidate(MemRegion mr) = 0;
    46 
    48 
    47   // The caller guarantees that "mr" contains no references.  (Perhaps it's
    49   // The caller guarantees that "mr" contains no references.  (Perhaps it's
    48   // objects have been moved elsewhere.)
    50   // objects have been moved elsewhere.)
    49   virtual void clear(MemRegion mr) = 0;
    51   virtual void clear(MemRegion mr) = 0;
       
    52 
       
    53   // The ModRef abstraction introduces pre and post barriers
       
    54   template <DecoratorSet decorators, typename BarrierSetT>
       
    55   class AccessBarrier: public BarrierSet::AccessBarrier<decorators, BarrierSetT> {
       
    56     typedef BarrierSet::AccessBarrier<decorators, BarrierSetT> Raw;
       
    57 
       
    58   public:
       
    59     template <typename T>
       
    60     static void oop_store_in_heap(T* addr, oop value);
       
    61     template <typename T>
       
    62     static oop oop_atomic_cmpxchg_in_heap(oop new_value, T* addr, oop compare_value);
       
    63     template <typename T>
       
    64     static oop oop_atomic_xchg_in_heap(oop new_value, T* addr);
       
    65 
       
    66     template <typename T>
       
    67     static bool oop_arraycopy_in_heap(arrayOop src_obj, arrayOop dst_obj, T* src, T* dst, size_t length);
       
    68 
       
    69     static void clone_in_heap(oop src, oop dst, size_t size);
       
    70 
       
    71     static void oop_store_in_heap_at(oop base, ptrdiff_t offset, oop value) {
       
    72       oop_store_in_heap(AccessInternal::oop_field_addr<decorators>(base, offset), value);
       
    73     }
       
    74 
       
    75     static oop oop_atomic_xchg_in_heap_at(oop new_value, oop base, ptrdiff_t offset) {
       
    76       return oop_atomic_xchg_in_heap(new_value, AccessInternal::oop_field_addr<decorators>(base, offset));
       
    77     }
       
    78 
       
    79     static oop oop_atomic_cmpxchg_in_heap_at(oop new_value, oop base, ptrdiff_t offset, oop compare_value) {
       
    80       return oop_atomic_cmpxchg_in_heap(new_value, AccessInternal::oop_field_addr<decorators>(base, offset), compare_value);
       
    81     }
       
    82   };
    50 };
    83 };
    51 
    84 
    52 template<>
    85 template<>
    53 struct BarrierSet::GetName<ModRefBarrierSet> {
    86 struct BarrierSet::GetName<ModRefBarrierSet> {
    54   static const BarrierSet::Name value = BarrierSet::ModRef;
    87   static const BarrierSet::Name value = BarrierSet::ModRef;