src/hotspot/share/gc/shared/barrierSet.hpp
changeset 49906 4bb58f644e4e
parent 49752 93d84f667d12
child 50180 ffa644980dff
child 56508 f67f588ebf15
equal deleted inserted replaced
49905:a09af8ef8e5c 49906:4bb58f644e4e
    31 #include "oops/accessBackend.hpp"
    31 #include "oops/accessBackend.hpp"
    32 #include "oops/oopsHierarchy.hpp"
    32 #include "oops/oopsHierarchy.hpp"
    33 #include "utilities/fakeRttiSupport.hpp"
    33 #include "utilities/fakeRttiSupport.hpp"
    34 #include "utilities/macros.hpp"
    34 #include "utilities/macros.hpp"
    35 
    35 
       
    36 class BarrierSetAssembler;
       
    37 class BarrierSetC1;
    36 class JavaThread;
    38 class JavaThread;
    37 class BarrierSetAssembler;
       
    38 
    39 
    39 // This class provides the interface between a barrier implementation and
    40 // This class provides the interface between a barrier implementation and
    40 // the rest of the system.
    41 // the rest of the system.
    41 
    42 
    42 class BarrierSet: public CHeapObj<mtGC> {
    43 class BarrierSet: public CHeapObj<mtGC> {
    66   typedef FakeRttiSupport<BarrierSet, Name> FakeRtti;
    67   typedef FakeRttiSupport<BarrierSet, Name> FakeRtti;
    67 
    68 
    68 private:
    69 private:
    69   FakeRtti _fake_rtti;
    70   FakeRtti _fake_rtti;
    70   BarrierSetAssembler* _barrier_set_assembler;
    71   BarrierSetAssembler* _barrier_set_assembler;
       
    72   BarrierSetC1* _barrier_set_c1;
    71 
    73 
    72 public:
    74 public:
    73   // Metafunction mapping a class derived from BarrierSet to the
    75   // Metafunction mapping a class derived from BarrierSet to the
    74   // corresponding Name enum tag.
    76   // corresponding Name enum tag.
    75   template<typename T> struct GetName;
    77   template<typename T> struct GetName;
    86   bool is_a(BarrierSet::Name bsn) const { return _fake_rtti.has_tag(bsn); }
    88   bool is_a(BarrierSet::Name bsn) const { return _fake_rtti.has_tag(bsn); }
    87 
    89 
    88   // End of fake RTTI support.
    90   // End of fake RTTI support.
    89 
    91 
    90 protected:
    92 protected:
    91   BarrierSet(BarrierSetAssembler* barrier_set_assembler, const FakeRtti& fake_rtti) :
    93   BarrierSet(BarrierSetAssembler* barrier_set_assembler,
       
    94              BarrierSetC1* barrier_set_c1,
       
    95              const FakeRtti& fake_rtti) :
    92     _fake_rtti(fake_rtti),
    96     _fake_rtti(fake_rtti),
    93     _barrier_set_assembler(barrier_set_assembler) { }
    97     _barrier_set_assembler(barrier_set_assembler),
       
    98     _barrier_set_c1(barrier_set_c1) {}
    94   ~BarrierSet() { }
    99   ~BarrierSet() { }
    95 
   100 
    96   template <class BarrierSetAssemblerT>
   101   template <class BarrierSetAssemblerT>
    97   BarrierSetAssembler* make_barrier_set_assembler() {
   102   BarrierSetAssembler* make_barrier_set_assembler() {
    98     return NOT_ZERO(new BarrierSetAssemblerT()) ZERO_ONLY(NULL);
   103     return NOT_ZERO(new BarrierSetAssemblerT()) ZERO_ONLY(NULL);
       
   104   }
       
   105 
       
   106   template <class BarrierSetC1T>
       
   107   BarrierSetC1* make_barrier_set_c1() {
       
   108     return COMPILER1_PRESENT(new BarrierSetC1T()) NOT_COMPILER1(NULL);
    99   }
   109   }
   100 
   110 
   101 public:
   111 public:
   102   // Support for optimizing compilers to call the barrier set on slow path allocations
   112   // Support for optimizing compilers to call the barrier set on slow path allocations
   103   // that did not enter a TLAB. Used for e.g. ReduceInitialCardMarks.
   113   // that did not enter a TLAB. Used for e.g. ReduceInitialCardMarks.
   119   static void set_barrier_set(BarrierSet* barrier_set);
   129   static void set_barrier_set(BarrierSet* barrier_set);
   120 
   130 
   121   BarrierSetAssembler* barrier_set_assembler() {
   131   BarrierSetAssembler* barrier_set_assembler() {
   122     assert(_barrier_set_assembler != NULL, "should be set");
   132     assert(_barrier_set_assembler != NULL, "should be set");
   123     return _barrier_set_assembler;
   133     return _barrier_set_assembler;
       
   134   }
       
   135 
       
   136   BarrierSetC1* barrier_set_c1() {
       
   137     assert(_barrier_set_c1 != NULL, "should be set");
       
   138     return _barrier_set_c1;
   124   }
   139   }
   125 
   140 
   126   // The AccessBarrier of a BarrierSet subclass is called by the Access API
   141   // The AccessBarrier of a BarrierSet subclass is called by the Access API
   127   // (cf. oops/access.hpp) to perform decorated accesses. GC implementations
   142   // (cf. oops/access.hpp) to perform decorated accesses. GC implementations
   128   // may override these default access operations by declaring an
   143   // may override these default access operations by declaring an