< prev index next >

src/hotspot/share/gc/g1/g1OopClosures.inline.hpp

Print this page
rev 49290 : [mq]: JDK-8199735.01.patch
   1 /*
   2  * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #ifndef SHARE_VM_GC_G1_G1OOPCLOSURES_INLINE_HPP
  26 #define SHARE_VM_GC_G1_G1OOPCLOSURES_INLINE_HPP
  27 
  28 #include "gc/g1/g1CollectedHeap.hpp"
  29 #include "gc/g1/g1ConcurrentMark.inline.hpp"
  30 #include "gc/g1/g1OopClosures.hpp"
  31 #include "gc/g1/g1ParScanThreadState.inline.hpp"
  32 #include "gc/g1/g1RemSet.hpp"
  33 #include "gc/g1/heapRegion.inline.hpp"
  34 #include "gc/g1/heapRegionRemSet.hpp"
  35 #include "memory/iterator.inline.hpp"
  36 #include "oops/access.inline.hpp"

  37 #include "runtime/prefetch.inline.hpp"
  38 
  39 template <class T>
  40 inline void G1ScanClosureBase::prefetch_and_push(T* p, const oop obj) {
  41   // We're not going to even bother checking whether the object is
  42   // already forwarded or not, as this usually causes an immediate
  43   // stall. We'll try to prefetch the object (for write, given that
  44   // we might need to install the forwarding reference) and we'll
  45   // get back to it when pop it from the queue
  46   Prefetch::write(obj->mark_addr(), 0);
  47   Prefetch::read(obj->mark_addr(), (HeapWordSize*2));
  48 
  49   // slightly paranoid test; I'm trying to catch potential
  50   // problems before we go into push_on_queue to know where the
  51   // problem is coming from
  52   assert((obj == oopDesc::load_decode_heap_oop(p)) ||
  53          (obj->is_forwarded() &&
  54          obj->forwardee() == oopDesc::load_decode_heap_oop(p)),
  55          "p should still be pointing to obj or to its forwardee");
  56 
  57   _par_scan_state->push_on_queue(p);
  58 }
  59 
  60 template <class T>
  61 inline void G1ScanClosureBase::handle_non_cset_obj_common(InCSetState const state, T* p, oop const obj) {
  62   if (state.is_humongous()) {
  63     _g1->set_humongous_is_live(obj);
  64   }
  65 }
  66 
  67 template <class T>


 215 
 216   _cm->mark_in_next_bitmap(to_obj);
 217 }
 218 
 219 template <G1Barrier barrier, G1Mark do_mark_object>
 220 template <class T>
 221 void G1ParCopyClosure<barrier, do_mark_object>::do_oop_work(T* p) {
 222   T heap_oop = oopDesc::load_heap_oop(p);
 223 
 224   if (oopDesc::is_null(heap_oop)) {
 225     return;
 226   }
 227 
 228   oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
 229 
 230   assert(_worker_id == _par_scan_state->worker_id(), "sanity");
 231 
 232   const InCSetState state = _g1->in_cset_state(obj);
 233   if (state.is_in_cset()) {
 234     oop forwardee;
 235     markOop m = obj->mark();
 236     if (m->is_marked()) {
 237       forwardee = (oop) m->decode_pointer();
 238     } else {
 239       forwardee = _par_scan_state->copy_to_survivor_space(state, obj, m);
 240     }
 241     assert(forwardee != NULL, "forwardee should not be NULL");
 242     oopDesc::encode_store_heap_oop(p, forwardee);
 243     if (do_mark_object != G1MarkNone && forwardee != obj) {
 244       // If the object is self-forwarded we don't need to explicitly
 245       // mark it, the evacuation failure protocol will do so.
 246       mark_forwarded_object(obj, forwardee);
 247     }
 248 
 249     if (barrier == G1BarrierCLD) {
 250       do_cld_barrier(forwardee);
 251     }
 252   } else {
 253     if (state.is_humongous()) {
 254       _g1->set_humongous_is_live(obj);
 255     }
   1 /*
   2  * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #ifndef SHARE_VM_GC_G1_G1OOPCLOSURES_INLINE_HPP
  26 #define SHARE_VM_GC_G1_G1OOPCLOSURES_INLINE_HPP
  27 
  28 #include "gc/g1/g1CollectedHeap.hpp"
  29 #include "gc/g1/g1ConcurrentMark.inline.hpp"
  30 #include "gc/g1/g1OopClosures.hpp"
  31 #include "gc/g1/g1ParScanThreadState.inline.hpp"
  32 #include "gc/g1/g1RemSet.hpp"
  33 #include "gc/g1/heapRegion.inline.hpp"
  34 #include "gc/g1/heapRegionRemSet.hpp"
  35 #include "memory/iterator.inline.hpp"
  36 #include "oops/access.inline.hpp"
  37 #include "oops/oop.inline.hpp"
  38 #include "runtime/prefetch.inline.hpp"
  39 
  40 template <class T>
  41 inline void G1ScanClosureBase::prefetch_and_push(T* p, const oop obj) {
  42   // We're not going to even bother checking whether the object is
  43   // already forwarded or not, as this usually causes an immediate
  44   // stall. We'll try to prefetch the object (for write, given that
  45   // we might need to install the forwarding reference) and we'll
  46   // get back to it when pop it from the queue
  47   Prefetch::write(obj->mark_addr_raw(), 0);
  48   Prefetch::read(obj->mark_addr_raw(), (HeapWordSize*2));
  49 
  50   // slightly paranoid test; I'm trying to catch potential
  51   // problems before we go into push_on_queue to know where the
  52   // problem is coming from
  53   assert((obj == oopDesc::load_decode_heap_oop(p)) ||
  54          (obj->is_forwarded() &&
  55          obj->forwardee() == oopDesc::load_decode_heap_oop(p)),
  56          "p should still be pointing to obj or to its forwardee");
  57 
  58   _par_scan_state->push_on_queue(p);
  59 }
  60 
  61 template <class T>
  62 inline void G1ScanClosureBase::handle_non_cset_obj_common(InCSetState const state, T* p, oop const obj) {
  63   if (state.is_humongous()) {
  64     _g1->set_humongous_is_live(obj);
  65   }
  66 }
  67 
  68 template <class T>


 216 
 217   _cm->mark_in_next_bitmap(to_obj);
 218 }
 219 
 220 template <G1Barrier barrier, G1Mark do_mark_object>
 221 template <class T>
 222 void G1ParCopyClosure<barrier, do_mark_object>::do_oop_work(T* p) {
 223   T heap_oop = oopDesc::load_heap_oop(p);
 224 
 225   if (oopDesc::is_null(heap_oop)) {
 226     return;
 227   }
 228 
 229   oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
 230 
 231   assert(_worker_id == _par_scan_state->worker_id(), "sanity");
 232 
 233   const InCSetState state = _g1->in_cset_state(obj);
 234   if (state.is_in_cset()) {
 235     oop forwardee;
 236     markOop m = obj->mark_raw();
 237     if (m->is_marked()) {
 238       forwardee = (oop) m->decode_pointer();
 239     } else {
 240       forwardee = _par_scan_state->copy_to_survivor_space(state, obj, m);
 241     }
 242     assert(forwardee != NULL, "forwardee should not be NULL");
 243     oopDesc::encode_store_heap_oop(p, forwardee);
 244     if (do_mark_object != G1MarkNone && forwardee != obj) {
 245       // If the object is self-forwarded we don't need to explicitly
 246       // mark it, the evacuation failure protocol will do so.
 247       mark_forwarded_object(obj, forwardee);
 248     }
 249 
 250     if (barrier == G1BarrierCLD) {
 251       do_cld_barrier(forwardee);
 252     }
 253   } else {
 254     if (state.is_humongous()) {
 255       _g1->set_humongous_is_live(obj);
 256     }
< prev index next >