hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.inline.hpp
changeset 25889 221296ac4359
parent 25492 d27050bdfb04
child 28213 b0bf57cd1e9d
equal deleted inserted replaced
25730:7eb4e685f739 25889:221296ac4359
    42 
    42 
    43 template <class T>
    43 template <class T>
    44 inline void FilterIntoCSClosure::do_oop_nv(T* p) {
    44 inline void FilterIntoCSClosure::do_oop_nv(T* p) {
    45   T heap_oop = oopDesc::load_heap_oop(p);
    45   T heap_oop = oopDesc::load_heap_oop(p);
    46   if (!oopDesc::is_null(heap_oop) &&
    46   if (!oopDesc::is_null(heap_oop) &&
    47       _g1->obj_in_cs(oopDesc::decode_heap_oop_not_null(heap_oop))) {
    47       _g1->is_in_cset_or_humongous(oopDesc::decode_heap_oop_not_null(heap_oop))) {
    48     _oc->do_oop(p);
    48     _oc->do_oop(p);
    49   }
    49   }
    50 }
    50 }
    51 
    51 
    52 template <class T>
    52 template <class T>
    65 inline void G1ParScanClosure::do_oop_nv(T* p) {
    65 inline void G1ParScanClosure::do_oop_nv(T* p) {
    66   T heap_oop = oopDesc::load_heap_oop(p);
    66   T heap_oop = oopDesc::load_heap_oop(p);
    67 
    67 
    68   if (!oopDesc::is_null(heap_oop)) {
    68   if (!oopDesc::is_null(heap_oop)) {
    69     oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
    69     oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
    70     if (_g1->in_cset_fast_test(obj)) {
    70     G1CollectedHeap::in_cset_state_t state = _g1->in_cset_state(obj);
       
    71     if (state == G1CollectedHeap::InCSet) {
    71       // We're not going to even bother checking whether the object is
    72       // We're not going to even bother checking whether the object is
    72       // already forwarded or not, as this usually causes an immediate
    73       // already forwarded or not, as this usually causes an immediate
    73       // stall. We'll try to prefetch the object (for write, given that
    74       // stall. We'll try to prefetch the object (for write, given that
    74       // we might need to install the forwarding reference) and we'll
    75       // we might need to install the forwarding reference) and we'll
    75       // get back to it when pop it from the queue
    76       // get back to it when pop it from the queue
    84                  obj->forwardee() == oopDesc::load_decode_heap_oop(p)),
    85                  obj->forwardee() == oopDesc::load_decode_heap_oop(p)),
    85              "p should still be pointing to obj or to its forwardee");
    86              "p should still be pointing to obj or to its forwardee");
    86 
    87 
    87       _par_scan_state->push_on_queue(p);
    88       _par_scan_state->push_on_queue(p);
    88     } else {
    89     } else {
       
    90       if (state == G1CollectedHeap::IsHumongous) {
       
    91         _g1->set_humongous_is_live(obj);
       
    92       }
    89       _par_scan_state->update_rs(_from, p, _worker_id);
    93       _par_scan_state->update_rs(_from, p, _worker_id);
    90     }
    94     }
    91   }
    95   }
    92 }
    96 }
    93 
    97 
    95 inline void G1ParPushHeapRSClosure::do_oop_nv(T* p) {
    99 inline void G1ParPushHeapRSClosure::do_oop_nv(T* p) {
    96   T heap_oop = oopDesc::load_heap_oop(p);
   100   T heap_oop = oopDesc::load_heap_oop(p);
    97 
   101 
    98   if (!oopDesc::is_null(heap_oop)) {
   102   if (!oopDesc::is_null(heap_oop)) {
    99     oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
   103     oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
   100     if (_g1->in_cset_fast_test(obj)) {
   104     if (_g1->is_in_cset_or_humongous(obj)) {
   101       Prefetch::write(obj->mark_addr(), 0);
   105       Prefetch::write(obj->mark_addr(), 0);
   102       Prefetch::read(obj->mark_addr(), (HeapWordSize*2));
   106       Prefetch::read(obj->mark_addr(), (HeapWordSize*2));
   103 
   107 
   104       // Place on the references queue
   108       // Place on the references queue
   105       _par_scan_state->push_on_queue(p);
   109       _par_scan_state->push_on_queue(p);
       
   110     } else {
       
   111       assert(!_g1->obj_in_cs(obj), "checking");
   106     }
   112     }
   107   }
   113   }
   108 }
   114 }
   109 
   115 
   110 template <class T>
   116 template <class T>