src/hotspot/share/gc/shared/gcConfig.cpp
author eosterlund
Tue, 16 Oct 2018 13:18:22 +0200
changeset 52142 ca0c25e01c5b
parent 51206 14b870bda24f
child 52925 9c18c9d839d3
permissions -rw-r--r--
8210498: nmethod entry barriers Reviewed-by: kvn, pliden
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
     1
/*
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
     2
 * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
     4
 *
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
     7
 * published by the Free Software Foundation.
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
     8
 *
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    13
 * accompanied this code).
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    14
 *
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    18
 *
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    21
 * questions.
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    22
 *
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    23
 */
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    24
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    25
#include "precompiled.hpp"
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    26
#include "gc/shared/gcConfig.hpp"
49982
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
    27
#include "runtime/globals_extension.hpp"
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    28
#include "runtime/java.hpp"
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    29
#include "runtime/os.hpp"
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    30
#include "utilities/macros.hpp"
49982
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
    31
#if INCLUDE_CMSGC
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    32
#include "gc/cms/cmsArguments.hpp"
49982
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
    33
#endif
50523
7b7c75d87f9b 8204180: Implementation: JEP 318: Epsilon, A No-Op Garbage Collector
shade
parents: 49982
diff changeset
    34
#if INCLUDE_EPSILONGC
7b7c75d87f9b 8204180: Implementation: JEP 318: Epsilon, A No-Op Garbage Collector
shade
parents: 49982
diff changeset
    35
#include "gc/epsilon/epsilonArguments.hpp"
7b7c75d87f9b 8204180: Implementation: JEP 318: Epsilon, A No-Op Garbage Collector
shade
parents: 49982
diff changeset
    36
#endif
49982
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
    37
#if INCLUDE_G1GC
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    38
#include "gc/g1/g1Arguments.hpp"
49982
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
    39
#endif
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
    40
#if INCLUDE_PARALLELGC
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
    41
#include "gc/parallel/parallelArguments.hpp"
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
    42
#endif
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
    43
#if INCLUDE_SERIALGC
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
    44
#include "gc/serial/serialArguments.hpp"
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
    45
#endif
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents: 50523
diff changeset
    46
#if INCLUDE_ZGC
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents: 50523
diff changeset
    47
#include "gc/z/zArguments.hpp"
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents: 50523
diff changeset
    48
#endif
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    49
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    50
struct SupportedGC {
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    51
  bool&               _flag;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    52
  CollectedHeap::Name _name;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    53
  GCArguments&        _arguments;
49922
3a64eea72624 8202364: Add GCConfig::hs_err_name() to avoid GC-specific code in error reporting
pliden
parents: 49629
diff changeset
    54
  const char*         _hs_err_name;
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    55
49922
3a64eea72624 8202364: Add GCConfig::hs_err_name() to avoid GC-specific code in error reporting
pliden
parents: 49629
diff changeset
    56
  SupportedGC(bool& flag, CollectedHeap::Name name, GCArguments& arguments, const char* hs_err_name) :
3a64eea72624 8202364: Add GCConfig::hs_err_name() to avoid GC-specific code in error reporting
pliden
parents: 49629
diff changeset
    57
      _flag(flag), _name(name), _arguments(arguments), _hs_err_name(hs_err_name) {}
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    58
};
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    59
49982
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
    60
     CMSGC_ONLY(static CMSArguments      cmsArguments;)
50523
7b7c75d87f9b 8204180: Implementation: JEP 318: Epsilon, A No-Op Garbage Collector
shade
parents: 49982
diff changeset
    61
 EPSILONGC_ONLY(static EpsilonArguments  epsilonArguments;)
49982
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
    62
      G1GC_ONLY(static G1Arguments       g1Arguments;)
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
    63
PARALLELGC_ONLY(static ParallelArguments parallelArguments;)
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
    64
  SERIALGC_ONLY(static SerialArguments   serialArguments;)
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents: 50523
diff changeset
    65
       ZGC_ONLY(static ZArguments        zArguments;)
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    66
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    67
// Table of supported GCs, for translating between command
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    68
// line flag, CollectedHeap::Name and GCArguments instance.
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    69
static const SupportedGC SupportedGCs[] = {
49982
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
    70
       CMSGC_ONLY_ARG(SupportedGC(UseConcMarkSweepGC, CollectedHeap::CMS,      cmsArguments,      "concurrent mark sweep gc"))
50523
7b7c75d87f9b 8204180: Implementation: JEP 318: Epsilon, A No-Op Garbage Collector
shade
parents: 49982
diff changeset
    71
   EPSILONGC_ONLY_ARG(SupportedGC(UseEpsilonGC,       CollectedHeap::Epsilon,  epsilonArguments,  "epsilon gc"))
49982
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
    72
        G1GC_ONLY_ARG(SupportedGC(UseG1GC,            CollectedHeap::G1,       g1Arguments,       "g1 gc"))
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
    73
  PARALLELGC_ONLY_ARG(SupportedGC(UseParallelGC,      CollectedHeap::Parallel, parallelArguments, "parallel gc"))
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
    74
  PARALLELGC_ONLY_ARG(SupportedGC(UseParallelOldGC,   CollectedHeap::Parallel, parallelArguments, "parallel gc"))
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
    75
    SERIALGC_ONLY_ARG(SupportedGC(UseSerialGC,        CollectedHeap::Serial,   serialArguments,   "serial gc"))
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents: 50523
diff changeset
    76
         ZGC_ONLY_ARG(SupportedGC(UseZGC,             CollectedHeap::Z,        zArguments,        "z gc"))
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    77
};
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    78
50629
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
    79
#define FOR_EACH_SUPPORTED_GC(var)                                          \
49923
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
    80
  for (const SupportedGC* var = &SupportedGCs[0]; var < &SupportedGCs[ARRAY_SIZE(SupportedGCs)]; var++)
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
    81
50629
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
    82
#define FAIL_IF_SELECTED(option, enabled)                                   \
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
    83
  if (option == enabled && FLAG_IS_CMDLINE(option)) {                       \
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
    84
    vm_exit_during_initialization(enabled ?                                 \
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
    85
                                  "Option -XX:+" #option " not supported" : \
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
    86
                                  "Option -XX:-" #option " not supported"); \
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
    87
  }
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
    88
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    89
GCArguments* GCConfig::_arguments = NULL;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    90
bool GCConfig::_gc_selected_ergonomically = false;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    91
50629
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
    92
void GCConfig::fail_if_unsupported_gc_is_selected() {
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
    93
  NOT_CMSGC(     FAIL_IF_SELECTED(UseConcMarkSweepGC, true));
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
    94
  NOT_EPSILONGC( FAIL_IF_SELECTED(UseEpsilonGC,       true));
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
    95
  NOT_G1GC(      FAIL_IF_SELECTED(UseG1GC,            true));
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
    96
  NOT_PARALLELGC(FAIL_IF_SELECTED(UseParallelGC,      true));
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
    97
  NOT_PARALLELGC(FAIL_IF_SELECTED(UseParallelOldGC,   true));
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
    98
  NOT_SERIALGC(  FAIL_IF_SELECTED(UseSerialGC,        true));
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
    99
  NOT_SERIALGC(  FAIL_IF_SELECTED(UseParallelOldGC,   false));
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
   100
  NOT_ZGC(       FAIL_IF_SELECTED(UseZGC,             true));
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
   101
}
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
   102
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   103
void GCConfig::select_gc_ergonomically() {
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   104
  if (os::is_server_class_machine()) {
49982
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   105
#if INCLUDE_G1GC
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   106
    FLAG_SET_ERGO_IF_DEFAULT(bool, UseG1GC, true);
49982
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   107
#elif INCLUDE_PARALLELGC
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   108
    FLAG_SET_ERGO_IF_DEFAULT(bool, UseParallelGC, true);
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   109
#elif INCLUDE_SERIALGC
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   110
    FLAG_SET_ERGO_IF_DEFAULT(bool, UseSerialGC, true);
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   111
#endif
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   112
  } else {
49982
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   113
#if INCLUDE_SERIALGC
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   114
    FLAG_SET_ERGO_IF_DEFAULT(bool, UseSerialGC, true);
49982
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   115
#endif
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   116
  }
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   117
}
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   118
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   119
bool GCConfig::is_no_gc_selected() {
49923
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
   120
  FOR_EACH_SUPPORTED_GC(gc) {
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
   121
    if (gc->_flag) {
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   122
      return false;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   123
    }
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   124
  }
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   125
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   126
  return true;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   127
}
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   128
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   129
bool GCConfig::is_exactly_one_gc_selected() {
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   130
  CollectedHeap::Name selected = CollectedHeap::None;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   131
49923
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
   132
  FOR_EACH_SUPPORTED_GC(gc) {
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
   133
    if (gc->_flag) {
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
   134
      if (gc->_name == selected || selected == CollectedHeap::None) {
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   135
        // Selected
49923
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
   136
        selected = gc->_name;
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   137
      } else {
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   138
        // More than one selected
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   139
        return false;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   140
      }
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   141
    }
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   142
  }
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   143
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   144
  return selected != CollectedHeap::None;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   145
}
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   146
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   147
GCArguments* GCConfig::select_gc() {
50629
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
   148
  // Fail immediately if an unsupported GC is selected
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
   149
  fail_if_unsupported_gc_is_selected();
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
   150
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   151
  if (is_no_gc_selected()) {
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   152
    // Try select GC ergonomically
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   153
    select_gc_ergonomically();
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   154
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   155
    if (is_no_gc_selected()) {
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   156
      // Failed to select GC ergonomically
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   157
      vm_exit_during_initialization("Garbage collector not selected "
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   158
                                    "(default collector explicitly disabled)", NULL);
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   159
    }
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   160
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   161
    // Succeeded to select GC ergonomically
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   162
    _gc_selected_ergonomically = true;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   163
  }
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   164
49982
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   165
  if (!is_exactly_one_gc_selected()) {
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   166
    // More than one GC selected
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   167
    vm_exit_during_initialization("Multiple garbage collectors selected", NULL);
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   168
  }
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   169
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   170
  // Exactly one GC selected
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   171
  FOR_EACH_SUPPORTED_GC(gc) {
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   172
    if (gc->_flag) {
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   173
      return &gc->_arguments;
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   174
    }
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   175
  }
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   176
49982
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   177
  fatal("Should have found the selected GC");
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   178
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   179
  return NULL;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   180
}
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   181
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   182
void GCConfig::initialize() {
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   183
  assert(_arguments == NULL, "Already initialized");
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   184
  _arguments = select_gc();
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   185
}
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   186
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   187
bool GCConfig::is_gc_supported(CollectedHeap::Name name) {
49923
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
   188
  FOR_EACH_SUPPORTED_GC(gc) {
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
   189
    if (gc->_name == name) {
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   190
      // Supported
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   191
      return true;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   192
    }
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   193
  }
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   194
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   195
  // Not supported
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   196
  return false;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   197
}
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   198
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   199
bool GCConfig::is_gc_selected(CollectedHeap::Name name) {
49923
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
   200
  FOR_EACH_SUPPORTED_GC(gc) {
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
   201
    if (gc->_name == name && gc->_flag) {
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   202
      // Selected
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   203
      return true;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   204
    }
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   205
  }
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   206
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   207
  // Not selected
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   208
  return false;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   209
}
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   210
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   211
bool GCConfig::is_gc_selected_ergonomically() {
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   212
  return _gc_selected_ergonomically;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   213
}
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   214
49922
3a64eea72624 8202364: Add GCConfig::hs_err_name() to avoid GC-specific code in error reporting
pliden
parents: 49629
diff changeset
   215
const char* GCConfig::hs_err_name() {
3a64eea72624 8202364: Add GCConfig::hs_err_name() to avoid GC-specific code in error reporting
pliden
parents: 49629
diff changeset
   216
  if (is_exactly_one_gc_selected()) {
3a64eea72624 8202364: Add GCConfig::hs_err_name() to avoid GC-specific code in error reporting
pliden
parents: 49629
diff changeset
   217
    // Exacly one GC selected
49923
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
   218
    FOR_EACH_SUPPORTED_GC(gc) {
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
   219
      if (gc->_flag) {
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
   220
        return gc->_hs_err_name;
49922
3a64eea72624 8202364: Add GCConfig::hs_err_name() to avoid GC-specific code in error reporting
pliden
parents: 49629
diff changeset
   221
      }
3a64eea72624 8202364: Add GCConfig::hs_err_name() to avoid GC-specific code in error reporting
pliden
parents: 49629
diff changeset
   222
    }
3a64eea72624 8202364: Add GCConfig::hs_err_name() to avoid GC-specific code in error reporting
pliden
parents: 49629
diff changeset
   223
  }
3a64eea72624 8202364: Add GCConfig::hs_err_name() to avoid GC-specific code in error reporting
pliden
parents: 49629
diff changeset
   224
3a64eea72624 8202364: Add GCConfig::hs_err_name() to avoid GC-specific code in error reporting
pliden
parents: 49629
diff changeset
   225
  // Zero or more than one GC selected
3a64eea72624 8202364: Add GCConfig::hs_err_name() to avoid GC-specific code in error reporting
pliden
parents: 49629
diff changeset
   226
  return "unknown gc";
3a64eea72624 8202364: Add GCConfig::hs_err_name() to avoid GC-specific code in error reporting
pliden
parents: 49629
diff changeset
   227
}
3a64eea72624 8202364: Add GCConfig::hs_err_name() to avoid GC-specific code in error reporting
pliden
parents: 49629
diff changeset
   228
51206
14b870bda24f 8207069: [AOT] we should check that VM uses the same GC as one used for AOT library generation.
kvn
parents: 50629
diff changeset
   229
const char* GCConfig::hs_err_name(CollectedHeap::Name name) {
14b870bda24f 8207069: [AOT] we should check that VM uses the same GC as one used for AOT library generation.
kvn
parents: 50629
diff changeset
   230
  FOR_EACH_SUPPORTED_GC(gc) {
14b870bda24f 8207069: [AOT] we should check that VM uses the same GC as one used for AOT library generation.
kvn
parents: 50629
diff changeset
   231
    if (gc->_name == name) {
14b870bda24f 8207069: [AOT] we should check that VM uses the same GC as one used for AOT library generation.
kvn
parents: 50629
diff changeset
   232
      return gc->_hs_err_name;
14b870bda24f 8207069: [AOT] we should check that VM uses the same GC as one used for AOT library generation.
kvn
parents: 50629
diff changeset
   233
    }
14b870bda24f 8207069: [AOT] we should check that VM uses the same GC as one used for AOT library generation.
kvn
parents: 50629
diff changeset
   234
  }
14b870bda24f 8207069: [AOT] we should check that VM uses the same GC as one used for AOT library generation.
kvn
parents: 50629
diff changeset
   235
  return "unknown gc";
14b870bda24f 8207069: [AOT] we should check that VM uses the same GC as one used for AOT library generation.
kvn
parents: 50629
diff changeset
   236
}
14b870bda24f 8207069: [AOT] we should check that VM uses the same GC as one used for AOT library generation.
kvn
parents: 50629
diff changeset
   237
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   238
GCArguments* GCConfig::arguments() {
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   239
  assert(_arguments != NULL, "Not initialized");
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   240
  return _arguments;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   241
}