Mercurial > hg > graal-jvmci-8
annotate src/share/vm/gc_implementation/g1/heapRegionSeq.hpp @ 20211:82693fb204a5
8038930: G1CodeRootSet::test fails with assert(_num_chunks_handed_out == 0) failed: No elements must have been handed out yet
Summary: The test incorrectly assumed that it had been started with no other previous compilation activity. Fix this by allowing multiple code root free chunk lists, and use one separate from the global one to perform the test.
Reviewed-by: brutisso
author | tschatzl |
---|---|
date | Wed, 16 Apr 2014 10:14:50 +0200 |
parents | 55fb97c4c58d |
children | 63a4eb8bcd23 eec72fa4b108 |
rev | line source |
---|---|
342 | 1 /* |
17467
55fb97c4c58d
8029233: Update copyright year to match last edit in jdk8 hotspot repository for 2013
mikael
parents:
12305
diff
changeset
|
2 * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. |
342 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
844
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
844
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
844
diff
changeset
|
21 * questions. |
342 | 22 * |
23 */ | |
24 | |
1972 | 25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONSEQ_HPP |
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONSEQ_HPP | |
27 | |
12305
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
10242
diff
changeset
|
28 #include "gc_implementation/g1/g1BiasedArray.hpp" |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
10242
diff
changeset
|
29 |
342 | 30 class HeapRegion; |
31 class HeapRegionClosure; | |
3766 | 32 class FreeRegionList; |
33 | |
12305
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
10242
diff
changeset
|
34 class G1HeapRegionTable : public G1BiasedMappedArray<HeapRegion*> { |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
10242
diff
changeset
|
35 protected: |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
10242
diff
changeset
|
36 virtual HeapRegion* default_value() const { return NULL; } |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
10242
diff
changeset
|
37 }; |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
10242
diff
changeset
|
38 |
3766 | 39 // This class keeps track of the region metadata (i.e., HeapRegion |
40 // instances). They are kept in the _regions array in address | |
41 // order. A region's index in the array corresponds to its index in | |
42 // the heap (i.e., 0 is the region at the bottom of the heap, 1 is | |
43 // the one after it, etc.). Two regions that are consecutive in the | |
44 // array should also be adjacent in the address space (i.e., | |
45 // region(i).end() == region(i+1).bottom(). | |
46 // | |
47 // We create a HeapRegion when we commit the region's address space | |
48 // for the first time. When we uncommit the address space of a | |
49 // region we retain the HeapRegion to be able to re-use it in the | |
50 // future (in case we recommit it). | |
51 // | |
52 // We keep track of three lengths: | |
53 // | |
12305
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
10242
diff
changeset
|
54 // * _committed_length (returned by length()) is the number of currently |
3766 | 55 // committed regions. |
56 // * _allocated_length (not exposed outside this class) is the | |
57 // number of regions for which we have HeapRegions. | |
12305
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
10242
diff
changeset
|
58 // * max_length() returns the maximum number of regions the heap can have. |
3766 | 59 // |
12305
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
10242
diff
changeset
|
60 // and maintain that: _committed_length <= _allocated_length <= max_length() |
342 | 61 |
6197 | 62 class HeapRegionSeq: public CHeapObj<mtGC> { |
3972 | 63 friend class VMStructs; |
342 | 64 |
12305
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
10242
diff
changeset
|
65 G1HeapRegionTable _regions; |
3766 | 66 |
67 // The number of regions committed in the heap. | |
12305
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
10242
diff
changeset
|
68 uint _committed_length; |
3766 | 69 |
70 // A hint for which index to start searching from for humongous | |
71 // allocations. | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
3972
diff
changeset
|
72 uint _next_search_index; |
342 | 73 |
3766 | 74 // The number of regions for which we have allocated HeapRegions for. |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
3972
diff
changeset
|
75 uint _allocated_length; |
3766 | 76 |
77 // Find a contiguous set of empty regions of length num, starting | |
78 // from the given index. | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
3972
diff
changeset
|
79 uint find_contiguous_from(uint from, uint num); |
342 | 80 |
10242
b0d20fa374b4
8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents:
6197
diff
changeset
|
81 void increment_allocated_length() { |
12305
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
10242
diff
changeset
|
82 assert(_allocated_length < max_length(), "pre-condition"); |
10242
b0d20fa374b4
8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents:
6197
diff
changeset
|
83 _allocated_length++; |
3766 | 84 } |
85 | |
10242
b0d20fa374b4
8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents:
6197
diff
changeset
|
86 void increment_length() { |
12305
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
10242
diff
changeset
|
87 assert(length() < max_length(), "pre-condition"); |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
10242
diff
changeset
|
88 _committed_length++; |
10242
b0d20fa374b4
8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents:
6197
diff
changeset
|
89 } |
b0d20fa374b4
8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents:
6197
diff
changeset
|
90 |
b0d20fa374b4
8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents:
6197
diff
changeset
|
91 void decrement_length() { |
12305
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
10242
diff
changeset
|
92 assert(length() > 0, "pre-condition"); |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
10242
diff
changeset
|
93 _committed_length--; |
3766 | 94 } |
342 | 95 |
12305
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
10242
diff
changeset
|
96 HeapWord* heap_bottom() const { return _regions.bottom_address_mapped(); } |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
10242
diff
changeset
|
97 HeapWord* heap_end() const {return _regions.end_address_mapped(); } |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
10242
diff
changeset
|
98 |
342 | 99 public: |
3766 | 100 // Empty contructor, we'll initialize it with the initialize() method. |
12305
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
10242
diff
changeset
|
101 HeapRegionSeq() : _regions(), _committed_length(0), _next_search_index(0), _allocated_length(0) { } |
3766 | 102 |
12305
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
10242
diff
changeset
|
103 void initialize(HeapWord* bottom, HeapWord* end); |
342 | 104 |
3766 | 105 // Return the HeapRegion at the given index. Assume that the index |
106 // is valid. | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
3972
diff
changeset
|
107 inline HeapRegion* at(uint index) const; |
3766 | 108 |
109 // If addr is within the committed space return its corresponding | |
110 // HeapRegion, otherwise return NULL. | |
111 inline HeapRegion* addr_to_region(HeapWord* addr) const; | |
112 | |
113 // Return the HeapRegion that corresponds to the given | |
114 // address. Assume the address is valid. | |
115 inline HeapRegion* addr_to_region_unsafe(HeapWord* addr) const; | |
342 | 116 |
3766 | 117 // Return the number of regions that have been committed in the heap. |
12305
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
10242
diff
changeset
|
118 uint length() const { return _committed_length; } |
3766 | 119 |
120 // Return the maximum number of regions in the heap. | |
12305
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
10242
diff
changeset
|
121 uint max_length() const { return (uint)_regions.length(); } |
342 | 122 |
3766 | 123 // Expand the sequence to reflect that the heap has grown from |
124 // old_end to new_end. Either create new HeapRegions, or re-use | |
125 // existing ones, and return them in the given list. Returns the | |
126 // memory region that covers the newly-created regions. If a | |
127 // HeapRegion allocation fails, the result memory region might be | |
128 // smaller than the desired one. | |
129 MemRegion expand_by(HeapWord* old_end, HeapWord* new_end, | |
130 FreeRegionList* list); | |
342 | 131 |
3766 | 132 // Return the number of contiguous regions at the end of the sequence |
342 | 133 // that are available for allocation. |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
3972
diff
changeset
|
134 uint free_suffix(); |
342 | 135 |
2361 | 136 // Find a contiguous set of empty regions of length num and return |
3766 | 137 // the index of the first region or G1_NULL_HRS_INDEX if the |
138 // search was unsuccessful. | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
3972
diff
changeset
|
139 uint find_contiguous(uint num); |
342 | 140 |
3766 | 141 // Apply blk->doHeapRegion() on all committed regions in address order, |
142 // terminating the iteration early if doHeapRegion() returns true. | |
143 void iterate(HeapRegionClosure* blk) const; | |
342 | 144 |
3766 | 145 // As above, but start the iteration from hr and loop around. If hr |
146 // is NULL, we start from the first region in the heap. | |
147 void iterate_from(HeapRegion* hr, HeapRegionClosure* blk) const; | |
342 | 148 |
3766 | 149 // Tag as uncommitted as many regions that are completely free as |
10242
b0d20fa374b4
8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents:
6197
diff
changeset
|
150 // possible, up to num_regions_to_remove, from the suffix of the committed |
b0d20fa374b4
8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents:
6197
diff
changeset
|
151 // sequence. Return the actual number of removed regions. |
b0d20fa374b4
8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents:
6197
diff
changeset
|
152 uint shrink_by(uint num_regions_to_remove); |
342 | 153 |
3766 | 154 // Do some sanity checking. |
155 void verify_optional() PRODUCT_RETURN; | |
342 | 156 }; |
1972 | 157 |
158 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONSEQ_HPP |