src/hotspot/share/gc/parallel/gcTaskManager.cpp
changeset 57773 5cbc3bd9fdfd
parent 57772 2410b04f074f
child 57774 21dccfac0ec5
equal deleted inserted replaced
57772:2410b04f074f 57773:5cbc3bd9fdfd
     1 /*
       
     2  * Copyright (c) 2002, 2019, Oracle and/or its affiliates. All rights reserved.
       
     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  *
       
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       
    20  * or visit www.oracle.com if you need additional information or have any
       
    21  * questions.
       
    22  *
       
    23  */
       
    24 
       
    25 #include "precompiled.hpp"
       
    26 #include "gc/parallel/gcTaskManager.hpp"
       
    27 #include "gc/parallel/gcTaskThread.hpp"
       
    28 #include "gc/shared/gcId.hpp"
       
    29 #include "gc/shared/workerManager.hpp"
       
    30 #include "gc/shared/workerPolicy.hpp"
       
    31 #include "logging/log.hpp"
       
    32 #include "logging/logStream.hpp"
       
    33 #include "memory/allocation.hpp"
       
    34 #include "memory/allocation.inline.hpp"
       
    35 #include "memory/resourceArea.hpp"
       
    36 #include "runtime/mutex.hpp"
       
    37 #include "runtime/mutexLocker.hpp"
       
    38 #include "runtime/orderAccess.hpp"
       
    39 #include "runtime/os.hpp"
       
    40 
       
    41 //
       
    42 // GCTask
       
    43 //
       
    44 
       
    45 const char* GCTask::Kind::to_string(kind value) {
       
    46   const char* result = "unknown GCTask kind";
       
    47   switch (value) {
       
    48   default:
       
    49     result = "unknown GCTask kind";
       
    50     break;
       
    51   case unknown_task:
       
    52     result = "unknown task";
       
    53     break;
       
    54   case ordinary_task:
       
    55     result = "ordinary task";
       
    56     break;
       
    57   case wait_for_barrier_task:
       
    58     result = "wait for barrier task";
       
    59     break;
       
    60   case noop_task:
       
    61     result = "noop task";
       
    62     break;
       
    63   case idle_task:
       
    64     result = "idle task";
       
    65     break;
       
    66   }
       
    67   return result;
       
    68 };
       
    69 
       
    70 GCTask::GCTask() {
       
    71   initialize(Kind::ordinary_task, GCId::current());
       
    72 }
       
    73 
       
    74 GCTask::GCTask(Kind::kind kind) {
       
    75   initialize(kind, GCId::current());
       
    76 }
       
    77 
       
    78 GCTask::GCTask(Kind::kind kind, uint gc_id) {
       
    79   initialize(kind, gc_id);
       
    80 }
       
    81 
       
    82 void GCTask::initialize(Kind::kind kind, uint gc_id) {
       
    83   _kind = kind;
       
    84   _affinity = GCTaskManager::sentinel_worker();
       
    85   _older = NULL;
       
    86   _newer = NULL;
       
    87   _gc_id = gc_id;
       
    88 }
       
    89 
       
    90 void GCTask::destruct() {
       
    91   assert(older() == NULL, "shouldn't have an older task");
       
    92   assert(newer() == NULL, "shouldn't have a newer task");
       
    93   // Nothing to do.
       
    94 }
       
    95 
       
    96 NOT_PRODUCT(
       
    97 void GCTask::print(const char* message) const {
       
    98   tty->print(INTPTR_FORMAT " <- " INTPTR_FORMAT "(%u) -> " INTPTR_FORMAT,
       
    99              p2i(newer()), p2i(this), affinity(), p2i(older()));
       
   100 }
       
   101 )
       
   102 
       
   103 //
       
   104 // GCTaskQueue
       
   105 //
       
   106 
       
   107 GCTaskQueue* GCTaskQueue::create() {
       
   108   GCTaskQueue* result = new GCTaskQueue(false);
       
   109   if (TraceGCTaskQueue) {
       
   110     tty->print_cr("GCTaskQueue::create()"
       
   111                   " returns " INTPTR_FORMAT, p2i(result));
       
   112   }
       
   113   return result;
       
   114 }
       
   115 
       
   116 GCTaskQueue* GCTaskQueue::create_on_c_heap() {
       
   117   GCTaskQueue* result = new(ResourceObj::C_HEAP, mtGC) GCTaskQueue(true);
       
   118   if (TraceGCTaskQueue) {
       
   119     tty->print_cr("GCTaskQueue::create_on_c_heap()"
       
   120                   " returns " INTPTR_FORMAT,
       
   121                   p2i(result));
       
   122   }
       
   123   return result;
       
   124 }
       
   125 
       
   126 GCTaskQueue::GCTaskQueue(bool on_c_heap) :
       
   127   _is_c_heap_obj(on_c_heap) {
       
   128   initialize();
       
   129   if (TraceGCTaskQueue) {
       
   130     tty->print_cr("[" INTPTR_FORMAT "]"
       
   131                   " GCTaskQueue::GCTaskQueue() constructor",
       
   132                   p2i(this));
       
   133   }
       
   134 }
       
   135 
       
   136 void GCTaskQueue::destruct() {
       
   137   // Nothing to do.
       
   138 }
       
   139 
       
   140 void GCTaskQueue::destroy(GCTaskQueue* that) {
       
   141   if (TraceGCTaskQueue) {
       
   142     tty->print_cr("[" INTPTR_FORMAT "]"
       
   143                   " GCTaskQueue::destroy()"
       
   144                   "  is_c_heap_obj:  %s",
       
   145                   p2i(that),
       
   146                   that->is_c_heap_obj() ? "true" : "false");
       
   147   }
       
   148   // That instance may have been allocated as a CHeapObj,
       
   149   // in which case we have to free it explicitly.
       
   150   if (that != NULL) {
       
   151     that->destruct();
       
   152     assert(that->is_empty(), "should be empty");
       
   153     if (that->is_c_heap_obj()) {
       
   154       FreeHeap(that);
       
   155     }
       
   156   }
       
   157 }
       
   158 
       
   159 void GCTaskQueue::initialize() {
       
   160   set_insert_end(NULL);
       
   161   set_remove_end(NULL);
       
   162   set_length(0);
       
   163 }
       
   164 
       
   165 // Enqueue one task.
       
   166 void GCTaskQueue::enqueue(GCTask* task) {
       
   167   if (TraceGCTaskQueue) {
       
   168     tty->print_cr("[" INTPTR_FORMAT "]"
       
   169                   " GCTaskQueue::enqueue(task: "
       
   170                   INTPTR_FORMAT ")",
       
   171                   p2i(this), p2i(task));
       
   172     print("before:");
       
   173   }
       
   174   assert(task != NULL, "shouldn't have null task");
       
   175   assert(task->older() == NULL, "shouldn't be on queue");
       
   176   assert(task->newer() == NULL, "shouldn't be on queue");
       
   177   task->set_newer(NULL);
       
   178   task->set_older(insert_end());
       
   179   if (is_empty()) {
       
   180     set_remove_end(task);
       
   181   } else {
       
   182     insert_end()->set_newer(task);
       
   183   }
       
   184   set_insert_end(task);
       
   185   increment_length();
       
   186   verify_length();
       
   187   if (TraceGCTaskQueue) {
       
   188     print("after:");
       
   189   }
       
   190 }
       
   191 
       
   192 // Enqueue a whole list of tasks.  Empties the argument list.
       
   193 void GCTaskQueue::enqueue(GCTaskQueue* list) {
       
   194   if (TraceGCTaskQueue) {
       
   195     tty->print_cr("[" INTPTR_FORMAT "]"
       
   196                   " GCTaskQueue::enqueue(list: "
       
   197                   INTPTR_FORMAT ")",
       
   198                   p2i(this), p2i(list));
       
   199     print("before:");
       
   200     list->print("list:");
       
   201   }
       
   202   if (list->is_empty()) {
       
   203     // Enqueueing the empty list: nothing to do.
       
   204     return;
       
   205   }
       
   206   uint list_length = list->length();
       
   207   if (is_empty()) {
       
   208     // Enqueueing to empty list: just acquire elements.
       
   209     set_insert_end(list->insert_end());
       
   210     set_remove_end(list->remove_end());
       
   211     set_length(list_length);
       
   212   } else {
       
   213     // Prepend argument list to our queue.
       
   214     list->remove_end()->set_older(insert_end());
       
   215     insert_end()->set_newer(list->remove_end());
       
   216     set_insert_end(list->insert_end());
       
   217     set_length(length() + list_length);
       
   218     // empty the argument list.
       
   219   }
       
   220   list->initialize();
       
   221   if (TraceGCTaskQueue) {
       
   222     print("after:");
       
   223     list->print("list:");
       
   224   }
       
   225   verify_length();
       
   226 }
       
   227 
       
   228 // Dequeue one task.
       
   229 GCTask* GCTaskQueue::dequeue() {
       
   230   if (TraceGCTaskQueue) {
       
   231     tty->print_cr("[" INTPTR_FORMAT "]"
       
   232                   " GCTaskQueue::dequeue()", p2i(this));
       
   233     print("before:");
       
   234   }
       
   235   assert(!is_empty(), "shouldn't dequeue from empty list");
       
   236   GCTask* result = remove();
       
   237   assert(result != NULL, "shouldn't have NULL task");
       
   238   if (TraceGCTaskQueue) {
       
   239     tty->print_cr("    return: " INTPTR_FORMAT, p2i(result));
       
   240     print("after:");
       
   241   }
       
   242   return result;
       
   243 }
       
   244 
       
   245 // Dequeue one task, preferring one with affinity.
       
   246 GCTask* GCTaskQueue::dequeue(uint affinity) {
       
   247   if (TraceGCTaskQueue) {
       
   248     tty->print_cr("[" INTPTR_FORMAT "]"
       
   249                   " GCTaskQueue::dequeue(%u)", p2i(this), affinity);
       
   250     print("before:");
       
   251   }
       
   252   assert(!is_empty(), "shouldn't dequeue from empty list");
       
   253   // Look down to the next barrier for a task with this affinity.
       
   254   GCTask* result = NULL;
       
   255   for (GCTask* element = remove_end();
       
   256        element != NULL;
       
   257        element = element->newer()) {
       
   258     if (element->is_barrier_task()) {
       
   259       // Don't consider barrier tasks, nor past them.
       
   260       result = NULL;
       
   261       break;
       
   262     }
       
   263     if (element->affinity() == affinity) {
       
   264       result = remove(element);
       
   265       break;
       
   266     }
       
   267   }
       
   268   // If we didn't find anything with affinity, just take the next task.
       
   269   if (result == NULL) {
       
   270     result = remove();
       
   271   }
       
   272   if (TraceGCTaskQueue) {
       
   273     tty->print_cr("    return: " INTPTR_FORMAT, p2i(result));
       
   274     print("after:");
       
   275   }
       
   276   return result;
       
   277 }
       
   278 
       
   279 GCTask* GCTaskQueue::remove() {
       
   280   // Dequeue from remove end.
       
   281   GCTask* result = remove_end();
       
   282   assert(result != NULL, "shouldn't have null task");
       
   283   assert(result->older() == NULL, "not the remove_end");
       
   284   set_remove_end(result->newer());
       
   285   if (remove_end() == NULL) {
       
   286     assert(insert_end() == result, "not a singleton");
       
   287     set_insert_end(NULL);
       
   288   } else {
       
   289     remove_end()->set_older(NULL);
       
   290   }
       
   291   result->set_newer(NULL);
       
   292   decrement_length();
       
   293   assert(result->newer() == NULL, "shouldn't be on queue");
       
   294   assert(result->older() == NULL, "shouldn't be on queue");
       
   295   verify_length();
       
   296   return result;
       
   297 }
       
   298 
       
   299 GCTask* GCTaskQueue::remove(GCTask* task) {
       
   300   // This is slightly more work, and has slightly fewer asserts
       
   301   // than removing from the remove end.
       
   302   assert(task != NULL, "shouldn't have null task");
       
   303   GCTask* result = task;
       
   304   if (result->newer() != NULL) {
       
   305     result->newer()->set_older(result->older());
       
   306   } else {
       
   307     assert(insert_end() == result, "not youngest");
       
   308     set_insert_end(result->older());
       
   309   }
       
   310   if (result->older() != NULL) {
       
   311     result->older()->set_newer(result->newer());
       
   312   } else {
       
   313     assert(remove_end() == result, "not oldest");
       
   314     set_remove_end(result->newer());
       
   315   }
       
   316   result->set_newer(NULL);
       
   317   result->set_older(NULL);
       
   318   decrement_length();
       
   319   verify_length();
       
   320   return result;
       
   321 }
       
   322 
       
   323 NOT_PRODUCT(
       
   324 // Count the elements in the queue and verify the length against
       
   325 // that count.
       
   326 void GCTaskQueue::verify_length() const {
       
   327   uint count = 0;
       
   328   for (GCTask* element = insert_end();
       
   329        element != NULL;
       
   330        element = element->older()) {
       
   331 
       
   332     count++;
       
   333   }
       
   334   assert(count == length(), "Length does not match queue");
       
   335 }
       
   336 
       
   337 void GCTaskQueue::print(const char* message) const {
       
   338   tty->print_cr("[" INTPTR_FORMAT "] GCTaskQueue:"
       
   339                 "  insert_end: " INTPTR_FORMAT
       
   340                 "  remove_end: " INTPTR_FORMAT
       
   341                 "  length:       %d"
       
   342                 "  %s",
       
   343                 p2i(this), p2i(insert_end()), p2i(remove_end()), length(), message);
       
   344   uint count = 0;
       
   345   for (GCTask* element = insert_end();
       
   346        element != NULL;
       
   347        element = element->older()) {
       
   348     element->print("    ");
       
   349     count++;
       
   350     tty->cr();
       
   351   }
       
   352   tty->print("Total tasks: %d", count);
       
   353 }
       
   354 )
       
   355 
       
   356 //
       
   357 // SynchronizedGCTaskQueue
       
   358 //
       
   359 
       
   360 SynchronizedGCTaskQueue::SynchronizedGCTaskQueue(GCTaskQueue* queue_arg,
       
   361                                                  Monitor *       lock_arg) :
       
   362   _unsynchronized_queue(queue_arg),
       
   363   _lock(lock_arg) {
       
   364   assert(unsynchronized_queue() != NULL, "null queue");
       
   365   assert(lock() != NULL, "null lock");
       
   366 }
       
   367 
       
   368 SynchronizedGCTaskQueue::~SynchronizedGCTaskQueue() {
       
   369   // Nothing to do.
       
   370 }
       
   371 
       
   372 //
       
   373 // GCTaskManager
       
   374 //
       
   375 GCTaskManager::GCTaskManager(uint workers) :
       
   376   _workers(workers),
       
   377   _created_workers(0),
       
   378   _active_workers(0),
       
   379   _idle_workers(0) {
       
   380   initialize();
       
   381 }
       
   382 
       
   383 GCTaskThread* GCTaskManager::install_worker(uint t) {
       
   384   GCTaskThread* new_worker = GCTaskThread::create(this, t, _processor_assignment[t]);
       
   385   set_thread(t, new_worker);
       
   386   return new_worker;
       
   387 }
       
   388 
       
   389 void GCTaskManager::add_workers(bool initializing) {
       
   390   os::ThreadType worker_type = os::pgc_thread;
       
   391   uint previous_created_workers = _created_workers;
       
   392 
       
   393   _created_workers = WorkerManager::add_workers(this,
       
   394                                                 _active_workers,
       
   395                                                 _workers,
       
   396                                                 _created_workers,
       
   397                                                 worker_type,
       
   398                                                 initializing);
       
   399   _active_workers = MIN2(_created_workers, _active_workers);
       
   400 
       
   401   WorkerManager::log_worker_creation(this, previous_created_workers, _active_workers, _created_workers, initializing);
       
   402 }
       
   403 
       
   404 const char* GCTaskManager::group_name() {
       
   405   return "ParGC Thread";
       
   406 }
       
   407 
       
   408 void GCTaskManager::initialize() {
       
   409   if (TraceGCTaskManager) {
       
   410     tty->print_cr("GCTaskManager::initialize: workers: %u", workers());
       
   411   }
       
   412   assert(workers() != 0, "no workers");
       
   413   _monitor = new Monitor(Mutex::barrier,                // rank
       
   414                          "GCTaskManager monitor",       // name
       
   415                          Mutex::_allow_vm_block_flag,   // allow_vm_block
       
   416                          Monitor::_safepoint_check_never);
       
   417   // The queue for the GCTaskManager must be a CHeapObj.
       
   418   GCTaskQueue* unsynchronized_queue = GCTaskQueue::create_on_c_heap();
       
   419   _queue = SynchronizedGCTaskQueue::create(unsynchronized_queue, lock());
       
   420   _noop_task = NoopGCTask::create_on_c_heap();
       
   421   _resource_flag = NEW_C_HEAP_ARRAY(bool, workers(), mtGC);
       
   422   {
       
   423     // Set up worker threads.
       
   424     //     Distribute the workers among the available processors,
       
   425     //     unless we were told not to, or if the os doesn't want to.
       
   426     _processor_assignment = NEW_C_HEAP_ARRAY(uint, workers(), mtGC);
       
   427     if (!BindGCTaskThreadsToCPUs ||
       
   428         !os::distribute_processes(workers(), _processor_assignment)) {
       
   429       for (uint a = 0; a < workers(); a += 1) {
       
   430         _processor_assignment[a] = sentinel_worker();
       
   431       }
       
   432     }
       
   433 
       
   434     _thread = NEW_C_HEAP_ARRAY(GCTaskThread*, workers(), mtGC);
       
   435     _active_workers = ParallelGCThreads;
       
   436     if (UseDynamicNumberOfGCThreads && !FLAG_IS_CMDLINE(ParallelGCThreads)) {
       
   437       _active_workers = 1U;
       
   438     }
       
   439 
       
   440     Log(gc, task, thread) log;
       
   441     if (log.is_trace()) {
       
   442       LogStream ls(log.trace());
       
   443       ls.print("GCTaskManager::initialize: distribution:");
       
   444       for (uint t = 0; t < workers(); t += 1) {
       
   445         ls.print("  %u", _processor_assignment[t]);
       
   446       }
       
   447       ls.cr();
       
   448     }
       
   449   }
       
   450   reset_busy_workers();
       
   451   set_unblocked();
       
   452   for (uint w = 0; w < workers(); w += 1) {
       
   453     set_resource_flag(w, false);
       
   454   }
       
   455   reset_delivered_tasks();
       
   456   reset_completed_tasks();
       
   457   reset_barriers();
       
   458   reset_emptied_queue();
       
   459 
       
   460   add_workers(true);
       
   461 }
       
   462 
       
   463 GCTaskManager::~GCTaskManager() {
       
   464   assert(busy_workers() == 0, "still have busy workers");
       
   465   assert(queue()->is_empty(), "still have queued work");
       
   466   NoopGCTask::destroy(_noop_task);
       
   467   _noop_task = NULL;
       
   468   if (_thread != NULL) {
       
   469     for (uint i = 0; i < created_workers(); i += 1) {
       
   470       GCTaskThread::destroy(thread(i));
       
   471       set_thread(i, NULL);
       
   472     }
       
   473     FREE_C_HEAP_ARRAY(GCTaskThread*, _thread);
       
   474     _thread = NULL;
       
   475   }
       
   476   if (_processor_assignment != NULL) {
       
   477     FREE_C_HEAP_ARRAY(uint, _processor_assignment);
       
   478     _processor_assignment = NULL;
       
   479   }
       
   480   if (_resource_flag != NULL) {
       
   481     FREE_C_HEAP_ARRAY(bool, _resource_flag);
       
   482     _resource_flag = NULL;
       
   483   }
       
   484   if (queue() != NULL) {
       
   485     GCTaskQueue* unsynchronized_queue = queue()->unsynchronized_queue();
       
   486     GCTaskQueue::destroy(unsynchronized_queue);
       
   487     SynchronizedGCTaskQueue::destroy(queue());
       
   488     _queue = NULL;
       
   489   }
       
   490   if (monitor() != NULL) {
       
   491     delete monitor();
       
   492     _monitor = NULL;
       
   493   }
       
   494 }
       
   495 
       
   496 void GCTaskManager::set_active_gang() {
       
   497   _active_workers =
       
   498     WorkerPolicy::calc_active_workers(workers(),
       
   499                                       active_workers(),
       
   500                                       Threads::number_of_non_daemon_threads());
       
   501 
       
   502   assert(!all_workers_active() || active_workers() == ParallelGCThreads,
       
   503          "all_workers_active() is  incorrect: "
       
   504          "active %d  ParallelGCThreads %u", active_workers(),
       
   505          ParallelGCThreads);
       
   506   _active_workers = MIN2(_active_workers, _workers);
       
   507   // "add_workers" does not guarantee any additional workers
       
   508   add_workers(false);
       
   509   log_trace(gc, task)("GCTaskManager::set_active_gang(): "
       
   510                       "all_workers_active()  %d  workers %d  "
       
   511                       "active  %d  ParallelGCThreads %u",
       
   512                       all_workers_active(), workers(),  active_workers(),
       
   513                       ParallelGCThreads);
       
   514 }
       
   515 
       
   516 // Create IdleGCTasks for inactive workers.
       
   517 // Creates tasks in a ResourceArea and assumes
       
   518 // an appropriate ResourceMark.
       
   519 void GCTaskManager::task_idle_workers() {
       
   520   {
       
   521     int more_inactive_workers = 0;
       
   522     {
       
   523       // Stop any idle tasks from exiting their IdleGCTask's
       
   524       // and get the count for additional IdleGCTask's under
       
   525       // the GCTaskManager's monitor so that the "more_inactive_workers"
       
   526       // count is correct.
       
   527       MutexLocker ml(monitor(), Mutex::_no_safepoint_check_flag);
       
   528       _wait_helper.set_should_wait(true);
       
   529       // active_workers are a number being requested.  idle_workers
       
   530       // are the number currently idle.  If all the workers are being
       
   531       // requested to be active but some are already idle, reduce
       
   532       // the number of active_workers to be consistent with the
       
   533       // number of idle_workers.  The idle_workers are stuck in
       
   534       // idle tasks and will no longer be release (since a new GC
       
   535       // is starting).  Try later to release enough idle_workers
       
   536       // to allow the desired number of active_workers.
       
   537       more_inactive_workers =
       
   538         created_workers() - active_workers() - idle_workers();
       
   539       if (more_inactive_workers < 0) {
       
   540         int reduced_active_workers = active_workers() + more_inactive_workers;
       
   541         update_active_workers(reduced_active_workers);
       
   542         more_inactive_workers = 0;
       
   543       }
       
   544       log_trace(gc, task)("JT: %d  workers %d  active  %d  idle %d  more %d",
       
   545                           Threads::number_of_non_daemon_threads(),
       
   546                           created_workers(),
       
   547                           active_workers(),
       
   548                           idle_workers(),
       
   549                           more_inactive_workers);
       
   550     }
       
   551     GCTaskQueue* q = GCTaskQueue::create();
       
   552     for(uint i = 0; i < (uint) more_inactive_workers; i++) {
       
   553       q->enqueue(IdleGCTask::create_on_c_heap());
       
   554       increment_idle_workers();
       
   555     }
       
   556     assert(created_workers() == active_workers() + idle_workers(),
       
   557       "total workers should equal active + inactive");
       
   558     add_list(q);
       
   559     // GCTaskQueue* q was created in a ResourceArea so a
       
   560     // destroy() call is not needed.
       
   561   }
       
   562 }
       
   563 
       
   564 void  GCTaskManager::release_idle_workers() {
       
   565   {
       
   566     MutexLocker ml(monitor(),
       
   567       Mutex::_no_safepoint_check_flag);
       
   568     _wait_helper.set_should_wait(false);
       
   569     monitor()->notify_all();
       
   570   // Release monitor
       
   571   }
       
   572 }
       
   573 
       
   574 void GCTaskManager::print_task_time_stamps() {
       
   575   if (!log_is_enabled(Debug, gc, task, time)) {
       
   576     return;
       
   577   }
       
   578   uint num_thr = created_workers();
       
   579   for(uint i=0; i < num_thr; i++) {
       
   580     GCTaskThread* t = thread(i);
       
   581     t->print_task_time_stamps();
       
   582   }
       
   583 }
       
   584 
       
   585 void GCTaskManager::print_threads_on(outputStream* st) {
       
   586   uint num_thr = created_workers();
       
   587   for (uint i = 0; i < num_thr; i++) {
       
   588     thread(i)->print_on(st);
       
   589     st->cr();
       
   590   }
       
   591 }
       
   592 
       
   593 void GCTaskManager::threads_do(ThreadClosure* tc) {
       
   594   assert(tc != NULL, "Null ThreadClosure");
       
   595   uint num_thr = created_workers();
       
   596   for (uint i = 0; i < num_thr; i++) {
       
   597     tc->do_thread(thread(i));
       
   598   }
       
   599 }
       
   600 
       
   601 GCTaskThread* GCTaskManager::thread(uint which) {
       
   602   assert(which < created_workers(), "index out of bounds");
       
   603   assert(_thread[which] != NULL, "shouldn't have null thread");
       
   604   return _thread[which];
       
   605 }
       
   606 
       
   607 void GCTaskManager::set_thread(uint which, GCTaskThread* value) {
       
   608   // "_created_workers" may not have been updated yet so use workers()
       
   609   assert(which < workers(), "index out of bounds");
       
   610   assert(value != NULL, "shouldn't have null thread");
       
   611   _thread[which] = value;
       
   612 }
       
   613 
       
   614 void GCTaskManager::add_task(GCTask* task) {
       
   615   assert(task != NULL, "shouldn't have null task");
       
   616   MutexLocker ml(monitor(), Mutex::_no_safepoint_check_flag);
       
   617   if (TraceGCTaskManager) {
       
   618     tty->print_cr("GCTaskManager::add_task(" INTPTR_FORMAT " [%s])",
       
   619                   p2i(task), GCTask::Kind::to_string(task->kind()));
       
   620   }
       
   621   queue()->enqueue(task);
       
   622   // Notify with the lock held to avoid missed notifies.
       
   623   if (TraceGCTaskManager) {
       
   624     tty->print_cr("    GCTaskManager::add_task (%s)->notify_all",
       
   625                   monitor()->name());
       
   626   }
       
   627   (void) monitor()->notify_all();
       
   628   // Release monitor().
       
   629 }
       
   630 
       
   631 void GCTaskManager::add_list(GCTaskQueue* list) {
       
   632   assert(list != NULL, "shouldn't have null task");
       
   633   MutexLocker ml(monitor(), Mutex::_no_safepoint_check_flag);
       
   634   if (TraceGCTaskManager) {
       
   635     tty->print_cr("GCTaskManager::add_list(%u)", list->length());
       
   636   }
       
   637   queue()->enqueue(list);
       
   638   // Notify with the lock held to avoid missed notifies.
       
   639   if (TraceGCTaskManager) {
       
   640     tty->print_cr("    GCTaskManager::add_list (%s)->notify_all",
       
   641                   monitor()->name());
       
   642   }
       
   643   (void) monitor()->notify_all();
       
   644   // Release monitor().
       
   645 }
       
   646 
       
   647 // GC workers wait in get_task() for new work to be added
       
   648 // to the GCTaskManager's queue.  When new work is added,
       
   649 // a notify is sent to the waiting GC workers which then
       
   650 // compete to get tasks.  If a GC worker wakes up and there
       
   651 // is no work on the queue, it is given a noop_task to execute
       
   652 // and then loops to find more work.
       
   653 
       
   654 GCTask* GCTaskManager::get_task(uint which) {
       
   655   GCTask* result = NULL;
       
   656   // Grab the queue lock.
       
   657   MonitorLocker ml(monitor(), Mutex::_no_safepoint_check_flag);
       
   658   // Wait while the queue is block or
       
   659   // there is nothing to do, except maybe release resources.
       
   660   while (is_blocked() ||
       
   661          (queue()->is_empty() && !should_release_resources(which))) {
       
   662     if (TraceGCTaskManager) {
       
   663       tty->print_cr("GCTaskManager::get_task(%u)"
       
   664                     "  blocked: %s"
       
   665                     "  empty: %s"
       
   666                     "  release: %s",
       
   667                     which,
       
   668                     is_blocked() ? "true" : "false",
       
   669                     queue()->is_empty() ? "true" : "false",
       
   670                     should_release_resources(which) ? "true" : "false");
       
   671       tty->print_cr("    => (%s)->wait()",
       
   672                     monitor()->name());
       
   673     }
       
   674     ml.wait(0);
       
   675   }
       
   676   // We've reacquired the queue lock here.
       
   677   // Figure out which condition caused us to exit the loop above.
       
   678   if (!queue()->is_empty()) {
       
   679     if (UseGCTaskAffinity) {
       
   680       result = queue()->dequeue(which);
       
   681     } else {
       
   682       result = queue()->dequeue();
       
   683     }
       
   684     if (result->is_barrier_task()) {
       
   685       assert(which != sentinel_worker(),
       
   686              "blocker shouldn't be bogus");
       
   687       set_blocking_worker(which);
       
   688     }
       
   689   } else {
       
   690     // The queue is empty, but we were woken up.
       
   691     // Just hand back a Noop task,
       
   692     // in case someone wanted us to release resources, or whatever.
       
   693     result = noop_task();
       
   694   }
       
   695   assert(result != NULL, "shouldn't have null task");
       
   696   if (TraceGCTaskManager) {
       
   697     tty->print_cr("GCTaskManager::get_task(%u) => " INTPTR_FORMAT " [%s]",
       
   698                   which, p2i(result), GCTask::Kind::to_string(result->kind()));
       
   699     tty->print_cr("     %s", result->name());
       
   700   }
       
   701   if (!result->is_idle_task()) {
       
   702     increment_busy_workers();
       
   703     increment_delivered_tasks();
       
   704   }
       
   705   return result;
       
   706   // Release monitor().
       
   707 }
       
   708 
       
   709 void GCTaskManager::note_completion(uint which) {
       
   710   MutexLocker ml(monitor(), Mutex::_no_safepoint_check_flag);
       
   711   if (TraceGCTaskManager) {
       
   712     tty->print_cr("GCTaskManager::note_completion(%u)", which);
       
   713   }
       
   714   // If we are blocked, check if the completing thread is the blocker.
       
   715   if (blocking_worker() == which) {
       
   716     assert(blocking_worker() != sentinel_worker(),
       
   717            "blocker shouldn't be bogus");
       
   718     increment_barriers();
       
   719     set_unblocked();
       
   720   }
       
   721   increment_completed_tasks();
       
   722   uint active = decrement_busy_workers();
       
   723   if ((active == 0) && (queue()->is_empty())) {
       
   724     increment_emptied_queue();
       
   725     if (TraceGCTaskManager) {
       
   726       tty->print_cr("    GCTaskManager::note_completion(%u) done", which);
       
   727     }
       
   728   }
       
   729   if (TraceGCTaskManager) {
       
   730     tty->print_cr("    GCTaskManager::note_completion(%u) (%s)->notify_all",
       
   731                   which, monitor()->name());
       
   732     tty->print_cr("  "
       
   733                   "  blocked: %s"
       
   734                   "  empty: %s"
       
   735                   "  release: %s",
       
   736                   is_blocked() ? "true" : "false",
       
   737                   queue()->is_empty() ? "true" : "false",
       
   738                   should_release_resources(which) ? "true" : "false");
       
   739     tty->print_cr("  "
       
   740                   "  delivered: %u"
       
   741                   "  completed: %u"
       
   742                   "  barriers: %u"
       
   743                   "  emptied: %u",
       
   744                   delivered_tasks(),
       
   745                   completed_tasks(),
       
   746                   barriers(),
       
   747                   emptied_queue());
       
   748   }
       
   749   // Tell everyone that a task has completed.
       
   750   (void) monitor()->notify_all();
       
   751   // Release monitor().
       
   752 }
       
   753 
       
   754 uint GCTaskManager::increment_busy_workers() {
       
   755   assert(queue()->own_lock(), "don't own the lock");
       
   756   _busy_workers += 1;
       
   757   return _busy_workers;
       
   758 }
       
   759 
       
   760 uint GCTaskManager::decrement_busy_workers() {
       
   761   assert(queue()->own_lock(), "don't own the lock");
       
   762   assert(_busy_workers > 0, "About to make a mistake");
       
   763   _busy_workers -= 1;
       
   764   return _busy_workers;
       
   765 }
       
   766 
       
   767 void GCTaskManager::release_all_resources() {
       
   768   // If you want this to be done atomically, do it in a WaitForBarrierGCTask.
       
   769   for (uint i = 0; i < created_workers(); i += 1) {
       
   770     set_resource_flag(i, true);
       
   771   }
       
   772 }
       
   773 
       
   774 bool GCTaskManager::should_release_resources(uint which) {
       
   775   // This can be done without a lock because each thread reads one element.
       
   776   return resource_flag(which);
       
   777 }
       
   778 
       
   779 void GCTaskManager::note_release(uint which) {
       
   780   // This can be done without a lock because each thread writes one element.
       
   781   set_resource_flag(which, false);
       
   782 }
       
   783 
       
   784 // "list" contains tasks that are ready to execute.  Those
       
   785 // tasks are added to the GCTaskManager's queue of tasks and
       
   786 // then the GC workers are notified that there is new work to
       
   787 // do.
       
   788 //
       
   789 // Typically different types of tasks can be added to the "list".
       
   790 // For example in PSScavenge OldToYoungRootsTask, SerialOldToYoungRootsTask,
       
   791 // ScavengeRootsTask, and StealTask tasks are all added to the list
       
   792 // and then the GC workers are notified of new work.  The tasks are
       
   793 // handed out in the order in which they are added to the list
       
   794 // (although execution is not necessarily in that order).  As long
       
   795 // as any tasks are running the GCTaskManager will wait for execution
       
   796 // to complete.  GC workers that execute a stealing task remain in
       
   797 // the stealing task until all stealing tasks have completed.  The load
       
   798 // balancing afforded by the stealing tasks work best if the stealing
       
   799 // tasks are added last to the list.
       
   800 
       
   801 void GCTaskManager::execute_and_wait(GCTaskQueue* list) {
       
   802   WaitForBarrierGCTask* fin = WaitForBarrierGCTask::create();
       
   803   list->enqueue(fin);
       
   804   // The barrier task will be read by one of the GC
       
   805   // workers once it is added to the list of tasks.
       
   806   // Be sure that is globally visible before the
       
   807   // GC worker reads it (which is after the task is added
       
   808   // to the list of tasks below).
       
   809   OrderAccess::storestore();
       
   810   add_list(list);
       
   811   fin->wait_for(true /* reset */);
       
   812   // We have to release the barrier tasks!
       
   813   WaitForBarrierGCTask::destroy(fin);
       
   814 }
       
   815 
       
   816 bool GCTaskManager::resource_flag(uint which) {
       
   817   assert(which < workers(), "index out of bounds");
       
   818   return _resource_flag[which];
       
   819 }
       
   820 
       
   821 void GCTaskManager::set_resource_flag(uint which, bool value) {
       
   822   assert(which < workers(), "index out of bounds");
       
   823   _resource_flag[which] = value;
       
   824 }
       
   825 
       
   826 //
       
   827 // NoopGCTask
       
   828 //
       
   829 
       
   830 NoopGCTask* NoopGCTask::create_on_c_heap() {
       
   831   NoopGCTask* result = new(ResourceObj::C_HEAP, mtGC) NoopGCTask();
       
   832   return result;
       
   833 }
       
   834 
       
   835 void NoopGCTask::destroy(NoopGCTask* that) {
       
   836   if (that != NULL) {
       
   837     that->destruct();
       
   838     FreeHeap(that);
       
   839   }
       
   840 }
       
   841 
       
   842 // This task should never be performing GC work that require
       
   843 // a valid GC id.
       
   844 NoopGCTask::NoopGCTask() : GCTask(GCTask::Kind::noop_task, GCId::undefined()) { }
       
   845 
       
   846 void NoopGCTask::destruct() {
       
   847   // This has to know it's superclass structure, just like the constructor.
       
   848   this->GCTask::destruct();
       
   849   // Nothing else to do.
       
   850 }
       
   851 
       
   852 //
       
   853 // IdleGCTask
       
   854 //
       
   855 
       
   856 IdleGCTask* IdleGCTask::create() {
       
   857   IdleGCTask* result = new IdleGCTask(false);
       
   858   assert(UseDynamicNumberOfGCThreads,
       
   859     "Should only be used with dynamic GC thread");
       
   860   return result;
       
   861 }
       
   862 
       
   863 IdleGCTask* IdleGCTask::create_on_c_heap() {
       
   864   IdleGCTask* result = new(ResourceObj::C_HEAP, mtGC) IdleGCTask(true);
       
   865   assert(UseDynamicNumberOfGCThreads,
       
   866     "Should only be used with dynamic GC thread");
       
   867   return result;
       
   868 }
       
   869 
       
   870 void IdleGCTask::do_it(GCTaskManager* manager, uint which) {
       
   871   WaitHelper* wait_helper = manager->wait_helper();
       
   872   log_trace(gc, task)("[" INTPTR_FORMAT "] IdleGCTask:::do_it() should_wait: %s",
       
   873       p2i(this), wait_helper->should_wait() ? "true" : "false");
       
   874 
       
   875   MonitorLocker ml(manager->monitor(), Mutex::_no_safepoint_check_flag);
       
   876   log_trace(gc, task)("--- idle %d", which);
       
   877   // Increment has to be done when the idle tasks are created.
       
   878   // manager->increment_idle_workers();
       
   879   ml.notify_all();
       
   880   while (wait_helper->should_wait()) {
       
   881     log_trace(gc, task)("[" INTPTR_FORMAT "] IdleGCTask::do_it()  [" INTPTR_FORMAT "] (%s)->wait()",
       
   882       p2i(this), p2i(manager->monitor()), manager->monitor()->name());
       
   883     ml.wait(0);
       
   884   }
       
   885   manager->decrement_idle_workers();
       
   886 
       
   887   log_trace(gc, task)("--- release %d", which);
       
   888   log_trace(gc, task)("[" INTPTR_FORMAT "] IdleGCTask::do_it() returns should_wait: %s",
       
   889     p2i(this), wait_helper->should_wait() ? "true" : "false");
       
   890   // Release monitor().
       
   891 }
       
   892 
       
   893 void IdleGCTask::destroy(IdleGCTask* that) {
       
   894   if (that != NULL) {
       
   895     that->destruct();
       
   896     if (that->is_c_heap_obj()) {
       
   897       FreeHeap(that);
       
   898     }
       
   899   }
       
   900 }
       
   901 
       
   902 void IdleGCTask::destruct() {
       
   903   // This has to know it's superclass structure, just like the constructor.
       
   904   this->GCTask::destruct();
       
   905   // Nothing else to do.
       
   906 }
       
   907 
       
   908 //
       
   909 // WaitForBarrierGCTask
       
   910 //
       
   911 WaitForBarrierGCTask* WaitForBarrierGCTask::create() {
       
   912   WaitForBarrierGCTask* result = new WaitForBarrierGCTask();
       
   913   return result;
       
   914 }
       
   915 
       
   916 WaitForBarrierGCTask::WaitForBarrierGCTask() : GCTask(GCTask::Kind::wait_for_barrier_task) { }
       
   917 
       
   918 void WaitForBarrierGCTask::destroy(WaitForBarrierGCTask* that) {
       
   919   if (that != NULL) {
       
   920     if (TraceGCTaskManager) {
       
   921       tty->print_cr("[" INTPTR_FORMAT "] WaitForBarrierGCTask::destroy()", p2i(that));
       
   922     }
       
   923     that->destruct();
       
   924   }
       
   925 }
       
   926 
       
   927 void WaitForBarrierGCTask::destruct() {
       
   928   if (TraceGCTaskManager) {
       
   929     tty->print_cr("[" INTPTR_FORMAT "] WaitForBarrierGCTask::destruct()", p2i(this));
       
   930   }
       
   931   this->GCTask::destruct();
       
   932   // Clean up that should be in the destructor,
       
   933   // except that ResourceMarks don't call destructors.
       
   934   _wait_helper.release_monitor();
       
   935 }
       
   936 
       
   937 void WaitForBarrierGCTask::do_it_internal(GCTaskManager* manager, uint which) {
       
   938   // Wait for this to be the only busy worker.
       
   939   assert(manager->monitor()->owned_by_self(), "don't own the lock");
       
   940   assert(manager->is_blocked(), "manager isn't blocked");
       
   941   while (manager->busy_workers() > 1) {
       
   942     if (TraceGCTaskManager) {
       
   943       tty->print_cr("WaitForBarrierGCTask::do_it(%u) waiting on %u workers",
       
   944                     which, manager->busy_workers());
       
   945     }
       
   946     manager->monitor()->wait_without_safepoint_check(0);
       
   947   }
       
   948 }
       
   949 
       
   950 void WaitForBarrierGCTask::do_it(GCTaskManager* manager, uint which) {
       
   951   if (TraceGCTaskManager) {
       
   952     tty->print_cr("[" INTPTR_FORMAT "]"
       
   953                   " WaitForBarrierGCTask::do_it() waiting for idle",
       
   954                   p2i(this));
       
   955   }
       
   956   {
       
   957     // First, wait for the barrier to arrive.
       
   958     MutexLocker ml(manager->lock(), Mutex::_no_safepoint_check_flag);
       
   959     do_it_internal(manager, which);
       
   960     // Release manager->lock().
       
   961   }
       
   962   // Then notify the waiter.
       
   963   _wait_helper.notify();
       
   964 }
       
   965 
       
   966 WaitHelper::WaitHelper() : _monitor(MonitorSupply::reserve()), _should_wait(true) {
       
   967   if (TraceGCTaskManager) {
       
   968     tty->print_cr("[" INTPTR_FORMAT "]"
       
   969                   " WaitHelper::WaitHelper()"
       
   970                   "  monitor: " INTPTR_FORMAT,
       
   971                   p2i(this), p2i(monitor()));
       
   972   }
       
   973 }
       
   974 
       
   975 void WaitHelper::release_monitor() {
       
   976   assert(_monitor != NULL, "");
       
   977   MonitorSupply::release(_monitor);
       
   978   _monitor = NULL;
       
   979 }
       
   980 
       
   981 WaitHelper::~WaitHelper() {
       
   982   release_monitor();
       
   983 }
       
   984 
       
   985 void WaitHelper::wait_for(bool reset) {
       
   986   if (TraceGCTaskManager) {
       
   987     tty->print_cr("[" INTPTR_FORMAT "]"
       
   988                   " WaitForBarrierGCTask::wait_for()"
       
   989       "  should_wait: %s",
       
   990       p2i(this), should_wait() ? "true" : "false");
       
   991   }
       
   992   {
       
   993     // Grab the lock and check again.
       
   994     MonitorLocker ml(monitor(), Mutex::_no_safepoint_check_flag);
       
   995     while (should_wait()) {
       
   996       if (TraceGCTaskManager) {
       
   997         tty->print_cr("[" INTPTR_FORMAT "]"
       
   998                       " WaitForBarrierGCTask::wait_for()"
       
   999           "  [" INTPTR_FORMAT "] (%s)->wait()",
       
  1000           p2i(this), p2i(monitor()), monitor()->name());
       
  1001       }
       
  1002       ml.wait(0);
       
  1003     }
       
  1004     // Reset the flag in case someone reuses this task.
       
  1005     if (reset) {
       
  1006       set_should_wait(true);
       
  1007     }
       
  1008     if (TraceGCTaskManager) {
       
  1009       tty->print_cr("[" INTPTR_FORMAT "]"
       
  1010                     " WaitForBarrierGCTask::wait_for() returns"
       
  1011         "  should_wait: %s",
       
  1012         p2i(this), should_wait() ? "true" : "false");
       
  1013     }
       
  1014     // Release monitor().
       
  1015   }
       
  1016 }
       
  1017 
       
  1018 void WaitHelper::notify() {
       
  1019   MutexLocker ml(monitor(), Mutex::_no_safepoint_check_flag);
       
  1020   set_should_wait(false);
       
  1021   // Waiter doesn't miss the notify in the wait_for method
       
  1022   // since it checks the flag after grabbing the monitor.
       
  1023   if (TraceGCTaskManager) {
       
  1024     tty->print_cr("[" INTPTR_FORMAT "]"
       
  1025                   " WaitForBarrierGCTask::do_it()"
       
  1026                   "  [" INTPTR_FORMAT "] (%s)->notify_all()",
       
  1027                   p2i(this), p2i(monitor()), monitor()->name());
       
  1028   }
       
  1029   monitor()->notify_all();
       
  1030 }
       
  1031 
       
  1032 Mutex*                   MonitorSupply::_lock     = NULL;
       
  1033 GrowableArray<Monitor*>* MonitorSupply::_freelist = NULL;
       
  1034 
       
  1035 Monitor* MonitorSupply::reserve() {
       
  1036   Monitor* result = NULL;
       
  1037   // Lazy initialization: possible race.
       
  1038   if (lock() == NULL) {
       
  1039     _lock = new Mutex(Mutex::barrier,                  // rank
       
  1040                       "MonitorSupply mutex",           // name
       
  1041                       Mutex::_allow_vm_block_flag);    // allow_vm_block
       
  1042   }
       
  1043   {
       
  1044     MutexLocker ml(lock());
       
  1045     // Lazy initialization.
       
  1046     if (freelist() == NULL) {
       
  1047       _freelist =
       
  1048         new(ResourceObj::C_HEAP, mtGC) GrowableArray<Monitor*>(ParallelGCThreads,
       
  1049                                                          true);
       
  1050     }
       
  1051     if (! freelist()->is_empty()) {
       
  1052       result = freelist()->pop();
       
  1053     } else {
       
  1054       result = new Monitor(Mutex::barrier,                  // rank
       
  1055                            "MonitorSupply monitor",         // name
       
  1056                            Mutex::_allow_vm_block_flag,     // allow_vm_block
       
  1057                            Monitor::_safepoint_check_never);
       
  1058     }
       
  1059     guarantee(result != NULL, "shouldn't return NULL");
       
  1060     assert(!result->is_locked(), "shouldn't be locked");
       
  1061     // release lock().
       
  1062   }
       
  1063   return result;
       
  1064 }
       
  1065 
       
  1066 void MonitorSupply::release(Monitor* instance) {
       
  1067   assert(instance != NULL, "shouldn't release NULL");
       
  1068   assert(!instance->is_locked(), "shouldn't be locked");
       
  1069   {
       
  1070     MutexLocker ml(lock());
       
  1071     freelist()->push(instance);
       
  1072     // release lock().
       
  1073   }
       
  1074 }