hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.inline.hpp
author johnc
Thu, 09 May 2013 11:16:39 -0700
changeset 17327 4bd0581aa231
parent 14073 6012178c0c19
child 22807 1cf02ef734e2
child 22551 9bf46d16dcc6
permissions -rw-r--r--
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap Summary: Refactor G1's hot card cache and card counts table into their own files. Simplify the card counts table, including removing the encoding of the card index in each entry. The card counts table now has a 1:1 correspondence with the cards spanned by heap. Space for the card counts table is reserved from virtual memory (rather than C heap) during JVM startup and is committed/expanded when the heap is expanded. Changes were also reviewed-by Vitaly Davidovich. Reviewed-by: tschatzl, jmasa
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     1
/*
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11202
diff changeset
     2
 * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     4
 *
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     7
 * published by the Free Software Foundation.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     8
 *
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    13
 * accompanied this code).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    14
 *
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4902
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4902
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4902
diff changeset
    21
 * questions.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    22
 *
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    23
 */
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6247
diff changeset
    25
#ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1OOPCLOSURES_INLINE_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6247
diff changeset
    26
#define SHARE_VM_GC_IMPLEMENTATION_G1_G1OOPCLOSURES_INLINE_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6247
diff changeset
    27
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9988
diff changeset
    28
#include "gc_implementation/g1/concurrentMark.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6247
diff changeset
    29
#include "gc_implementation/g1/g1CollectedHeap.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6247
diff changeset
    30
#include "gc_implementation/g1/g1OopClosures.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6247
diff changeset
    31
#include "gc_implementation/g1/g1RemSet.hpp"
13333
f51af0093d29 7173712: G1: Duplicated code in G1UpdateRSOrPushRefOopClosure::do_oop_nv()
johnc
parents: 11586
diff changeset
    32
#include "gc_implementation/g1/heapRegionRemSet.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6247
diff changeset
    33
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    34
/*
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    35
 * This really ought to be an inline function, but apparently the C++
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    36
 * compiler sometimes sees fit to ignore inline declarations.  Sigh.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    37
 */
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    38
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11202
diff changeset
    39
template <class T>
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11202
diff changeset
    40
inline void FilterIntoCSClosure::do_oop_nv(T* p) {
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    41
  T heap_oop = oopDesc::load_heap_oop(p);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    42
  if (!oopDesc::is_null(heap_oop) &&
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    43
      _g1->obj_in_cs(oopDesc::decode_heap_oop_not_null(heap_oop))) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    44
    _oc->do_oop(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    45
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    46
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    47
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11202
diff changeset
    48
template <class T>
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11202
diff changeset
    49
inline void FilterOutOfRegionClosure::do_oop_nv(T* p) {
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    50
  T heap_oop = oopDesc::load_heap_oop(p);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    51
  if (!oopDesc::is_null(heap_oop)) {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    52
    HeapWord* obj_hw = (HeapWord*)oopDesc::decode_heap_oop_not_null(heap_oop);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    53
    if (obj_hw < _r_bottom || obj_hw >= _r_end) {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    54
      _oc->do_oop(p);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    55
    }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    56
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    57
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    58
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    59
// This closure is applied to the fields of the objects that have just been copied.
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11202
diff changeset
    60
template <class T>
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11202
diff changeset
    61
inline void G1ParScanClosure::do_oop_nv(T* p) {
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    62
  T heap_oop = oopDesc::load_heap_oop(p);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    63
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    64
  if (!oopDesc::is_null(heap_oop)) {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    65
    oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    66
    if (_g1->in_cset_fast_test(obj)) {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    67
      // We're not going to even bother checking whether the object is
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    68
      // already forwarded or not, as this usually causes an immediate
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    69
      // stall. We'll try to prefetch the object (for write, given that
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    70
      // we might need to install the forwarding reference) and we'll
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    71
      // get back to it when pop it from the queue
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    72
      Prefetch::write(obj->mark_addr(), 0);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    73
      Prefetch::read(obj->mark_addr(), (HeapWordSize*2));
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    74
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    75
      // slightly paranoid test; I'm trying to catch potential
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    76
      // problems before we go into push_on_queue to know where the
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    77
      // problem is coming from
11202
6be05533238b 7114095: G1: assert(obj == oopDesc::load_decode_heap_oop(p)) failed: p should still be pointing to obj
johnc
parents: 9994
diff changeset
    78
      assert((obj == oopDesc::load_decode_heap_oop(p)) ||
6be05533238b 7114095: G1: assert(obj == oopDesc::load_decode_heap_oop(p)) failed: p should still be pointing to obj
johnc
parents: 9994
diff changeset
    79
             (obj->is_forwarded() &&
6be05533238b 7114095: G1: assert(obj == oopDesc::load_decode_heap_oop(p)) failed: p should still be pointing to obj
johnc
parents: 9994
diff changeset
    80
                 obj->forwardee() == oopDesc::load_decode_heap_oop(p)),
6be05533238b 7114095: G1: assert(obj == oopDesc::load_decode_heap_oop(p)) failed: p should still be pointing to obj
johnc
parents: 9994
diff changeset
    81
             "p should still be pointing to obj or to its forwardee");
6be05533238b 7114095: G1: assert(obj == oopDesc::load_decode_heap_oop(p)) failed: p should still be pointing to obj
johnc
parents: 9994
diff changeset
    82
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    83
      _par_scan_state->push_on_queue(p);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    84
    } else {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    85
      _par_scan_state->update_rs(_from, p, _par_scan_state->queue_num());
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1374
diff changeset
    86
    }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    87
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    88
}
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 3262
diff changeset
    89
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11202
diff changeset
    90
template <class T>
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11202
diff changeset
    91
inline void G1ParPushHeapRSClosure::do_oop_nv(T* p) {
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 3262
diff changeset
    92
  T heap_oop = oopDesc::load_heap_oop(p);
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 3262
diff changeset
    93
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 3262
diff changeset
    94
  if (!oopDesc::is_null(heap_oop)) {
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 3262
diff changeset
    95
    oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 3262
diff changeset
    96
    if (_g1->in_cset_fast_test(obj)) {
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 3262
diff changeset
    97
      Prefetch::write(obj->mark_addr(), 0);
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 3262
diff changeset
    98
      Prefetch::read(obj->mark_addr(), (HeapWordSize*2));
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 5547
diff changeset
    99
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 5547
diff changeset
   100
      // Place on the references queue
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 3262
diff changeset
   101
      _par_scan_state->push_on_queue(p);
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 3262
diff changeset
   102
    }
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 3262
diff changeset
   103
  }
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 3262
diff changeset
   104
}
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 5547
diff changeset
   105
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11202
diff changeset
   106
template <class T>
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11202
diff changeset
   107
inline void G1CMOopClosure::do_oop_nv(T* p) {
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9988
diff changeset
   108
  assert(_g1h->is_in_g1_reserved((HeapWord*) p), "invariant");
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9988
diff changeset
   109
  assert(!_g1h->is_on_master_free_list(
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9988
diff changeset
   110
                    _g1h->heap_region_containing((HeapWord*) p)), "invariant");
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9988
diff changeset
   111
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9988
diff changeset
   112
  oop obj = oopDesc::load_decode_heap_oop(p);
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9988
diff changeset
   113
  if (_cm->verbose_high()) {
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13336
diff changeset
   114
    gclog_or_tty->print_cr("[%u] we're looking at location "
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9988
diff changeset
   115
                           "*"PTR_FORMAT" = "PTR_FORMAT,
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13336
diff changeset
   116
                           _task->worker_id(), p, (void*) obj);
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9988
diff changeset
   117
  }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9988
diff changeset
   118
  _task->deal_with_reference(obj);
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents: 9988
diff changeset
   119
}
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6247
diff changeset
   120
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11202
diff changeset
   121
template <class T>
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11202
diff changeset
   122
inline void G1RootRegionScanClosure::do_oop_nv(T* p) {
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11202
diff changeset
   123
  T heap_oop = oopDesc::load_heap_oop(p);
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11202
diff changeset
   124
  if (!oopDesc::is_null(heap_oop)) {
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11202
diff changeset
   125
    oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11202
diff changeset
   126
    HeapRegion* hr = _g1h->heap_region_containing((HeapWord*) obj);
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11202
diff changeset
   127
    if (hr != NULL) {
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11202
diff changeset
   128
      _cm->grayRoot(obj, obj->size(), _worker_id, hr);
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11202
diff changeset
   129
    }
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11202
diff changeset
   130
  }
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11202
diff changeset
   131
}
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11202
diff changeset
   132
11586
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   133
template <class T>
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   134
inline void G1Mux2Closure::do_oop_nv(T* p) {
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   135
  // Apply first closure; then apply the second.
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   136
  _c1->do_oop(p);
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   137
  _c2->do_oop(p);
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   138
}
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   139
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   140
template <class T>
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   141
inline void G1TriggerClosure::do_oop_nv(T* p) {
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   142
  // Record that this closure was actually applied (triggered).
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   143
  _triggered = true;
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   144
}
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   145
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   146
template <class T>
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   147
inline void G1InvokeIfNotTriggeredClosure::do_oop_nv(T* p) {
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   148
  if (!_trigger_cl->triggered()) {
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   149
    _oop_cl->do_oop(p);
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   150
  }
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   151
}
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   152
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   153
template <class T>
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   154
inline void G1UpdateRSOrPushRefOopClosure::do_oop_nv(T* p) {
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   155
  oop obj = oopDesc::load_decode_heap_oop(p);
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   156
#ifdef ASSERT
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   157
  // can't do because of races
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   158
  // assert(obj == NULL || obj->is_oop(), "expected an oop");
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   159
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   160
  // Do the safe subset of is_oop
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   161
  if (obj != NULL) {
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   162
#ifdef CHECK_UNHANDLED_OOPS
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   163
    oopDesc* o = obj.obj();
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   164
#else
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   165
    oopDesc* o = obj;
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   166
#endif // CHECK_UNHANDLED_OOPS
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   167
    assert((intptr_t)o % MinObjAlignmentInBytes == 0, "not oop aligned");
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   168
    assert(Universe::heap()->is_in_reserved(obj), "must be in heap");
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   169
  }
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   170
#endif // ASSERT
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   171
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   172
  assert(_from != NULL, "from region must be non-NULL");
13333
f51af0093d29 7173712: G1: Duplicated code in G1UpdateRSOrPushRefOopClosure::do_oop_nv()
johnc
parents: 11586
diff changeset
   173
  assert(_from->is_in_reserved(p), "p is not in from");
11586
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   174
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   175
  HeapRegion* to = _g1->heap_region_containing(obj);
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   176
  if (to != NULL && _from != to) {
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   177
    // The _record_refs_into_cset flag is true during the RSet
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   178
    // updating part of an evacuation pause. It is false at all
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   179
    // other times:
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   180
    //  * rebuilding the rembered sets after a full GC
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   181
    //  * during concurrent refinement.
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   182
    //  * updating the remembered sets of regions in the collection
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   183
    //    set in the event of an evacuation failure (when deferred
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   184
    //    updates are enabled).
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   185
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   186
    if (_record_refs_into_cset && to->in_collection_set()) {
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   187
      // We are recording references that point into the collection
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   188
      // set and this particular reference does exactly that...
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   189
      // If the referenced object has already been forwarded
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   190
      // to itself, we are handling an evacuation failure and
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   191
      // we have already visited/tried to copy this object
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   192
      // there is no need to retry.
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   193
      if (!self_forwarded(obj)) {
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   194
        assert(_push_ref_cl != NULL, "should not be null");
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   195
        // Push the reference in the refs queue of the G1ParScanThreadState
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   196
        // instance for this worker thread.
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   197
        _push_ref_cl->do_oop(p);
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   198
      }
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   199
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   200
      // Deferred updates to the CSet are either discarded (in the normal case),
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   201
      // or processed (if an evacuation failure occurs) at the end
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   202
      // of the collection.
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   203
      // See G1RemSet::cleanup_after_oops_into_collection_set_do().
13333
f51af0093d29 7173712: G1: Duplicated code in G1UpdateRSOrPushRefOopClosure::do_oop_nv()
johnc
parents: 11586
diff changeset
   204
      return;
11586
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   205
    }
13333
f51af0093d29 7173712: G1: Duplicated code in G1UpdateRSOrPushRefOopClosure::do_oop_nv()
johnc
parents: 11586
diff changeset
   206
f51af0093d29 7173712: G1: Duplicated code in G1UpdateRSOrPushRefOopClosure::do_oop_nv()
johnc
parents: 11586
diff changeset
   207
    // We either don't care about pushing references that point into the
f51af0093d29 7173712: G1: Duplicated code in G1UpdateRSOrPushRefOopClosure::do_oop_nv()
johnc
parents: 11586
diff changeset
   208
    // collection set (i.e. we're not during an evacuation pause) _or_
f51af0093d29 7173712: G1: Duplicated code in G1UpdateRSOrPushRefOopClosure::do_oop_nv()
johnc
parents: 11586
diff changeset
   209
    // the reference doesn't point into the collection set. Either way
f51af0093d29 7173712: G1: Duplicated code in G1UpdateRSOrPushRefOopClosure::do_oop_nv()
johnc
parents: 11586
diff changeset
   210
    // we add the reference directly to the RSet of the region containing
f51af0093d29 7173712: G1: Duplicated code in G1UpdateRSOrPushRefOopClosure::do_oop_nv()
johnc
parents: 11586
diff changeset
   211
    // the referenced object.
f51af0093d29 7173712: G1: Duplicated code in G1UpdateRSOrPushRefOopClosure::do_oop_nv()
johnc
parents: 11586
diff changeset
   212
    assert(to->rem_set() != NULL, "Need per-region 'into' remsets.");
f51af0093d29 7173712: G1: Duplicated code in G1UpdateRSOrPushRefOopClosure::do_oop_nv()
johnc
parents: 11586
diff changeset
   213
    to->rem_set()->add_reference(p, _worker_i);
11586
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   214
  }
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   215
}
ccc217c177ee 7133038: G1: Some small profile based optimizations
johnc
parents: 11584
diff changeset
   216
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6247
diff changeset
   217
#endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1OOPCLOSURES_INLINE_HPP