src/share/vm/gc_implementation/parNew/parNewGeneration.cpp

changeset 548
ba764ed4b6f2
parent 441
73e96e5c30df
child 602
feeb96a45707
     1.1 --- a/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp	Fri Apr 11 09:56:35 2008 -0400
     1.2 +++ b/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp	Sun Apr 13 17:43:42 2008 -0400
     1.3 @@ -104,16 +104,15 @@
     1.4      // must be removed.
     1.5      arrayOop(old)->set_length(end);
     1.6    }
     1.7 +
     1.8    // process our set of indices (include header in first chunk)
     1.9 -  oop* start_addr = start == 0 ? (oop*)obj : obj->obj_at_addr(start);
    1.10 -  oop* end_addr   = obj->base() + end; // obj_at_addr(end) asserts end < length
    1.11 -  MemRegion mr((HeapWord*)start_addr, (HeapWord*)end_addr);
    1.12 +  // should make sure end is even (aligned to HeapWord in case of compressed oops)
    1.13    if ((HeapWord *)obj < young_old_boundary()) {
    1.14      // object is in to_space
    1.15 -    obj->oop_iterate(&_to_space_closure, mr);
    1.16 +    obj->oop_iterate_range(&_to_space_closure, start, end);
    1.17    } else {
    1.18      // object is in old generation
    1.19 -    obj->oop_iterate(&_old_gen_closure, mr);
    1.20 +    obj->oop_iterate_range(&_old_gen_closure, start, end);
    1.21    }
    1.22  }
    1.23  
    1.24 @@ -319,7 +318,6 @@
    1.25    }
    1.26  }
    1.27  
    1.28 -
    1.29  ParScanClosure::ParScanClosure(ParNewGeneration* g,
    1.30                                 ParScanThreadState* par_scan_state) :
    1.31    OopsInGenClosure(g), _par_scan_state(par_scan_state), _g(g)
    1.32 @@ -328,11 +326,25 @@
    1.33    _boundary = _g->reserved().end();
    1.34  }
    1.35  
    1.36 +void ParScanWithBarrierClosure::do_oop(oop* p)       { ParScanClosure::do_oop_work(p, true, false); }
    1.37 +void ParScanWithBarrierClosure::do_oop(narrowOop* p) { ParScanClosure::do_oop_work(p, true, false); }
    1.38 +
    1.39 +void ParScanWithoutBarrierClosure::do_oop(oop* p)       { ParScanClosure::do_oop_work(p, false, false); }
    1.40 +void ParScanWithoutBarrierClosure::do_oop(narrowOop* p) { ParScanClosure::do_oop_work(p, false, false); }
    1.41 +
    1.42 +void ParRootScanWithBarrierTwoGensClosure::do_oop(oop* p)       { ParScanClosure::do_oop_work(p, true, true); }
    1.43 +void ParRootScanWithBarrierTwoGensClosure::do_oop(narrowOop* p) { ParScanClosure::do_oop_work(p, true, true); }
    1.44 +
    1.45 +void ParRootScanWithoutBarrierClosure::do_oop(oop* p)       { ParScanClosure::do_oop_work(p, false, true); }
    1.46 +void ParRootScanWithoutBarrierClosure::do_oop(narrowOop* p) { ParScanClosure::do_oop_work(p, false, true); }
    1.47 +
    1.48  ParScanWeakRefClosure::ParScanWeakRefClosure(ParNewGeneration* g,
    1.49                                               ParScanThreadState* par_scan_state)
    1.50    : ScanWeakRefClosure(g), _par_scan_state(par_scan_state)
    1.51 -{
    1.52 -}
    1.53 +{}
    1.54 +
    1.55 +void ParScanWeakRefClosure::do_oop(oop* p)       { ParScanWeakRefClosure::do_oop_work(p); }
    1.56 +void ParScanWeakRefClosure::do_oop(narrowOop* p) { ParScanWeakRefClosure::do_oop_work(p); }
    1.57  
    1.58  #ifdef WIN32
    1.59  #pragma warning(disable: 4786) /* identifier was truncated to '255' characters in the browser information */
    1.60 @@ -475,51 +487,66 @@
    1.61  ParKeepAliveClosure::ParKeepAliveClosure(ParScanWeakRefClosure* cl) :
    1.62    DefNewGeneration::KeepAliveClosure(cl), _par_cl(cl) {}
    1.63  
    1.64 -void
    1.65 -// ParNewGeneration::
    1.66 -ParKeepAliveClosure::do_oop(oop* p) {
    1.67 -  // We never expect to see a null reference being processed
    1.68 -  // as a weak reference.
    1.69 -  assert (*p != NULL, "expected non-null ref");
    1.70 -  assert ((*p)->is_oop(), "expected an oop while scanning weak refs");
    1.71 +template <class T>
    1.72 +void /*ParNewGeneration::*/ParKeepAliveClosure::do_oop_work(T* p) {
    1.73 +#ifdef ASSERT
    1.74 +  {
    1.75 +    assert(!oopDesc::is_null(*p), "expected non-null ref");
    1.76 +    oop obj = oopDesc::load_decode_heap_oop_not_null(p);
    1.77 +    // We never expect to see a null reference being processed
    1.78 +    // as a weak reference.
    1.79 +    assert(obj->is_oop(), "expected an oop while scanning weak refs");
    1.80 +  }
    1.81 +#endif // ASSERT
    1.82  
    1.83    _par_cl->do_oop_nv(p);
    1.84  
    1.85    if (Universe::heap()->is_in_reserved(p)) {
    1.86 -    _rs->write_ref_field_gc_par(p, *p);
    1.87 +    oop obj = oopDesc::load_decode_heap_oop_not_null(p);
    1.88 +    _rs->write_ref_field_gc_par(p, obj);
    1.89    }
    1.90  }
    1.91  
    1.92 +void /*ParNewGeneration::*/ParKeepAliveClosure::do_oop(oop* p)       { ParKeepAliveClosure::do_oop_work(p); }
    1.93 +void /*ParNewGeneration::*/ParKeepAliveClosure::do_oop(narrowOop* p) { ParKeepAliveClosure::do_oop_work(p); }
    1.94 +
    1.95  // ParNewGeneration::
    1.96  KeepAliveClosure::KeepAliveClosure(ScanWeakRefClosure* cl) :
    1.97    DefNewGeneration::KeepAliveClosure(cl) {}
    1.98  
    1.99 -void
   1.100 -// ParNewGeneration::
   1.101 -KeepAliveClosure::do_oop(oop* p) {
   1.102 -  // We never expect to see a null reference being processed
   1.103 -  // as a weak reference.
   1.104 -  assert (*p != NULL, "expected non-null ref");
   1.105 -  assert ((*p)->is_oop(), "expected an oop while scanning weak refs");
   1.106 +template <class T>
   1.107 +void /*ParNewGeneration::*/KeepAliveClosure::do_oop_work(T* p) {
   1.108 +#ifdef ASSERT
   1.109 +  {
   1.110 +    assert(!oopDesc::is_null(*p), "expected non-null ref");
   1.111 +    oop obj = oopDesc::load_decode_heap_oop_not_null(p);
   1.112 +    // We never expect to see a null reference being processed
   1.113 +    // as a weak reference.
   1.114 +    assert(obj->is_oop(), "expected an oop while scanning weak refs");
   1.115 +  }
   1.116 +#endif // ASSERT
   1.117  
   1.118    _cl->do_oop_nv(p);
   1.119  
   1.120    if (Universe::heap()->is_in_reserved(p)) {
   1.121 -    _rs->write_ref_field_gc_par(p, *p);
   1.122 +    oop obj = oopDesc::load_decode_heap_oop_not_null(p);
   1.123 +    _rs->write_ref_field_gc_par(p, obj);
   1.124    }
   1.125  }
   1.126  
   1.127 -void ScanClosureWithParBarrier::do_oop(oop* p) {
   1.128 -  oop obj = *p;
   1.129 -  // Should we copy the obj?
   1.130 -  if (obj != NULL) {
   1.131 +void /*ParNewGeneration::*/KeepAliveClosure::do_oop(oop* p)       { KeepAliveClosure::do_oop_work(p); }
   1.132 +void /*ParNewGeneration::*/KeepAliveClosure::do_oop(narrowOop* p) { KeepAliveClosure::do_oop_work(p); }
   1.133 +
   1.134 +template <class T> void ScanClosureWithParBarrier::do_oop_work(T* p) {
   1.135 +  T heap_oop = oopDesc::load_heap_oop(p);
   1.136 +  if (!oopDesc::is_null(heap_oop)) {
   1.137 +    oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
   1.138      if ((HeapWord*)obj < _boundary) {
   1.139        assert(!_g->to()->is_in_reserved(obj), "Scanning field twice?");
   1.140 -      if (obj->is_forwarded()) {
   1.141 -        *p = obj->forwardee();
   1.142 -      } else {
   1.143 -        *p = _g->DefNewGeneration::copy_to_survivor_space(obj, p);
   1.144 -      }
   1.145 +      oop new_obj = obj->is_forwarded()
   1.146 +                      ? obj->forwardee()
   1.147 +                      : _g->DefNewGeneration::copy_to_survivor_space(obj);
   1.148 +      oopDesc::encode_store_heap_oop_not_null(p, new_obj);
   1.149      }
   1.150      if (_gc_barrier) {
   1.151        // If p points to a younger generation, mark the card.
   1.152 @@ -530,6 +557,9 @@
   1.153    }
   1.154  }
   1.155  
   1.156 +void ScanClosureWithParBarrier::do_oop(oop* p)       { ScanClosureWithParBarrier::do_oop_work(p); }
   1.157 +void ScanClosureWithParBarrier::do_oop(narrowOop* p) { ScanClosureWithParBarrier::do_oop_work(p); }
   1.158 +
   1.159  class ParNewRefProcTaskProxy: public AbstractGangTask {
   1.160    typedef AbstractRefProcTaskExecutor::ProcessTask ProcessTask;
   1.161  public:

mercurial