src/hotspot/share/gc/shared/workerManager.hpp
author stefank
Mon, 07 May 2018 14:42:10 +0200
changeset 50035 af1923174c9b
parent 47216 71c04702a3d5
child 52904 d2f118d3f8e7
permissions -rw-r--r--
8202642: Replace PAR_OOP_ITERATE with templates Reviewed-by: eosterlund, sjohanss
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
38216
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
     1
/*
41094
4e0c638397c9 8161029: GPL header missing comma after year
jmasa
parents: 40096
diff changeset
     2
 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
38216
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
     4
 *
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
     7
 * published by the Free Software Foundation.
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
     8
 *
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    13
 * accompanied this code).
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    14
 *
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    18
 *
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    21
 * questions.
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    22
 *
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    23
 */
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    24
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    25
#ifndef SHARE_VM_GC_SHARED_WORKERMANAGER_HPP
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    26
#define SHARE_VM_GC_SHARED_WORKERMANAGER_HPP
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    27
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    28
#include "gc/shared/adaptiveSizePolicy.hpp"
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    29
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    30
class WorkerManager : public AllStatic {
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    31
 public:
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    32
  // Create additional workers as needed.
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    33
  //   active_workers - number of workers being requested for an upcoming
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    34
  // parallel task.
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    35
  //   total_workers - total number of workers.  This is the maximum
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    36
  // number possible.
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    37
  //   created_workers - number of workers already created.  This maybe
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    38
  // less than, equal to, or greater than active workers.  If greater than
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    39
  // or equal to active_workers, nothing is done.
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    40
  //   worker_type - type of thread.
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    41
  //   initializing - true if this is called to get the initial number of
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    42
  // GC workers.
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    43
  // If initializing is true, do a vm exit if the workers cannot be created.
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    44
  // The initializing = true case is for JVM start up and failing to
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    45
  // create all the worker at start should considered a problem so exit.
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    46
  // If initializing = false, there are already some number of worker
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    47
  // threads and a failure would not be optimal but should not be fatal.
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    48
  template <class WorkerType>
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    49
  static uint add_workers (WorkerType* holder,
39704
157f39705057 8157240: GC task trace logging is incomprehensible
jmasa
parents: 38216
diff changeset
    50
                           uint active_workers,
157f39705057 8157240: GC task trace logging is incomprehensible
jmasa
parents: 38216
diff changeset
    51
                           uint total_workers,
157f39705057 8157240: GC task trace logging is incomprehensible
jmasa
parents: 38216
diff changeset
    52
                           uint created_workers,
157f39705057 8157240: GC task trace logging is incomprehensible
jmasa
parents: 38216
diff changeset
    53
                           os::ThreadType worker_type,
157f39705057 8157240: GC task trace logging is incomprehensible
jmasa
parents: 38216
diff changeset
    54
                           bool initializing) {
38216
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    55
    uint start = created_workers;
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    56
    uint end = MIN2(active_workers, total_workers);
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    57
    for (uint worker_id = start; worker_id < end; worker_id += 1) {
40096
246c62cd9180 8159073: : Error handling incomplete when creating GC threads lazily
jmasa
parents: 39704
diff changeset
    58
      WorkerThread* new_worker = NULL;
246c62cd9180 8159073: : Error handling incomplete when creating GC threads lazily
jmasa
parents: 39704
diff changeset
    59
      if (initializing || !InjectGCWorkerCreationFailure) {
246c62cd9180 8159073: : Error handling incomplete when creating GC threads lazily
jmasa
parents: 39704
diff changeset
    60
        new_worker = holder->install_worker(worker_id);
246c62cd9180 8159073: : Error handling incomplete when creating GC threads lazily
jmasa
parents: 39704
diff changeset
    61
      }
38216
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    62
      if (new_worker == NULL || !os::create_thread(new_worker, worker_type)) {
40096
246c62cd9180 8159073: : Error handling incomplete when creating GC threads lazily
jmasa
parents: 39704
diff changeset
    63
        log_trace(gc, task)("WorkerManager::add_workers() : "
246c62cd9180 8159073: : Error handling incomplete when creating GC threads lazily
jmasa
parents: 39704
diff changeset
    64
                            "creation failed due to failed allocation of native %s",
246c62cd9180 8159073: : Error handling incomplete when creating GC threads lazily
jmasa
parents: 39704
diff changeset
    65
                            new_worker == NULL ?  "memory" : "thread");
246c62cd9180 8159073: : Error handling incomplete when creating GC threads lazily
jmasa
parents: 39704
diff changeset
    66
        if (new_worker != NULL) {
246c62cd9180 8159073: : Error handling incomplete when creating GC threads lazily
jmasa
parents: 39704
diff changeset
    67
           delete new_worker;
246c62cd9180 8159073: : Error handling incomplete when creating GC threads lazily
jmasa
parents: 39704
diff changeset
    68
        }
39704
157f39705057 8157240: GC task trace logging is incomprehensible
jmasa
parents: 38216
diff changeset
    69
        if (initializing) {
40096
246c62cd9180 8159073: : Error handling incomplete when creating GC threads lazily
jmasa
parents: 39704
diff changeset
    70
          vm_exit_out_of_memory(0, OOM_MALLOC_ERROR, "Cannot create worker GC thread. Out of system resources.");
38216
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    71
        }
40096
246c62cd9180 8159073: : Error handling incomplete when creating GC threads lazily
jmasa
parents: 39704
diff changeset
    72
        break;
38216
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    73
      }
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    74
      created_workers++;
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    75
      os::start_thread(new_worker);
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    76
    }
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    77
40096
246c62cd9180 8159073: : Error handling incomplete when creating GC threads lazily
jmasa
parents: 39704
diff changeset
    78
    log_trace(gc, task)("WorkerManager::add_workers() : "
246c62cd9180 8159073: : Error handling incomplete when creating GC threads lazily
jmasa
parents: 39704
diff changeset
    79
                        "created_workers: %u", created_workers);
246c62cd9180 8159073: : Error handling incomplete when creating GC threads lazily
jmasa
parents: 39704
diff changeset
    80
39704
157f39705057 8157240: GC task trace logging is incomprehensible
jmasa
parents: 38216
diff changeset
    81
    return created_workers;
157f39705057 8157240: GC task trace logging is incomprehensible
jmasa
parents: 38216
diff changeset
    82
  }
38216
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    83
39704
157f39705057 8157240: GC task trace logging is incomprehensible
jmasa
parents: 38216
diff changeset
    84
  // Log (at trace level) a change in the number of created workers.
157f39705057 8157240: GC task trace logging is incomprehensible
jmasa
parents: 38216
diff changeset
    85
  template <class WorkerType>
157f39705057 8157240: GC task trace logging is incomprehensible
jmasa
parents: 38216
diff changeset
    86
  static void log_worker_creation(WorkerType* holder,
157f39705057 8157240: GC task trace logging is incomprehensible
jmasa
parents: 38216
diff changeset
    87
                                  uint previous_created_workers,
157f39705057 8157240: GC task trace logging is incomprehensible
jmasa
parents: 38216
diff changeset
    88
                                  uint active_workers,
157f39705057 8157240: GC task trace logging is incomprehensible
jmasa
parents: 38216
diff changeset
    89
                                  uint created_workers,
157f39705057 8157240: GC task trace logging is incomprehensible
jmasa
parents: 38216
diff changeset
    90
                                  bool initializing) {
157f39705057 8157240: GC task trace logging is incomprehensible
jmasa
parents: 38216
diff changeset
    91
    if (previous_created_workers < created_workers) {
157f39705057 8157240: GC task trace logging is incomprehensible
jmasa
parents: 38216
diff changeset
    92
      const char* initializing_msg =  initializing ? "Adding initial" : "Creating additional";
157f39705057 8157240: GC task trace logging is incomprehensible
jmasa
parents: 38216
diff changeset
    93
      log_trace(gc, task)("%s %s(s) previously created workers %u active workers %u total created workers %u",
157f39705057 8157240: GC task trace logging is incomprehensible
jmasa
parents: 38216
diff changeset
    94
                          initializing_msg, holder->group_name(), previous_created_workers, active_workers, created_workers);
157f39705057 8157240: GC task trace logging is incomprehensible
jmasa
parents: 38216
diff changeset
    95
    }
38216
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    96
  }
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    97
};
250794c6f95f 6858051: Create GC worker threads dynamically
jmasa
parents:
diff changeset
    98
#endif // SHARE_VM_GC_SHARED_WORKERMANAGER_HPP