hotspot/src/share/vm/gc_implementation/parNew/parOopClosures.hpp
changeset 360 21d113ecbf6a
parent 1 489c9b5090e2
child 5547 f4b087cbb361
equal deleted inserted replaced
357:f4edb0d9f109 360:21d113ecbf6a
    24 
    24 
    25 // Closures for ParNewGeneration
    25 // Closures for ParNewGeneration
    26 
    26 
    27 class ParScanThreadState;
    27 class ParScanThreadState;
    28 class ParNewGeneration;
    28 class ParNewGeneration;
    29 template<class E> class GenericTaskQueueSet;
    29 typedef OopTaskQueueSet ObjToScanQueueSet;
    30 typedef GenericTaskQueueSet<oop> ObjToScanQueueSet;
       
    31 class ParallelTaskTerminator;
    30 class ParallelTaskTerminator;
    32 
    31 
    33 class ParScanClosure: public OopsInGenClosure {
    32 class ParScanClosure: public OopsInGenClosure {
    34 protected:
    33  protected:
    35   ParScanThreadState* _par_scan_state;
    34   ParScanThreadState* _par_scan_state;
    36   ParNewGeneration* _g;
    35   ParNewGeneration*   _g;
    37   HeapWord* _boundary;
    36   HeapWord*           _boundary;
    38   void do_oop_work(oop* p,
    37   template <class T> void inline par_do_barrier(T* p);
    39                           bool gc_barrier,
    38   template <class T> void inline do_oop_work(T* p,
    40                           bool root_scan);
    39                                              bool gc_barrier,
    41 
    40                                              bool root_scan);
    42   void par_do_barrier(oop* p);
    41  public:
    43 
       
    44 public:
       
    45   ParScanClosure(ParNewGeneration* g, ParScanThreadState* par_scan_state);
    42   ParScanClosure(ParNewGeneration* g, ParScanThreadState* par_scan_state);
    46 };
    43 };
    47 
    44 
    48 class ParScanWithBarrierClosure: public ParScanClosure {
    45 class ParScanWithBarrierClosure: public ParScanClosure {
    49 public:
    46  public:
    50   void do_oop(oop* p)    { do_oop_work(p, true, false); }
       
    51   void do_oop_nv(oop* p) { do_oop_work(p, true, false); }
       
    52   ParScanWithBarrierClosure(ParNewGeneration* g,
    47   ParScanWithBarrierClosure(ParNewGeneration* g,
    53                             ParScanThreadState* par_scan_state) :
    48                             ParScanThreadState* par_scan_state) :
    54     ParScanClosure(g, par_scan_state) {}
    49     ParScanClosure(g, par_scan_state) {}
       
    50   virtual void do_oop(oop* p);
       
    51   virtual void do_oop(narrowOop* p);
       
    52   inline void do_oop_nv(oop* p);
       
    53   inline void do_oop_nv(narrowOop* p);
    55 };
    54 };
    56 
    55 
    57 class ParScanWithoutBarrierClosure: public ParScanClosure {
    56 class ParScanWithoutBarrierClosure: public ParScanClosure {
    58 public:
    57  public:
    59   ParScanWithoutBarrierClosure(ParNewGeneration* g,
    58   ParScanWithoutBarrierClosure(ParNewGeneration* g,
    60                                ParScanThreadState* par_scan_state) :
    59                                ParScanThreadState* par_scan_state) :
    61     ParScanClosure(g, par_scan_state) {}
    60     ParScanClosure(g, par_scan_state) {}
    62   void do_oop(oop* p)    { do_oop_work(p, false, false); }
    61   virtual void do_oop(oop* p);
    63   void do_oop_nv(oop* p) { do_oop_work(p, false, false); }
    62   virtual void do_oop(narrowOop* p);
       
    63   inline void do_oop_nv(oop* p);
       
    64   inline void do_oop_nv(narrowOop* p);
    64 };
    65 };
    65 
    66 
    66 class ParRootScanWithBarrierTwoGensClosure: public ParScanClosure {
    67 class ParRootScanWithBarrierTwoGensClosure: public ParScanClosure {
    67 public:
    68  public:
    68   ParRootScanWithBarrierTwoGensClosure(ParNewGeneration* g,
    69   ParRootScanWithBarrierTwoGensClosure(ParNewGeneration* g,
    69                                        ParScanThreadState* par_scan_state) :
    70                                        ParScanThreadState* par_scan_state) :
    70     ParScanClosure(g, par_scan_state) {}
    71     ParScanClosure(g, par_scan_state) {}
    71   void do_oop(oop* p) { do_oop_work(p, true, true); }
    72   virtual void do_oop(oop* p);
       
    73   virtual void do_oop(narrowOop* p);
    72 };
    74 };
    73 
    75 
    74 class ParRootScanWithoutBarrierClosure: public ParScanClosure {
    76 class ParRootScanWithoutBarrierClosure: public ParScanClosure {
    75 public:
    77  public:
    76   ParRootScanWithoutBarrierClosure(ParNewGeneration* g,
    78   ParRootScanWithoutBarrierClosure(ParNewGeneration* g,
    77                                    ParScanThreadState* par_scan_state) :
    79                                    ParScanThreadState* par_scan_state) :
    78     ParScanClosure(g, par_scan_state) {}
    80     ParScanClosure(g, par_scan_state) {}
    79   void do_oop(oop* p) { do_oop_work(p, false, true); }
    81   virtual void do_oop(oop* p);
       
    82   virtual void do_oop(narrowOop* p);
    80 };
    83 };
    81 
    84 
    82 class ParScanWeakRefClosure: public ScanWeakRefClosure {
    85 class ParScanWeakRefClosure: public ScanWeakRefClosure {
    83 protected:
    86  protected:
    84   ParScanThreadState* _par_scan_state;
    87   ParScanThreadState* _par_scan_state;
    85 public:
    88   template <class T> inline void do_oop_work(T* p);
       
    89  public:
    86   ParScanWeakRefClosure(ParNewGeneration* g,
    90   ParScanWeakRefClosure(ParNewGeneration* g,
    87                         ParScanThreadState* par_scan_state);
    91                         ParScanThreadState* par_scan_state);
    88   void do_oop(oop* p);
    92   virtual void do_oop(oop* p);
    89   void do_oop_nv(oop* p);
    93   virtual void do_oop(narrowOop* p);
       
    94   inline void do_oop_nv(oop* p);
       
    95   inline void do_oop_nv(narrowOop* p);
    90 };
    96 };
    91 
    97 
    92 class ParEvacuateFollowersClosure: public VoidClosure {
    98 class ParEvacuateFollowersClosure: public VoidClosure {
       
    99  private:
    93   ParScanThreadState* _par_scan_state;
   100   ParScanThreadState* _par_scan_state;
    94   ParScanThreadState* par_scan_state() { return _par_scan_state; }
   101   ParScanThreadState* par_scan_state() { return _par_scan_state; }
    95 
   102 
    96   // We want to preserve the specific types here (rather than "OopClosure")
   103   // We want to preserve the specific types here (rather than "OopClosure")
    97   // for later de-virtualization of do_oop calls.
   104   // for later de-virtualization of do_oop calls.
   119   ObjToScanQueueSet*  _task_queues;
   126   ObjToScanQueueSet*  _task_queues;
   120   ObjToScanQueueSet*  task_queues() { return _task_queues; }
   127   ObjToScanQueueSet*  task_queues() { return _task_queues; }
   121 
   128 
   122   ParallelTaskTerminator* _terminator;
   129   ParallelTaskTerminator* _terminator;
   123   ParallelTaskTerminator* terminator() { return _terminator; }
   130   ParallelTaskTerminator* terminator() { return _terminator; }
   124 
   131  public:
   125 public:
       
   126   ParEvacuateFollowersClosure(
   132   ParEvacuateFollowersClosure(
   127     ParScanThreadState* par_scan_state_,
   133     ParScanThreadState* par_scan_state_,
   128     ParScanWithoutBarrierClosure* to_space_closure_,
   134     ParScanWithoutBarrierClosure* to_space_closure_,
   129     ParScanWithBarrierClosure* old_gen_closure_,
   135     ParScanWithBarrierClosure* old_gen_closure_,
   130     ParRootScanWithoutBarrierClosure* to_space_root_closure_,
   136     ParRootScanWithoutBarrierClosure* to_space_root_closure_,
   131     ParNewGeneration* par_gen_,
   137     ParNewGeneration* par_gen_,
   132     ParRootScanWithBarrierTwoGensClosure* old_gen_root_closure_,
   138     ParRootScanWithBarrierTwoGensClosure* old_gen_root_closure_,
   133     ObjToScanQueueSet* task_queues_,
   139     ObjToScanQueueSet* task_queues_,
   134     ParallelTaskTerminator* terminator_);
   140     ParallelTaskTerminator* terminator_);
   135   void do_void();
   141   virtual void do_void();
   136 };
   142 };