238 if (UseSemaphoreGCThreadsSynchronization) {
239 return new SemaphoreGangTaskDispatcher();
240 }
241
242 return new MutexGangTaskDispatcher();
243 }
244
245 WorkGang::WorkGang(const char* name,
246 uint workers,
247 bool are_GC_task_threads,
248 bool are_ConcurrentGC_threads) :
249 AbstractWorkGang(name, workers, are_GC_task_threads, are_ConcurrentGC_threads),
250 _dispatcher(create_dispatcher())
251 { }
252
253 AbstractGangWorker* WorkGang::allocate_worker(uint worker_id) {
254 return new GangWorker(this, worker_id);
255 }
256
257 void WorkGang::run_task(AbstractGangTask* task) {
258 _dispatcher->coordinator_execute_on_workers(task, active_workers());
259 }
260
261 AbstractGangWorker::AbstractGangWorker(AbstractWorkGang* gang, uint id) {
262 _gang = gang;
263 set_id(id);
264 set_name("%s#%d", gang->name(), id);
265 }
266
267 void AbstractGangWorker::run() {
268 initialize();
269 loop();
270 }
271
272 void AbstractGangWorker::initialize() {
273 this->record_stack_base_and_size();
274 this->initialize_named_thread();
275 assert(_gang != NULL, "No gang to run in");
276 os::set_priority(this, NearMaxPriority);
277 log_develop_trace(gc, workgang)("Running gang worker for gang %s id %u", gang()->name(), id());
278 // The VM thread should not execute here because MutexLocker's are used
|
238 if (UseSemaphoreGCThreadsSynchronization) {
239 return new SemaphoreGangTaskDispatcher();
240 }
241
242 return new MutexGangTaskDispatcher();
243 }
244
245 WorkGang::WorkGang(const char* name,
246 uint workers,
247 bool are_GC_task_threads,
248 bool are_ConcurrentGC_threads) :
249 AbstractWorkGang(name, workers, are_GC_task_threads, are_ConcurrentGC_threads),
250 _dispatcher(create_dispatcher())
251 { }
252
253 AbstractGangWorker* WorkGang::allocate_worker(uint worker_id) {
254 return new GangWorker(this, worker_id);
255 }
256
257 void WorkGang::run_task(AbstractGangTask* task) {
258 run_task(task, active_workers());
259 }
260
261 void WorkGang::run_task(AbstractGangTask* task, uint num_workers) {
262 guarantee(num_workers <= active_workers(),
263 "Trying to execute task %s with %u workers which is more than the amount of active workers %u.",
264 task->name(), num_workers, active_workers());
265 guarantee(num_workers > 0, "Trying to execute task %s with zero workers", task->name());
266 _dispatcher->coordinator_execute_on_workers(task, num_workers);
267 }
268
269 AbstractGangWorker::AbstractGangWorker(AbstractWorkGang* gang, uint id) {
270 _gang = gang;
271 set_id(id);
272 set_name("%s#%d", gang->name(), id);
273 }
274
275 void AbstractGangWorker::run() {
276 initialize();
277 loop();
278 }
279
280 void AbstractGangWorker::initialize() {
281 this->record_stack_base_and_size();
282 this->initialize_named_thread();
283 assert(_gang != NULL, "No gang to run in");
284 os::set_priority(this, NearMaxPriority);
285 log_develop_trace(gc, workgang)("Running gang worker for gang %s id %u", gang()->name(), id());
286 // The VM thread should not execute here because MutexLocker's are used
|