< prev index next >

src/share/vm/gc/shared/workgroup.cpp

Print this page
rev 11040 : 8155232: Augment Workgang to run task with a given number of threads
Summary: Add a method to run a WorkGang with a set number of threads.
Reviewed-by:
rev 11041 : [mq]: 8155232-stefank-review


 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


< prev index next >