Mercurial > hg > truffle
annotate src/share/vm/utilities/workgroup.hpp @ 7090:05ce1defa4f9
Common out some parts of UnsafeLoad/Store in UnsafeAccess
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Thu, 29 Nov 2012 13:24:08 +0100 |
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 |