annotate src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.hpp @ 1091:6aa7255741f3

6906727: UseCompressedOops: some card-marking fixes related to object arrays Summary: Introduced a new write_ref_array(HeapWords* start, size_t count) method that does the requisite MemRegion range calculation so (some of the) clients of the erstwhile write_ref_array(MemRegion mr) do not need to worry. This removed all external uses of array_size(), which was also simplified and made private. Asserts were added to catch other possible issues. Further, less essential, fixes stemming from this investigation are deferred to CR 6904516 (to follow shortly in hs17). Reviewed-by: kvn, coleenp, jmasa
author ysr
date Thu, 03 Dec 2009 15:01:57 -0800
parents d1605aabd0a1
children c18cbe5936b8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
196
d1605aabd0a1 6719955: Update copyright year
xdono
parents: 113
diff changeset
2 * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 //
a61af66fc99e Initial load
duke
parents:
diff changeset
26 // psPromotionManager is used by a single thread to manage object survival
a61af66fc99e Initial load
duke
parents:
diff changeset
27 // during a scavenge. The promotion manager contains thread local data only.
a61af66fc99e Initial load
duke
parents:
diff changeset
28 //
a61af66fc99e Initial load
duke
parents:
diff changeset
29 // NOTE! Be carefull when allocating the stacks on cheap. If you are going
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // to use a promotion manager in more than one thread, the stacks MUST be
a61af66fc99e Initial load
duke
parents:
diff changeset
31 // on cheap. This can lead to memory leaks, though, as they are not auto
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // deallocated.
a61af66fc99e Initial load
duke
parents:
diff changeset
33 //
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // FIX ME FIX ME Add a destructor, and don't rely on the user to drain/flush/deallocate!
a61af66fc99e Initial load
duke
parents:
diff changeset
35 //
a61af66fc99e Initial load
duke
parents:
diff changeset
36
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // Move to some global location
a61af66fc99e Initial load
duke
parents:
diff changeset
38 #define HAS_BEEN_MOVED 0x1501d01d
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // End move to some global location
a61af66fc99e Initial load
duke
parents:
diff changeset
40
a61af66fc99e Initial load
duke
parents:
diff changeset
41 class MutableSpace;
a61af66fc99e Initial load
duke
parents:
diff changeset
42 class PSOldGen;
a61af66fc99e Initial load
duke
parents:
diff changeset
43 class ParCompactionManager;
a61af66fc99e Initial load
duke
parents:
diff changeset
44
a61af66fc99e Initial load
duke
parents:
diff changeset
45 #define PS_PM_STATS 0
a61af66fc99e Initial load
duke
parents:
diff changeset
46
a61af66fc99e Initial load
duke
parents:
diff changeset
47 class PSPromotionManager : public CHeapObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
48 friend class PSScavenge;
a61af66fc99e Initial load
duke
parents:
diff changeset
49 friend class PSRefProcTaskExecutor;
a61af66fc99e Initial load
duke
parents:
diff changeset
50 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
51 static PSPromotionManager** _manager_array;
a61af66fc99e Initial load
duke
parents:
diff changeset
52 static OopStarTaskQueueSet* _stack_array_depth;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 static OopTaskQueueSet* _stack_array_breadth;
a61af66fc99e Initial load
duke
parents:
diff changeset
54 static PSOldGen* _old_gen;
a61af66fc99e Initial load
duke
parents:
diff changeset
55 static MutableSpace* _young_space;
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57 #if PS_PM_STATS
a61af66fc99e Initial load
duke
parents:
diff changeset
58 uint _total_pushes;
a61af66fc99e Initial load
duke
parents:
diff changeset
59 uint _masked_pushes;
a61af66fc99e Initial load
duke
parents:
diff changeset
60
a61af66fc99e Initial load
duke
parents:
diff changeset
61 uint _overflow_pushes;
a61af66fc99e Initial load
duke
parents:
diff changeset
62 uint _max_overflow_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
63
a61af66fc99e Initial load
duke
parents:
diff changeset
64 uint _arrays_chunked;
a61af66fc99e Initial load
duke
parents:
diff changeset
65 uint _array_chunks_processed;
a61af66fc99e Initial load
duke
parents:
diff changeset
66
a61af66fc99e Initial load
duke
parents:
diff changeset
67 uint _total_steals;
a61af66fc99e Initial load
duke
parents:
diff changeset
68 uint _masked_steals;
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 void print_stats(uint i);
a61af66fc99e Initial load
duke
parents:
diff changeset
71 static void print_stats();
a61af66fc99e Initial load
duke
parents:
diff changeset
72 #endif // PS_PM_STATS
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74 PSYoungPromotionLAB _young_lab;
a61af66fc99e Initial load
duke
parents:
diff changeset
75 PSOldPromotionLAB _old_lab;
a61af66fc99e Initial load
duke
parents:
diff changeset
76 bool _young_gen_is_full;
a61af66fc99e Initial load
duke
parents:
diff changeset
77 bool _old_gen_is_full;
a61af66fc99e Initial load
duke
parents:
diff changeset
78 PrefetchQueue _prefetch_queue;
a61af66fc99e Initial load
duke
parents:
diff changeset
79
a61af66fc99e Initial load
duke
parents:
diff changeset
80 OopStarTaskQueue _claimed_stack_depth;
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
81 GrowableArray<StarTask>* _overflow_stack_depth;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
82 OopTaskQueue _claimed_stack_breadth;
a61af66fc99e Initial load
duke
parents:
diff changeset
83 GrowableArray<oop>* _overflow_stack_breadth;
a61af66fc99e Initial load
duke
parents:
diff changeset
84
a61af66fc99e Initial load
duke
parents:
diff changeset
85 bool _depth_first;
a61af66fc99e Initial load
duke
parents:
diff changeset
86 bool _totally_drain;
a61af66fc99e Initial load
duke
parents:
diff changeset
87 uint _target_stack_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
88
a61af66fc99e Initial load
duke
parents:
diff changeset
89 uint _array_chunk_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
90 uint _min_array_size_for_chunking;
a61af66fc99e Initial load
duke
parents:
diff changeset
91
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // Accessors
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
93 static PSOldGen* old_gen() { return _old_gen; }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
94 static MutableSpace* young_space() { return _young_space; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96 inline static PSPromotionManager* manager_array(int index);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
97 template <class T> inline void claim_or_forward_internal_depth(T* p);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
98 template <class T> inline void claim_or_forward_internal_breadth(T* p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
99
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
100 GrowableArray<StarTask>* overflow_stack_depth() { return _overflow_stack_depth; }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
101 GrowableArray<oop>* overflow_stack_breadth() { return _overflow_stack_breadth; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
102
a61af66fc99e Initial load
duke
parents:
diff changeset
103 // On the task queues we push reference locations as well as
a61af66fc99e Initial load
duke
parents:
diff changeset
104 // partially-scanned arrays (in the latter case, we push an oop to
a61af66fc99e Initial load
duke
parents:
diff changeset
105 // the from-space image of the array and the length on the
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // from-space image indicates how many entries on the array we still
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // need to scan; this is basically how ParNew does partial array
a61af66fc99e Initial load
duke
parents:
diff changeset
108 // scanning too). To be able to distinguish between reference
a61af66fc99e Initial load
duke
parents:
diff changeset
109 // locations and partially-scanned array oops we simply mask the
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // latter oops with 0x01. The next three methods do the masking,
a61af66fc99e Initial load
duke
parents:
diff changeset
111 // unmasking, and checking whether the oop is masked or not. Notice
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // that the signature of the mask and unmask methods looks a bit
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // strange, as they accept and return different types (oop and
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // oop*). This is because of the difference in types between what
a61af66fc99e Initial load
duke
parents:
diff changeset
115 // the task queue holds (oop*) and oops to partially-scanned arrays
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // (oop). We do all the necessary casting in the mask / unmask
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // methods to avoid sprinkling the rest of the code with more casts.
a61af66fc99e Initial load
duke
parents:
diff changeset
118
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
119 // These are added to the taskqueue so PS_CHUNKED_ARRAY_OOP_MASK (or any
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
120 // future masks) can't conflict with COMPRESSED_OOP_MASK
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
121 #define PS_CHUNKED_ARRAY_OOP_MASK 0x2
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
122
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
123 bool is_oop_masked(StarTask p) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
124 // If something is marked chunked it's always treated like wide oop*
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
125 return (((intptr_t)(oop*)p) & PS_CHUNKED_ARRAY_OOP_MASK) ==
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
126 PS_CHUNKED_ARRAY_OOP_MASK;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
128
a61af66fc99e Initial load
duke
parents:
diff changeset
129 oop* mask_chunked_array_oop(oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
130 assert(!is_oop_masked((oop*) obj), "invariant");
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
131 oop* ret = (oop*) ((uintptr_t)obj | PS_CHUNKED_ARRAY_OOP_MASK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
132 assert(is_oop_masked(ret), "invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
133 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
134 }
a61af66fc99e Initial load
duke
parents:
diff changeset
135
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
136 oop unmask_chunked_array_oop(StarTask p) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
137 assert(is_oop_masked(p), "invariant");
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
138 assert(!p.is_narrow(), "chunked array oops cannot be narrow");
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
139 oop *chunk = (oop*)p; // cast p to oop (uses conversion operator)
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
140 oop ret = oop((oop*)((uintptr_t)chunk & ~PS_CHUNKED_ARRAY_OOP_MASK));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
141 assert(!is_oop_masked((oop*) ret), "invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
142 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
143 }
a61af66fc99e Initial load
duke
parents:
diff changeset
144
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
145 template <class T> void process_array_chunk_work(oop obj,
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
146 int start, int end);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
147 void process_array_chunk(oop old);
a61af66fc99e Initial load
duke
parents:
diff changeset
148
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
149 template <class T> void push_depth(T* p) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
150 assert(depth_first(), "pre-condition");
a61af66fc99e Initial load
duke
parents:
diff changeset
151
a61af66fc99e Initial load
duke
parents:
diff changeset
152 #if PS_PM_STATS
a61af66fc99e Initial load
duke
parents:
diff changeset
153 ++_total_pushes;
a61af66fc99e Initial load
duke
parents:
diff changeset
154 #endif // PS_PM_STATS
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 if (!claimed_stack_depth()->push(p)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
157 overflow_stack_depth()->push(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
158 #if PS_PM_STATS
a61af66fc99e Initial load
duke
parents:
diff changeset
159 ++_overflow_pushes;
a61af66fc99e Initial load
duke
parents:
diff changeset
160 uint stack_length = (uint) overflow_stack_depth()->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
161 if (stack_length > _max_overflow_length) {
a61af66fc99e Initial load
duke
parents:
diff changeset
162 _max_overflow_length = stack_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
163 }
a61af66fc99e Initial load
duke
parents:
diff changeset
164 #endif // PS_PM_STATS
a61af66fc99e Initial load
duke
parents:
diff changeset
165 }
a61af66fc99e Initial load
duke
parents:
diff changeset
166 }
a61af66fc99e Initial load
duke
parents:
diff changeset
167
a61af66fc99e Initial load
duke
parents:
diff changeset
168 void push_breadth(oop o) {
a61af66fc99e Initial load
duke
parents:
diff changeset
169 assert(!depth_first(), "pre-condition");
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 #if PS_PM_STATS
a61af66fc99e Initial load
duke
parents:
diff changeset
172 ++_total_pushes;
a61af66fc99e Initial load
duke
parents:
diff changeset
173 #endif // PS_PM_STATS
a61af66fc99e Initial load
duke
parents:
diff changeset
174
a61af66fc99e Initial load
duke
parents:
diff changeset
175 if(!claimed_stack_breadth()->push(o)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
176 overflow_stack_breadth()->push(o);
a61af66fc99e Initial load
duke
parents:
diff changeset
177 #if PS_PM_STATS
a61af66fc99e Initial load
duke
parents:
diff changeset
178 ++_overflow_pushes;
a61af66fc99e Initial load
duke
parents:
diff changeset
179 uint stack_length = (uint) overflow_stack_breadth()->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
180 if (stack_length > _max_overflow_length) {
a61af66fc99e Initial load
duke
parents:
diff changeset
181 _max_overflow_length = stack_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
182 }
a61af66fc99e Initial load
duke
parents:
diff changeset
183 #endif // PS_PM_STATS
a61af66fc99e Initial load
duke
parents:
diff changeset
184 }
a61af66fc99e Initial load
duke
parents:
diff changeset
185 }
a61af66fc99e Initial load
duke
parents:
diff changeset
186
a61af66fc99e Initial load
duke
parents:
diff changeset
187 protected:
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
188 static OopStarTaskQueueSet* stack_array_depth() { return _stack_array_depth; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
189 static OopTaskQueueSet* stack_array_breadth() { return _stack_array_breadth; }
a61af66fc99e Initial load
duke
parents:
diff changeset
190
a61af66fc99e Initial load
duke
parents:
diff changeset
191 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
192 // Static
a61af66fc99e Initial load
duke
parents:
diff changeset
193 static void initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
194
a61af66fc99e Initial load
duke
parents:
diff changeset
195 static void pre_scavenge();
a61af66fc99e Initial load
duke
parents:
diff changeset
196 static void post_scavenge();
a61af66fc99e Initial load
duke
parents:
diff changeset
197
a61af66fc99e Initial load
duke
parents:
diff changeset
198 static PSPromotionManager* gc_thread_promotion_manager(int index);
a61af66fc99e Initial load
duke
parents:
diff changeset
199 static PSPromotionManager* vm_thread_promotion_manager();
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 static bool steal_depth(int queue_num, int* seed, StarTask& t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 assert(stack_array_depth() != NULL, "invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
203 return stack_array_depth()->steal(queue_num, seed, t);
a61af66fc99e Initial load
duke
parents:
diff changeset
204 }
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206 static bool steal_breadth(int queue_num, int* seed, Task& t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
207 assert(stack_array_breadth() != NULL, "invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
208 return stack_array_breadth()->steal(queue_num, seed, t);
a61af66fc99e Initial load
duke
parents:
diff changeset
209 }
a61af66fc99e Initial load
duke
parents:
diff changeset
210
a61af66fc99e Initial load
duke
parents:
diff changeset
211 PSPromotionManager();
a61af66fc99e Initial load
duke
parents:
diff changeset
212
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
214 OopStarTaskQueue* claimed_stack_depth() {
a61af66fc99e Initial load
duke
parents:
diff changeset
215 return &_claimed_stack_depth;
a61af66fc99e Initial load
duke
parents:
diff changeset
216 }
a61af66fc99e Initial load
duke
parents:
diff changeset
217 OopTaskQueue* claimed_stack_breadth() {
a61af66fc99e Initial load
duke
parents:
diff changeset
218 return &_claimed_stack_breadth;
a61af66fc99e Initial load
duke
parents:
diff changeset
219 }
a61af66fc99e Initial load
duke
parents:
diff changeset
220
a61af66fc99e Initial load
duke
parents:
diff changeset
221 bool young_gen_is_full() { return _young_gen_is_full; }
a61af66fc99e Initial load
duke
parents:
diff changeset
222
a61af66fc99e Initial load
duke
parents:
diff changeset
223 bool old_gen_is_full() { return _old_gen_is_full; }
a61af66fc99e Initial load
duke
parents:
diff changeset
224 void set_old_gen_is_full(bool state) { _old_gen_is_full = state; }
a61af66fc99e Initial load
duke
parents:
diff changeset
225
a61af66fc99e Initial load
duke
parents:
diff changeset
226 // Promotion methods
a61af66fc99e Initial load
duke
parents:
diff changeset
227 oop copy_to_survivor_space(oop o, bool depth_first);
a61af66fc99e Initial load
duke
parents:
diff changeset
228 oop oop_promotion_failed(oop obj, markOop obj_mark);
a61af66fc99e Initial load
duke
parents:
diff changeset
229
a61af66fc99e Initial load
duke
parents:
diff changeset
230 void reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
231
a61af66fc99e Initial load
duke
parents:
diff changeset
232 void flush_labs();
a61af66fc99e Initial load
duke
parents:
diff changeset
233 void drain_stacks(bool totally_drain) {
a61af66fc99e Initial load
duke
parents:
diff changeset
234 if (depth_first()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
235 drain_stacks_depth(totally_drain);
a61af66fc99e Initial load
duke
parents:
diff changeset
236 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
237 drain_stacks_breadth(totally_drain);
a61af66fc99e Initial load
duke
parents:
diff changeset
238 }
a61af66fc99e Initial load
duke
parents:
diff changeset
239 }
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
240 public:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
241 void drain_stacks_cond_depth() {
a61af66fc99e Initial load
duke
parents:
diff changeset
242 if (claimed_stack_depth()->size() > _target_stack_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
243 drain_stacks_depth(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
244 }
a61af66fc99e Initial load
duke
parents:
diff changeset
245 }
a61af66fc99e Initial load
duke
parents:
diff changeset
246 void drain_stacks_depth(bool totally_drain);
a61af66fc99e Initial load
duke
parents:
diff changeset
247 void drain_stacks_breadth(bool totally_drain);
a61af66fc99e Initial load
duke
parents:
diff changeset
248
a61af66fc99e Initial load
duke
parents:
diff changeset
249 bool claimed_stack_empty() {
a61af66fc99e Initial load
duke
parents:
diff changeset
250 if (depth_first()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
251 return claimed_stack_depth()->size() <= 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
252 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
253 return claimed_stack_breadth()->size() <= 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
254 }
a61af66fc99e Initial load
duke
parents:
diff changeset
255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
256 bool overflow_stack_empty() {
a61af66fc99e Initial load
duke
parents:
diff changeset
257 if (depth_first()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
258 return overflow_stack_depth()->length() <= 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
259 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
260 return overflow_stack_breadth()->length() <= 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
261 }
a61af66fc99e Initial load
duke
parents:
diff changeset
262 }
a61af66fc99e Initial load
duke
parents:
diff changeset
263 bool stacks_empty() {
a61af66fc99e Initial load
duke
parents:
diff changeset
264 return claimed_stack_empty() && overflow_stack_empty();
a61af66fc99e Initial load
duke
parents:
diff changeset
265 }
a61af66fc99e Initial load
duke
parents:
diff changeset
266 bool depth_first() {
a61af66fc99e Initial load
duke
parents:
diff changeset
267 return _depth_first;
a61af66fc99e Initial load
duke
parents:
diff changeset
268 }
a61af66fc99e Initial load
duke
parents:
diff changeset
269
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
270 inline void process_popped_location_depth(StarTask p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
271
a61af66fc99e Initial load
duke
parents:
diff changeset
272 inline void flush_prefetch_queue();
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
273 template <class T> inline void claim_or_forward_depth(T* p);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
274 template <class T> inline void claim_or_forward_breadth(T* p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
275
a61af66fc99e Initial load
duke
parents:
diff changeset
276 #if PS_PM_STATS
a61af66fc99e Initial load
duke
parents:
diff changeset
277 void increment_steals(oop* p = NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
278 _total_steals += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
279 if (p != NULL && is_oop_masked(p)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
280 _masked_steals += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
282 }
a61af66fc99e Initial load
duke
parents:
diff changeset
283 #endif // PS_PM_STATS
a61af66fc99e Initial load
duke
parents:
diff changeset
284 };