hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp
changeset 360 21d113ecbf6a
parent 1 489c9b5090e2
child 971 f0b20be4165d
child 670 ddf3e9583f2f
equal deleted inserted replaced
357:f4edb0d9f109 360:21d113ecbf6a
    63     _to_space = heap->young_gen()->to_space();
    63     _to_space = heap->young_gen()->to_space();
    64 
    64 
    65     assert(_promotion_manager != NULL, "Sanity");
    65     assert(_promotion_manager != NULL, "Sanity");
    66   }
    66   }
    67 
    67 
    68   void do_oop(oop* p) {
    68   template <class T> void do_oop_work(T* p) {
    69     assert (*p != NULL, "expected non-null ref");
    69     assert (!oopDesc::is_null(*p), "expected non-null ref");
    70     assert ((*p)->is_oop(), "expected an oop while scanning weak refs");
    70     assert ((oopDesc::load_decode_heap_oop_not_null(p))->is_oop(),
    71 
    71             "expected an oop while scanning weak refs");
    72     oop obj = oop(*p);
    72 
    73     // Weak refs may be visited more than once.
    73     // Weak refs may be visited more than once.
    74     if (PSScavenge::should_scavenge(obj, _to_space)) {
    74     if (PSScavenge::should_scavenge(p, _to_space)) {
    75       PSScavenge::copy_and_push_safe_barrier(_promotion_manager, p);
    75       PSScavenge::copy_and_push_safe_barrier(_promotion_manager, p);
    76     }
    76     }
    77   }
    77   }
       
    78   virtual void do_oop(oop* p)       { PSKeepAliveClosure::do_oop_work(p); }
       
    79   virtual void do_oop(narrowOop* p) { PSKeepAliveClosure::do_oop_work(p); }
    78 };
    80 };
    79 
    81 
    80 class PSEvacuateFollowersClosure: public VoidClosure {
    82 class PSEvacuateFollowersClosure: public VoidClosure {
    81  private:
    83  private:
    82   PSPromotionManager* _promotion_manager;
    84   PSPromotionManager* _promotion_manager;
    83  public:
    85  public:
    84   PSEvacuateFollowersClosure(PSPromotionManager* pm) : _promotion_manager(pm) {}
    86   PSEvacuateFollowersClosure(PSPromotionManager* pm) : _promotion_manager(pm) {}
    85 
    87 
    86   void do_void() {
    88   virtual void do_void() {
    87     assert(_promotion_manager != NULL, "Sanity");
    89     assert(_promotion_manager != NULL, "Sanity");
    88     _promotion_manager->drain_stacks(true);
    90     _promotion_manager->drain_stacks(true);
    89     guarantee(_promotion_manager->stacks_empty(),
    91     guarantee(_promotion_manager->stacks_empty(),
    90               "stacks should be empty at this point");
    92               "stacks should be empty at this point");
    91   }
    93   }