Mercurial > hg > truffle
annotate src/share/vm/utilities/workgroup.hpp @ 6972:bd7a7ce2e264
6830717: replay of compilations would help with debugging
Summary: When java process crashed in compiler thread, repeat the compilation process will help finding root cause. This is done with using SA dump application class data and replay data from core dump, then use debug version of jvm to recompile the problematic java method.
Reviewed-by: kvn, twisti, sspitsyn
Contributed-by: yumin.qi@oracle.com
author | minqi |
---|---|
date | Mon, 12 Nov 2012 14:03:53 -0800 |
parents | b9a9ed0f8eeb |
children | f34d701e952e |
rev | line source |
---|---|
0 | 1 /* |
6842
b9a9ed0f8eeb
7197424: update copyright year to match last edit in jdk8 hotspot repository
mikael
parents:
6197
diff
changeset
|
2 * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. |
0 | 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:
579
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
579
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:
579
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #ifndef SHARE_VM_UTILITIES_WORKGROUP_HPP |
26 #define SHARE_VM_UTILITIES_WORKGROUP_HPP | |
27 | |
28 #include "utilities/taskqueue.hpp" | |
29 #ifdef TARGET_OS_FAMILY_linux | |
30 # include "thread_linux.inline.hpp" | |
31 #endif | |
32 #ifdef TARGET_OS_FAMILY_solaris | |
33 # include "thread_solaris.inline.hpp" | |
34 #endif | |
35 #ifdef TARGET_OS_FAMILY_windows | |
36 # include "thread_windows.inline.hpp" | |
37 #endif | |
3960 | 38 #ifdef TARGET_OS_FAMILY_bsd |
39 # include "thread_bsd.inline.hpp" | |
40 #endif | |
1972 | 41 |
2369
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1972
diff
changeset
|
42 // Task class hierarchy: |
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1972
diff
changeset
|
43 // AbstractGangTask |
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1972
diff
changeset
|
44 // AbstractGangTaskWOopQueues |
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1972
diff
changeset
|
45 // |
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1972
diff
changeset
|
46 // Gang/Group class hierarchy: |
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1972
diff
changeset
|
47 // AbstractWorkGang |
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1972
diff
changeset
|
48 // WorkGang |
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1972
diff
changeset
|
49 // FlexibleWorkGang |
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1972
diff
changeset
|
50 // YieldingFlexibleWorkGang (defined in another file) |
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1972
diff
changeset
|
51 // |
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1972
diff
changeset
|
52 // Worker class hierarchy: |
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1972
diff
changeset
|
53 // GangWorker (subclass of WorkerThread) |
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1972
diff
changeset
|
54 // YieldingFlexibleGangWorker (defined in another file) |
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
1972
diff
changeset
|
55 |
0 | 56 // Forward declarations of classes defined here |
57 | |
58 class WorkGang; | |
59 class GangWorker; | |
60 class YieldingFlexibleGangWorker; | |
61 class YieldingFlexibleGangTask; | |
62 class WorkData; | |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
63 class AbstractWorkGang; |
0 | 64 |
65 // An abstract task to be worked on by a gang. | |
66 // You subclass this to supply your own work() method | |
549
fe3d7c11b4b7
6700941: G1: allocation spec missing for some G1 classes
apetrusenko
parents:
342
diff
changeset
|
67 class AbstractGangTask VALUE_OBJ_CLASS_SPEC { |
0 | 68 public: |
69 // The abstract work method. | |
70 // The argument tells you which member of the gang you are. | |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
71 virtual void work(uint worker_id) = 0; |
0 | 72 |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
73 // This method configures the task for proper termination. |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
74 // Some tasks do not have any requirements on termination |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
75 // and may inherit this method that does nothing. Some |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
76 // tasks do some coordination on termination and override |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
77 // this method to implement that coordination. |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
78 virtual void set_for_termination(int active_workers) {}; |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
79 |
0 | 80 // Debugging accessor for the name. |
81 const char* name() const PRODUCT_RETURN_(return NULL;); | |
82 int counter() { return _counter; } | |
83 void set_counter(int value) { _counter = value; } | |
84 int *address_of_counter() { return &_counter; } | |
85 | |
86 // RTTI | |
87 NOT_PRODUCT(virtual bool is_YieldingFlexibleGang_task() const { | |
88 return false; | |
89 }) | |
90 | |
91 private: | |
92 NOT_PRODUCT(const char* _name;) | |
93 // ??? Should a task have a priority associated with it? | |
94 // ??? Or can the run method adjust priority as needed? | |
95 int _counter; | |
96 | |
97 protected: | |
98 // Constructor and desctructor: only construct subclasses. | |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
99 AbstractGangTask(const char* name) |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
100 { |
0 | 101 NOT_PRODUCT(_name = name); |
102 _counter = 0; | |
103 } | |
104 virtual ~AbstractGangTask() { } | |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
105 |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
106 public: |
0 | 107 }; |
108 | |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
109 class AbstractGangTaskWOopQueues : public AbstractGangTask { |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
110 OopTaskQueueSet* _queues; |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
111 ParallelTaskTerminator _terminator; |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
112 public: |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
113 AbstractGangTaskWOopQueues(const char* name, OopTaskQueueSet* queues) : |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
114 AbstractGangTask(name), _queues(queues), _terminator(0, _queues) {} |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
115 ParallelTaskTerminator* terminator() { return &_terminator; } |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
116 virtual void set_for_termination(int active_workers) { |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
117 terminator()->reset_for_reuse(active_workers); |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
118 } |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
119 OopTaskQueueSet* queues() { return _queues; } |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
120 }; |
0 | 121 |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
122 |
0 | 123 // Class AbstractWorkGang: |
124 // An abstract class representing a gang of workers. | |
125 // You subclass this to supply an implementation of run_task(). | |
6197 | 126 class AbstractWorkGang: public CHeapObj<mtInternal> { |
0 | 127 // Here's the public interface to this class. |
128 public: | |
129 // Constructor and destructor. | |
342 | 130 AbstractWorkGang(const char* name, bool are_GC_task_threads, |
131 bool are_ConcurrentGC_threads); | |
0 | 132 ~AbstractWorkGang(); |
133 // Run a task, returns when the task is done (or terminated). | |
134 virtual void run_task(AbstractGangTask* task) = 0; | |
135 // Stop and terminate all workers. | |
136 virtual void stop(); | |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
137 // Return true if more workers should be applied to the task. |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
138 virtual bool needs_more_workers() const { return true; } |
0 | 139 public: |
140 // Debugging. | |
141 const char* name() const; | |
142 protected: | |
143 // Initialize only instance data. | |
342 | 144 const bool _are_GC_task_threads; |
145 const bool _are_ConcurrentGC_threads; | |
0 | 146 // Printing support. |
147 const char* _name; | |
148 // The monitor which protects these data, | |
149 // and notifies of changes in it. | |
150 Monitor* _monitor; | |
151 // The count of the number of workers in the gang. | |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
152 uint _total_workers; |
0 | 153 // Whether the workers should terminate. |
154 bool _terminate; | |
155 // The array of worker threads for this gang. | |
156 // This is only needed for cleaning up. | |
157 GangWorker** _gang_workers; | |
158 // The task for this gang. | |
159 AbstractGangTask* _task; | |
160 // A sequence number for the current task. | |
161 int _sequence_number; | |
162 // The number of started workers. | |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
163 uint _started_workers; |
0 | 164 // The number of finished workers. |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
165 uint _finished_workers; |
0 | 166 public: |
167 // Accessors for fields | |
168 Monitor* monitor() const { | |
169 return _monitor; | |
170 } | |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
171 uint total_workers() const { |
0 | 172 return _total_workers; |
173 } | |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
174 virtual uint active_workers() const { |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
175 return _total_workers; |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
176 } |
0 | 177 bool terminate() const { |
178 return _terminate; | |
179 } | |
180 GangWorker** gang_workers() const { | |
181 return _gang_workers; | |
182 } | |
183 AbstractGangTask* task() const { | |
184 return _task; | |
185 } | |
186 int sequence_number() const { | |
187 return _sequence_number; | |
188 } | |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
189 uint started_workers() const { |
0 | 190 return _started_workers; |
191 } | |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
192 uint finished_workers() const { |
0 | 193 return _finished_workers; |
194 } | |
342 | 195 bool are_GC_task_threads() const { |
196 return _are_GC_task_threads; | |
197 } | |
198 bool are_ConcurrentGC_threads() const { | |
199 return _are_ConcurrentGC_threads; | |
0 | 200 } |
201 // Predicates. | |
202 bool is_idle() const { | |
203 return (task() == NULL); | |
204 } | |
205 // Return the Ith gang worker. | |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
206 GangWorker* gang_worker(uint i) const; |
0 | 207 |
208 void threads_do(ThreadClosure* tc) const; | |
209 | |
210 // Printing | |
211 void print_worker_threads_on(outputStream *st) const; | |
212 void print_worker_threads() const { | |
213 print_worker_threads_on(tty); | |
214 } | |
215 | |
216 protected: | |
217 friend class GangWorker; | |
218 friend class YieldingFlexibleGangWorker; | |
219 // Note activation and deactivation of workers. | |
220 // These methods should only be called with the mutex held. | |
221 void internal_worker_poll(WorkData* data) const; | |
222 void internal_note_start(); | |
223 void internal_note_finish(); | |
224 }; | |
225 | |
226 class WorkData: public StackObj { | |
227 // This would be a struct, but I want accessor methods. | |
228 private: | |
229 bool _terminate; | |
230 AbstractGangTask* _task; | |
231 int _sequence_number; | |
232 public: | |
233 // Constructor and destructor | |
234 WorkData() { | |
235 _terminate = false; | |
236 _task = NULL; | |
237 _sequence_number = 0; | |
238 } | |
239 ~WorkData() { | |
240 } | |
241 // Accessors and modifiers | |
242 bool terminate() const { return _terminate; } | |
243 void set_terminate(bool value) { _terminate = value; } | |
244 AbstractGangTask* task() const { return _task; } | |
245 void set_task(AbstractGangTask* value) { _task = value; } | |
246 int sequence_number() const { return _sequence_number; } | |
247 void set_sequence_number(int value) { _sequence_number = value; } | |
248 | |
249 YieldingFlexibleGangTask* yf_task() const { | |
250 return (YieldingFlexibleGangTask*)_task; | |
251 } | |
252 }; | |
253 | |
254 // Class WorkGang: | |
255 class WorkGang: public AbstractWorkGang { | |
256 public: | |
257 // Constructor | |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
258 WorkGang(const char* name, uint workers, |
342 | 259 bool are_GC_task_threads, bool are_ConcurrentGC_threads); |
0 | 260 // Run a task, returns when the task is done (or terminated). |
261 virtual void run_task(AbstractGangTask* task); | |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
262 void run_task(AbstractGangTask* task, uint no_of_parallel_workers); |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
263 // Allocate a worker and return a pointer to it. |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
264 virtual GangWorker* allocate_worker(uint which); |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
265 // Initialize workers in the gang. Return true if initialization |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
266 // succeeded. The type of the worker can be overridden in a derived |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
267 // class with the appropriate implementation of allocate_worker(). |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
268 bool initialize_workers(); |
0 | 269 }; |
270 | |
271 // Class GangWorker: | |
272 // Several instances of this class run in parallel as workers for a gang. | |
273 class GangWorker: public WorkerThread { | |
274 public: | |
275 // Constructors and destructor. | |
276 GangWorker(AbstractWorkGang* gang, uint id); | |
277 | |
278 // The only real method: run a task for the gang. | |
279 virtual void run(); | |
280 // Predicate for Thread | |
281 virtual bool is_GC_task_thread() const; | |
342 | 282 virtual bool is_ConcurrentGC_thread() const; |
0 | 283 // Printing |
284 void print_on(outputStream* st) const; | |
285 virtual void print() const { print_on(tty); } | |
286 protected: | |
287 AbstractWorkGang* _gang; | |
288 | |
289 virtual void initialize(); | |
290 virtual void loop(); | |
291 | |
292 public: | |
293 AbstractWorkGang* gang() const { return _gang; } | |
294 }; | |
295 | |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
296 // Dynamic number of worker threads |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
297 // |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
298 // This type of work gang is used to run different numbers of |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
299 // worker threads at different times. The |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
300 // number of workers run for a task is "_active_workers" |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
301 // instead of "_total_workers" in a WorkGang. The method |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
302 // "needs_more_workers()" returns true until "_active_workers" |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
303 // have been started and returns false afterwards. The |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
304 // implementation of "needs_more_workers()" in WorkGang always |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
305 // returns true so that all workers are started. The method |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
306 // "loop()" in GangWorker was modified to ask "needs_more_workers()" |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
307 // in its loop to decide if it should start working on a task. |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
308 // A worker in "loop()" waits for notification on the WorkGang |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
309 // monitor and execution of each worker as it checks for work |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
310 // is serialized via the same monitor. The "needs_more_workers()" |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
311 // call is serialized and additionally the calculation for the |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
312 // "part" (effectively the worker id for executing the task) is |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
313 // serialized to give each worker a unique "part". Workers that |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
314 // are not needed for this tasks (i.e., "_active_workers" have |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
315 // been started before it, continue to wait for work. |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
316 |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
317 class FlexibleWorkGang: public WorkGang { |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
318 // The currently active workers in this gang. |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
319 // This is a number that is dynamically adjusted |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
320 // and checked in the run_task() method at each invocation. |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
321 // As described above _active_workers determines the number |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
322 // of threads started on a task. It must also be used to |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
323 // determine completion. |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
324 |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
325 protected: |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
326 uint _active_workers; |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
327 public: |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
328 // Constructor and destructor. |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
329 // Initialize active_workers to a minimum value. Setting it to |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
330 // the parameter "workers" will initialize it to a maximum |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
331 // value which is not desirable. |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
332 FlexibleWorkGang(const char* name, uint workers, |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
333 bool are_GC_task_threads, |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
334 bool are_ConcurrentGC_threads) : |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
335 WorkGang(name, workers, are_GC_task_threads, are_ConcurrentGC_threads), |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
336 _active_workers(UseDynamicNumberOfGCThreads ? 1U : ParallelGCThreads) {} |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
337 // Accessors for fields |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
338 virtual uint active_workers() const { return _active_workers; } |
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
339 void set_active_workers(uint v) { |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
340 assert(v <= _total_workers, |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
341 "Trying to set more workers active than there are"); |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
342 _active_workers = MIN2(v, _total_workers); |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
343 assert(v != 0, "Trying to set active workers to 0"); |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
344 _active_workers = MAX2(1U, _active_workers); |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
345 assert(UseDynamicNumberOfGCThreads || _active_workers == _total_workers, |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
346 "Unless dynamic should use total workers"); |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
347 } |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
348 virtual void run_task(AbstractGangTask* task); |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
349 virtual bool needs_more_workers() const { |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
350 return _started_workers < _active_workers; |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
351 } |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
352 }; |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
353 |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
354 // Work gangs in garbage collectors: 2009-06-10 |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
355 // |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
356 // SharedHeap - work gang for stop-the-world parallel collection. |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
357 // Used by |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
358 // ParNewGeneration |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
359 // CMSParRemarkTask |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
360 // CMSRefProcTaskExecutor |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
361 // G1CollectedHeap |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
362 // G1ParFinalCountTask |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
363 // ConcurrentMark |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
364 // CMSCollector |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
365 |
0 | 366 // A class that acts as a synchronisation barrier. Workers enter |
367 // the barrier and must wait until all other workers have entered | |
368 // before any of them may leave. | |
369 | |
370 class WorkGangBarrierSync : public StackObj { | |
371 protected: | |
372 Monitor _monitor; | |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
373 uint _n_workers; |
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
374 uint _n_completed; |
342 | 375 bool _should_reset; |
0 | 376 |
342 | 377 Monitor* monitor() { return &_monitor; } |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
378 uint n_workers() { return _n_workers; } |
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
379 uint n_completed() { return _n_completed; } |
342 | 380 bool should_reset() { return _should_reset; } |
0 | 381 |
342 | 382 void zero_completed() { _n_completed = 0; } |
383 void inc_completed() { _n_completed++; } | |
384 | |
385 void set_should_reset(bool v) { _should_reset = v; } | |
0 | 386 |
387 public: | |
388 WorkGangBarrierSync(); | |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
389 WorkGangBarrierSync(uint n_workers, const char* name); |
0 | 390 |
391 // Set the number of workers that will use the barrier. | |
392 // Must be called before any of the workers start running. | |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
393 void set_n_workers(uint n_workers); |
0 | 394 |
395 // Enter the barrier. A worker that enters the barrier will | |
396 // not be allowed to leave until all other threads have | |
397 // also entered the barrier. | |
398 void enter(); | |
399 }; | |
400 | |
401 // A class to manage claiming of subtasks within a group of tasks. The | |
402 // subtasks will be identified by integer indices, usually elements of an | |
403 // enumeration type. | |
404 | |
6197 | 405 class SubTasksDone: public CHeapObj<mtInternal> { |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
406 uint* _tasks; |
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
407 uint _n_tasks; |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
408 // _n_threads is used to determine when a sub task is done. |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
409 // It does not control how many threads will execute the subtask |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
410 // but must be initialized to the number that do execute the task |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
411 // in order to correctly decide when the subtask is done (all the |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
3960
diff
changeset
|
412 // threads working on the task have finished). |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
413 uint _n_threads; |
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
414 uint _threads_completed; |
0 | 415 #ifdef ASSERT |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
416 volatile uint _claimed; |
0 | 417 #endif |
418 | |
419 // Set all tasks to unclaimed. | |
420 void clear(); | |
421 | |
422 public: | |
423 // Initializes "this" to a state in which there are "n" tasks to be | |
424 // processed, none of the which are originally claimed. The number of | |
425 // threads doing the tasks is initialized 1. | |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
426 SubTasksDone(uint n); |
0 | 427 |
428 // True iff the object is in a valid state. | |
429 bool valid(); | |
430 | |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
431 // Get/set the number of parallel threads doing the tasks to "t". Can only |
0 | 432 // be called before tasks start or after they are complete. |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
433 uint n_threads() { return _n_threads; } |
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
434 void set_n_threads(uint t); |
0 | 435 |
436 // Returns "false" if the task "t" is unclaimed, and ensures that task is | |
437 // claimed. The task "t" is required to be within the range of "this". | |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
438 bool is_task_claimed(uint t); |
0 | 439 |
440 // The calling thread asserts that it has attempted to claim all the | |
441 // tasks that it will try to claim. Every thread in the parallel task | |
442 // must execute this. (When the last thread does so, the task array is | |
443 // cleared.) | |
444 void all_tasks_completed(); | |
445 | |
446 // Destructor. | |
447 ~SubTasksDone(); | |
448 }; | |
449 | |
450 // As above, but for sequential tasks, i.e. instead of claiming | |
451 // sub-tasks from a set (possibly an enumeration), claim sub-tasks | |
452 // in sequential order. This is ideal for claiming dynamically | |
453 // partitioned tasks (like striding in the parallel remembered | |
454 // set scanning). Note that unlike the above class this is | |
455 // a stack object - is there any reason for it not to be? | |
456 | |
457 class SequentialSubTasksDone : public StackObj { | |
458 protected: | |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
459 uint _n_tasks; // Total number of tasks available. |
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
460 uint _n_claimed; // Number of tasks claimed. |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
461 // _n_threads is used to determine when a sub task is done. |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
462 // See comments on SubTasksDone::_n_threads |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
463 uint _n_threads; // Total number of parallel threads. |
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
464 uint _n_completed; // Number of completed threads. |
0 | 465 |
466 void clear(); | |
467 | |
468 public: | |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
469 SequentialSubTasksDone() { |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
470 clear(); |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
471 } |
0 | 472 ~SequentialSubTasksDone() {} |
473 | |
474 // True iff the object is in a valid state. | |
475 bool valid(); | |
476 | |
477 // number of tasks | |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
478 uint n_tasks() const { return _n_tasks; } |
0 | 479 |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1552
diff
changeset
|
480 // Get/set the number of parallel threads doing the tasks to t. |
0 | 481 // Should be called before the task starts but it is safe |
482 // to call this once a task is running provided that all | |
483 // threads agree on the number of threads. | |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
484 uint n_threads() { return _n_threads; } |
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
485 void set_n_threads(uint t) { _n_threads = t; } |
0 | 486 |
487 // Set the number of tasks to be claimed to t. As above, | |
488 // should be called before the tasks start but it is safe | |
489 // to call this once a task is running provided all threads | |
490 // agree on the number of tasks. | |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
491 void set_n_tasks(uint t) { _n_tasks = t; } |
0 | 492 |
493 // Returns false if the next task in the sequence is unclaimed, | |
494 // and ensures that it is claimed. Will set t to be the index | |
495 // of the claimed task in the sequence. Will return true if | |
496 // the task cannot be claimed and there are none left to claim. | |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4095
diff
changeset
|
497 bool is_task_claimed(uint& t); |
0 | 498 |
499 // The calling thread asserts that it has attempted to claim | |
500 // all the tasks it possibly can in the sequence. Every thread | |
501 // claiming tasks must promise call this. Returns true if this | |
502 // is the last thread to complete so that the thread can perform | |
503 // cleanup if necessary. | |
504 bool all_tasks_completed(); | |
505 }; | |
342 | 506 |
507 // Represents a set of free small integer ids. | |
508 class FreeIdSet { | |
509 enum { | |
510 end_of_list = -1, | |
511 claimed = -2 | |
512 }; | |
513 | |
514 int _sz; | |
515 Monitor* _mon; | |
516 | |
517 int* _ids; | |
518 int _hd; | |
519 int _waiters; | |
520 int _claimed; | |
521 | |
522 static bool _safepoint; | |
523 typedef FreeIdSet* FreeIdSetPtr; | |
524 static const int NSets = 10; | |
525 static FreeIdSetPtr _sets[NSets]; | |
526 static bool _stat_init; | |
527 int _index; | |
528 | |
529 public: | |
530 FreeIdSet(int sz, Monitor* mon); | |
531 ~FreeIdSet(); | |
532 | |
533 static void set_safepoint(bool b); | |
534 | |
535 // Attempt to claim the given id permanently. Returns "true" iff | |
536 // successful. | |
537 bool claim_perm_id(int i); | |
538 | |
539 // Returns an unclaimed parallel id (waiting for one to be released if | |
540 // necessary). Returns "-1" if a GC wakes up a wait for an id. | |
541 int claim_par_id(); | |
542 | |
543 void release_par_id(int id); | |
544 }; | |
1972 | 545 |
546 #endif // SHARE_VM_UTILITIES_WORKGROUP_HPP |