hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp
author goetz
Wed, 02 Apr 2014 09:17:38 +0200
changeset 23543 0625da57ab78
parent 23450 c7c6202fc7e2
child 24100 7e71ac14ec06
permissions -rw-r--r--
8038498: Fix includes and C inlining after 8035330 Summary: Change 8035330: Remove G1ParScanPartialArrayClosure and G1ParScanHeapEvacClosure broke the debug build on AIX. The method do_oop_partial_array() is added in a header, but requires the inline function par_write_ref() through several inlined calls. In some cpp files, like arguments.cpp, par_write_ref() is not defined as the corresponding inline header and is not included. The AIX debug VM does not start because of the missing symbol. This change solves this by cleaning up include dependencies. Reviewed-by: tschatzl, stefank
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
/*
22234
da823d78ad65 8029233: Update copyright year to match last edit in jdk8 hotspot repository for 2013
mikael
parents: 20403
diff changeset
     2
 * Copyright (c) 2001, 2013, 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: 2742
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 2742
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: 2742
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: 6260
diff changeset
    25
#ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1COLLECTEDHEAP_INLINE_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6260
diff changeset
    26
#define SHARE_VM_GC_IMPLEMENTATION_G1_G1COLLECTEDHEAP_INLINE_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6260
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6260
diff changeset
    28
#include "gc_implementation/g1/concurrentMark.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6260
diff changeset
    29
#include "gc_implementation/g1/g1CollectedHeap.hpp"
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
    30
#include "gc_implementation/g1/g1AllocRegion.inline.hpp"
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
    31
#include "gc_implementation/g1/g1CollectorPolicy.hpp"
23543
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
    32
#include "gc_implementation/g1/g1RemSet.inline.hpp"
20403
45a89fbcd8f7 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 20309
diff changeset
    33
#include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"
23450
c7c6202fc7e2 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 22234
diff changeset
    34
#include "gc_implementation/g1/heapRegionSet.inline.hpp"
7920
298df61588a2 7011379: G1: overly long concurrent marking cycles
tonyp
parents: 7905
diff changeset
    35
#include "gc_implementation/g1/heapRegionSeq.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6260
diff changeset
    36
#include "utilities/taskqueue.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6260
diff changeset
    37
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    38
// Inline functions for G1CollectedHeap
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    39
23543
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
    40
// Return the region with the given index. It assumes the index is valid.
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
    41
inline HeapRegion* G1CollectedHeap::region_at(uint index) const { return _hrs.at(index); }
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
    42
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 8928
diff changeset
    43
template <class T>
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    44
inline HeapRegion*
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 8928
diff changeset
    45
G1CollectedHeap::heap_region_containing(const T addr) const {
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 8928
diff changeset
    46
  HeapRegion* hr = _hrs.addr_to_region((HeapWord*) addr);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    47
  // hr can be null if addr in perm_gen
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    48
  if (hr != NULL && hr->continuesHumongous()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    49
    hr = hr->humongous_start_region();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    50
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    51
  return hr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    52
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    53
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 8928
diff changeset
    54
template <class T>
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    55
inline HeapRegion*
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 8928
diff changeset
    56
G1CollectedHeap::heap_region_containing_raw(const T addr) const {
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 8928
diff changeset
    57
  assert(_g1_reserved.contains((const void*) addr), "invariant");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 8928
diff changeset
    58
  HeapRegion* res = _hrs.addr_to_region_unsafe((HeapWord*) addr);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    59
  return res;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    60
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    61
23543
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
    62
inline void G1CollectedHeap::old_set_remove(HeapRegion* hr) {
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
    63
  _old_set.remove(hr);
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
    64
}
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
    65
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    66
inline bool G1CollectedHeap::obj_in_cs(oop obj) {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 8928
diff changeset
    67
  HeapRegion* r = _hrs.addr_to_region((HeapWord*) obj);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    68
  return r != NULL && r->in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    69
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    70
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
    71
inline HeapWord*
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
    72
G1CollectedHeap::attempt_allocation(size_t word_size,
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 13517
diff changeset
    73
                                    unsigned int* gc_count_before_ret,
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 13517
diff changeset
    74
                                    int* gclocker_retry_count_ret) {
7905
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7416
diff changeset
    75
  assert_heap_not_locked_and_not_at_safepoint();
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
    76
  assert(!isHumongous(word_size), "attempt_allocation() should not "
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
    77
         "be called for humongous allocation requests");
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
    78
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
    79
  HeapWord* result = _mutator_alloc_region.attempt_allocation(word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
    80
                                                      false /* bot_updates */);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
    81
  if (result == NULL) {
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 13517
diff changeset
    82
    result = attempt_allocation_slow(word_size,
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 13517
diff changeset
    83
                                     gc_count_before_ret,
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 13517
diff changeset
    84
                                     gclocker_retry_count_ret);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    85
  }
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
    86
  assert_heap_not_locked();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
    87
  if (result != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
    88
    dirty_young_block(result, word_size);
7905
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7416
diff changeset
    89
  }
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 7923
diff changeset
    90
  return result;
7905
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7416
diff changeset
    91
}
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7416
diff changeset
    92
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
    93
inline HeapWord* G1CollectedHeap::survivor_attempt_allocation(size_t
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
    94
                                                              word_size) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
    95
  assert(!isHumongous(word_size),
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
    96
         "we should not be seeing humongous-size allocations in this path");
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
    97
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
    98
  HeapWord* result = _survivor_gc_alloc_region.attempt_allocation(word_size,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
    99
                                                      false /* bot_updates */);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   100
  if (result == NULL) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   101
    MutexLockerEx x(FreeList_lock, Mutex::_no_safepoint_check_flag);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   102
    result = _survivor_gc_alloc_region.attempt_allocation_locked(word_size,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   103
                                                      false /* bot_updates */);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   104
  }
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   105
  if (result != NULL) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   106
    dirty_young_block(result, word_size);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   107
  }
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   108
  return result;
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   109
}
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   110
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   111
inline HeapWord* G1CollectedHeap::old_attempt_allocation(size_t word_size) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   112
  assert(!isHumongous(word_size),
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   113
         "we should not be seeing humongous-size allocations in this path");
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   114
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   115
  HeapWord* result = _old_gc_alloc_region.attempt_allocation(word_size,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   116
                                                       true /* bot_updates */);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   117
  if (result == NULL) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   118
    MutexLockerEx x(FreeList_lock, Mutex::_no_safepoint_check_flag);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   119
    result = _old_gc_alloc_region.attempt_allocation_locked(word_size,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   120
                                                       true /* bot_updates */);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   121
  }
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   122
  return result;
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   123
}
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 9989
diff changeset
   124
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   125
// It dirties the cards that cover the block so that so that the post
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   126
// write barrier never queues anything when updating objects on this
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   127
// block. It is assumed (and in fact we assert) that the block
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   128
// belongs to a young region.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   129
inline void
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   130
G1CollectedHeap::dirty_young_block(HeapWord* start, size_t word_size) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   131
  assert_heap_not_locked();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   132
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   133
  // Assign the containing region to containing_hr so that we don't
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   134
  // have to keep calling heap_region_containing_raw() in the
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   135
  // asserts below.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   136
  DEBUG_ONLY(HeapRegion* containing_hr = heap_region_containing_raw(start);)
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   137
  assert(containing_hr != NULL && start != NULL && word_size > 0,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   138
         "pre-condition");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   139
  assert(containing_hr->is_in(start), "it should contain start");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   140
  assert(containing_hr->is_young(), "it should be young");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   141
  assert(!containing_hr->isHumongous(), "it should not be humongous");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   142
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   143
  HeapWord* end = start + word_size;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   144
  assert(containing_hr->is_in(end - 1), "it should also contain end - 1");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   145
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   146
  MemRegion mr(start, end);
20403
45a89fbcd8f7 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 20309
diff changeset
   147
  g1_barrier_set()->g1_mark_as_young(mr);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   148
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   149
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 5547
diff changeset
   150
inline RefToScanQueue* G1CollectedHeap::task_queue(int i) const {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   151
  return _task_queues->queue(i);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   152
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   153
13517
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   154
inline bool G1CollectedHeap::isMarkedPrev(oop obj) const {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   155
  return _cm->prevMarkBitMap()->isMarked((HeapWord *)obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   156
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   157
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   158
inline bool G1CollectedHeap::isMarkedNext(oop obj) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   159
  return _cm->nextMarkBitMap()->isMarked((HeapWord *)obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   160
}
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6260
diff changeset
   161
23543
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   162
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   163
// This is a fast test on whether a reference points into the
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   164
// collection set or not. Assume that the reference
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   165
// points into the heap.
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   166
inline bool G1CollectedHeap::in_cset_fast_test(oop obj) {
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   167
  assert(_in_cset_fast_test != NULL, "sanity");
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   168
  assert(_g1_committed.contains((HeapWord*) obj), err_msg("Given reference outside of heap, is "PTR_FORMAT, (HeapWord*)obj));
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   169
  // no need to subtract the bottom of the heap from obj,
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   170
  // _in_cset_fast_test is biased
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   171
  uintx index = cast_from_oop<uintx>(obj) >> HeapRegion::LogOfHRGrainBytes;
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   172
  bool ret = _in_cset_fast_test[index];
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   173
  // let's make sure the result is consistent with what the slower
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   174
  // test returns
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   175
  assert( ret || !obj_in_cs(obj), "sanity");
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   176
  assert(!ret ||  obj_in_cs(obj), "sanity");
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   177
  return ret;
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   178
}
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   179
13517
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   180
#ifndef PRODUCT
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   181
// Support for G1EvacuationFailureALot
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   182
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   183
inline bool
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   184
G1CollectedHeap::evacuation_failure_alot_for_gc_type(bool gcs_are_young,
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   185
                                                     bool during_initial_mark,
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   186
                                                     bool during_marking) {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   187
  bool res = false;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   188
  if (during_marking) {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   189
    res |= G1EvacuationFailureALotDuringConcMark;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   190
  }
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   191
  if (during_initial_mark) {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   192
    res |= G1EvacuationFailureALotDuringInitialMark;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   193
  }
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   194
  if (gcs_are_young) {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   195
    res |= G1EvacuationFailureALotDuringYoungGC;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   196
  } else {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   197
    // GCs are mixed
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   198
    res |= G1EvacuationFailureALotDuringMixedGC;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   199
  }
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   200
  return res;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   201
}
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   202
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   203
inline void
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   204
G1CollectedHeap::set_evacuation_failure_alot_for_current_gc() {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   205
  if (G1EvacuationFailureALot) {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   206
    // Note we can't assert that _evacuation_failure_alot_for_current_gc
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   207
    // is clear here. It may have been set during a previous GC but that GC
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   208
    // did not copy enough objects (i.e. G1EvacuationFailureALotCount) to
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   209
    // trigger an evacuation failure and clear the flags and and counts.
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   210
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   211
    // Check if we have gone over the interval.
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   212
    const size_t gc_num = total_collections();
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   213
    const size_t elapsed_gcs = gc_num - _evacuation_failure_alot_gc_number;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   214
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   215
    _evacuation_failure_alot_for_current_gc = (elapsed_gcs >= G1EvacuationFailureALotInterval);
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   216
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   217
    // Now check if G1EvacuationFailureALot is enabled for the current GC type.
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   218
    const bool gcs_are_young = g1_policy()->gcs_are_young();
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   219
    const bool during_im = g1_policy()->during_initial_mark_pause();
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   220
    const bool during_marking = mark_in_progress();
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   221
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   222
    _evacuation_failure_alot_for_current_gc &=
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   223
      evacuation_failure_alot_for_gc_type(gcs_are_young,
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   224
                                          during_im,
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   225
                                          during_marking);
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   226
  }
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   227
}
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   228
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   229
inline bool
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   230
G1CollectedHeap::evacuation_should_fail() {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   231
  if (!G1EvacuationFailureALot || !_evacuation_failure_alot_for_current_gc) {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   232
    return false;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   233
  }
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   234
  // G1EvacuationFailureALot is in effect for current GC
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   235
  // Access to _evacuation_failure_alot_count is not atomic;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   236
  // the value does not have to be exact.
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   237
  if (++_evacuation_failure_alot_count < G1EvacuationFailureALotCount) {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   238
    return false;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   239
  }
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   240
  _evacuation_failure_alot_count = 0;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   241
  return true;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   242
}
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   243
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   244
inline void G1CollectedHeap::reset_evacuation_should_fail() {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   245
  if (G1EvacuationFailureALot) {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   246
    _evacuation_failure_alot_gc_number = total_collections();
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   247
    _evacuation_failure_alot_count = 0;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   248
    _evacuation_failure_alot_for_current_gc = false;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   249
  }
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   250
}
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   251
#endif  // #ifndef PRODUCT
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 10243
diff changeset
   252
23543
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   253
inline bool G1CollectedHeap::is_in_young(const oop obj) {
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   254
  HeapRegion* hr = heap_region_containing(obj);
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   255
  return hr != NULL && hr->is_young();
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   256
}
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   257
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   258
// We don't need barriers for initializing stores to objects
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   259
// in the young gen: for the SATB pre-barrier, there is no
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   260
// pre-value that needs to be remembered; for the remembered-set
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   261
// update logging post-barrier, we don't maintain remembered set
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   262
// information for young gen objects.
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   263
inline bool G1CollectedHeap::can_elide_initializing_store_barrier(oop new_obj) {
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   264
  return is_in_young(new_obj);
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   265
}
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   266
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   267
inline bool G1CollectedHeap::is_obj_dead(const oop obj) const {
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   268
  const HeapRegion* hr = heap_region_containing(obj);
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   269
  if (hr == NULL) {
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   270
    if (obj == NULL) return false;
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   271
    else return true;
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   272
  }
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   273
  else return is_obj_dead(obj, hr);
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   274
}
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   275
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   276
inline bool G1CollectedHeap::is_obj_ill(const oop obj) const {
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   277
  const HeapRegion* hr = heap_region_containing(obj);
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   278
  if (hr == NULL) {
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   279
    if (obj == NULL) return false;
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   280
    else return true;
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   281
  }
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   282
  else return is_obj_ill(obj, hr);
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   283
}
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   284
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   285
template <class T> inline void G1ParScanThreadState::immediate_rs_update(HeapRegion* from, T* p, int tid) {
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   286
  if (!from->is_survivor()) {
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   287
    _g1_rem->par_write_ref(from, p, tid);
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   288
  }
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   289
}
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   290
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   291
template <class T> void G1ParScanThreadState::update_rs(HeapRegion* from, T* p, int tid) {
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   292
  if (G1DeferredRSUpdate) {
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   293
    deferred_rs_update(from, p, tid);
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   294
  } else {
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   295
    immediate_rs_update(from, p, tid);
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   296
  }
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   297
}
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   298
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   299
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   300
inline void G1ParScanThreadState::do_oop_partial_array(oop* p) {
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   301
  assert(has_partial_array_mask(p), "invariant");
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   302
  oop from_obj = clear_partial_array_mask(p);
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   303
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   304
  assert(Universe::heap()->is_in_reserved(from_obj), "must be in heap.");
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   305
  assert(from_obj->is_objArray(), "must be obj array");
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   306
  objArrayOop from_obj_array = objArrayOop(from_obj);
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   307
  // The from-space object contains the real length.
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   308
  int length                 = from_obj_array->length();
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   309
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   310
  assert(from_obj->is_forwarded(), "must be forwarded");
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   311
  oop to_obj                 = from_obj->forwardee();
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   312
  assert(from_obj != to_obj, "should not be chunking self-forwarded objects");
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   313
  objArrayOop to_obj_array   = objArrayOop(to_obj);
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   314
  // We keep track of the next start index in the length field of the
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   315
  // to-space object.
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   316
  int next_index             = to_obj_array->length();
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   317
  assert(0 <= next_index && next_index < length,
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   318
         err_msg("invariant, next index: %d, length: %d", next_index, length));
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   319
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   320
  int start                  = next_index;
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   321
  int end                    = length;
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   322
  int remainder              = end - start;
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   323
  // We'll try not to push a range that's smaller than ParGCArrayScanChunk.
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   324
  if (remainder > 2 * ParGCArrayScanChunk) {
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   325
    end = start + ParGCArrayScanChunk;
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   326
    to_obj_array->set_length(end);
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   327
    // Push the remainder before we process the range in case another
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   328
    // worker has run out of things to do and can steal it.
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   329
    oop* from_obj_p = set_partial_array_mask(from_obj);
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   330
    push_on_queue(from_obj_p);
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   331
  } else {
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   332
    assert(length == end, "sanity");
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   333
    // We'll process the final range for this object. Restore the length
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   334
    // so that the heap remains parsable in case of evacuation failure.
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   335
    to_obj_array->set_length(end);
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   336
  }
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   337
  _scanner.set_region(_g1h->heap_region_containing_raw(to_obj));
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   338
  // Process indexes [start,end). It will also process the header
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   339
  // along with the first chunk (i.e., the chunk with start == 0).
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   340
  // Note that at this point the length field of to_obj_array is not
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   341
  // correct given that we are using it to keep track of the next
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   342
  // start index. oop_iterate_range() (thankfully!) ignores the length
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   343
  // field and only relies on the start / end parameters.  It does
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   344
  // however return the size of the object which will be incorrect. So
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   345
  // we have to ignore it even if we wanted to use it.
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   346
  to_obj_array->oop_iterate_range(&_scanner, start, end);
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   347
}
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   348
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   349
template <class T> inline void G1ParScanThreadState::deal_with_reference(T* ref_to_scan) {
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   350
  if (!has_partial_array_mask(ref_to_scan)) {
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   351
    // Note: we can use "raw" versions of "region_containing" because
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   352
    // "obj_to_scan" is definitely in the heap, and is not in a
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   353
    // humongous region.
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   354
    HeapRegion* r = _g1h->heap_region_containing_raw(ref_to_scan);
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   355
    do_oop_evac(ref_to_scan, r);
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   356
  } else {
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   357
    do_oop_partial_array((oop*)ref_to_scan);
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   358
  }
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   359
}
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   360
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   361
inline void G1ParScanThreadState::deal_with_reference(StarTask ref) {
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   362
  assert(verify_task(ref), "sanity");
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   363
  if (ref.is_narrow()) {
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   364
    deal_with_reference((narrowOop*)ref);
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   365
  } else {
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   366
    deal_with_reference((oop*)ref);
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   367
  }
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   368
}
0625da57ab78 8038498: Fix includes and C inlining after 8035330
goetz
parents: 23450
diff changeset
   369
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6260
diff changeset
   370
#endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1COLLECTEDHEAP_INLINE_HPP