src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp

changeset 548
ba764ed4b6f2
parent 435
a61af66fc99e
child 631
d1605aabd0a1
child 698
12eea04c8b06
     1.1 --- a/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp	Fri Apr 11 09:56:35 2008 -0400
     1.2 +++ b/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp	Sun Apr 13 17:43:42 2008 -0400
     1.3 @@ -65,16 +65,18 @@
     1.4      assert(_promotion_manager != NULL, "Sanity");
     1.5    }
     1.6  
     1.7 -  void do_oop(oop* p) {
     1.8 -    assert (*p != NULL, "expected non-null ref");
     1.9 -    assert ((*p)->is_oop(), "expected an oop while scanning weak refs");
    1.10 +  template <class T> void do_oop_work(T* p) {
    1.11 +    assert (!oopDesc::is_null(*p), "expected non-null ref");
    1.12 +    assert ((oopDesc::load_decode_heap_oop_not_null(p))->is_oop(),
    1.13 +            "expected an oop while scanning weak refs");
    1.14  
    1.15 -    oop obj = oop(*p);
    1.16      // Weak refs may be visited more than once.
    1.17 -    if (PSScavenge::should_scavenge(obj, _to_space)) {
    1.18 +    if (PSScavenge::should_scavenge(p, _to_space)) {
    1.19        PSScavenge::copy_and_push_safe_barrier(_promotion_manager, p);
    1.20      }
    1.21    }
    1.22 +  virtual void do_oop(oop* p)       { PSKeepAliveClosure::do_oop_work(p); }
    1.23 +  virtual void do_oop(narrowOop* p) { PSKeepAliveClosure::do_oop_work(p); }
    1.24  };
    1.25  
    1.26  class PSEvacuateFollowersClosure: public VoidClosure {
    1.27 @@ -83,7 +85,7 @@
    1.28   public:
    1.29    PSEvacuateFollowersClosure(PSPromotionManager* pm) : _promotion_manager(pm) {}
    1.30  
    1.31 -  void do_void() {
    1.32 +  virtual void do_void() {
    1.33      assert(_promotion_manager != NULL, "Sanity");
    1.34      _promotion_manager->drain_stacks(true);
    1.35      guarantee(_promotion_manager->stacks_empty(),

mercurial