src/hotspot/share/gc/shared/gcConfig.cpp
author stefank
Wed, 22 May 2019 13:06:31 +0200
changeset 54983 81becad91321
parent 52925 9c18c9d839d3
child 59053 ba6c248cae19
permissions -rw-r--r--
8224203: Remove need to specify type when using FLAG_SET macros Reviewed-by: rehn, pliden, coleenp
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
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51206
diff changeset
    46
#if INCLUDE_SHENANDOAHGC
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51206
diff changeset
    47
#include "gc/shenandoah/shenandoahArguments.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51206
diff changeset
    48
#endif
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents: 50523
diff changeset
    49
#if INCLUDE_ZGC
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents: 50523
diff changeset
    50
#include "gc/z/zArguments.hpp"
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents: 50523
diff changeset
    51
#endif
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    52
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    53
struct SupportedGC {
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    54
  bool&               _flag;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    55
  CollectedHeap::Name _name;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    56
  GCArguments&        _arguments;
49922
3a64eea72624 8202364: Add GCConfig::hs_err_name() to avoid GC-specific code in error reporting
pliden
parents: 49629
diff changeset
    57
  const char*         _hs_err_name;
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    58
49922
3a64eea72624 8202364: Add GCConfig::hs_err_name() to avoid GC-specific code in error reporting
pliden
parents: 49629
diff changeset
    59
  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
    60
      _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
    61
};
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    62
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51206
diff changeset
    63
       CMSGC_ONLY(static CMSArguments      cmsArguments;)
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51206
diff changeset
    64
   EPSILONGC_ONLY(static EpsilonArguments  epsilonArguments;)
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51206
diff changeset
    65
        G1GC_ONLY(static G1Arguments       g1Arguments;)
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51206
diff changeset
    66
  PARALLELGC_ONLY(static ParallelArguments parallelArguments;)
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51206
diff changeset
    67
    SERIALGC_ONLY(static SerialArguments   serialArguments;)
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51206
diff changeset
    68
SHENANDOAHGC_ONLY(static ShenandoahArguments shenandoahArguments;)
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51206
diff changeset
    69
         ZGC_ONLY(static ZArguments        zArguments;)
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    70
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    71
// Table of supported GCs, for translating between command
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    72
// line flag, CollectedHeap::Name and GCArguments instance.
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    73
static const SupportedGC SupportedGCs[] = {
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51206
diff changeset
    74
       CMSGC_ONLY_ARG(SupportedGC(UseConcMarkSweepGC, CollectedHeap::CMS,        cmsArguments,        "concurrent mark sweep gc"))
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51206
diff changeset
    75
   EPSILONGC_ONLY_ARG(SupportedGC(UseEpsilonGC,       CollectedHeap::Epsilon,    epsilonArguments,    "epsilon gc"))
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51206
diff changeset
    76
        G1GC_ONLY_ARG(SupportedGC(UseG1GC,            CollectedHeap::G1,         g1Arguments,         "g1 gc"))
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51206
diff changeset
    77
  PARALLELGC_ONLY_ARG(SupportedGC(UseParallelGC,      CollectedHeap::Parallel,   parallelArguments,   "parallel gc"))
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51206
diff changeset
    78
  PARALLELGC_ONLY_ARG(SupportedGC(UseParallelOldGC,   CollectedHeap::Parallel,   parallelArguments,   "parallel gc"))
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51206
diff changeset
    79
    SERIALGC_ONLY_ARG(SupportedGC(UseSerialGC,        CollectedHeap::Serial,     serialArguments,     "serial gc"))
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51206
diff changeset
    80
SHENANDOAHGC_ONLY_ARG(SupportedGC(UseShenandoahGC,    CollectedHeap::Shenandoah, shenandoahArguments, "shenandoah gc"))
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51206
diff changeset
    81
         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
    82
};
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    83
50629
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
    84
#define FOR_EACH_SUPPORTED_GC(var)                                          \
49923
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
    85
  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
    86
50629
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
    87
#define FAIL_IF_SELECTED(option, enabled)                                   \
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
    88
  if (option == enabled && FLAG_IS_CMDLINE(option)) {                       \
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
    89
    vm_exit_during_initialization(enabled ?                                 \
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
    90
                                  "Option -XX:+" #option " not supported" : \
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
    91
                                  "Option -XX:-" #option " not supported"); \
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
    92
  }
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
    93
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    94
GCArguments* GCConfig::_arguments = NULL;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    95
bool GCConfig::_gc_selected_ergonomically = false;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
    96
50629
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
    97
void GCConfig::fail_if_unsupported_gc_is_selected() {
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51206
diff changeset
    98
  NOT_CMSGC(       FAIL_IF_SELECTED(UseConcMarkSweepGC, true));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51206
diff changeset
    99
  NOT_EPSILONGC(   FAIL_IF_SELECTED(UseEpsilonGC,       true));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51206
diff changeset
   100
  NOT_G1GC(        FAIL_IF_SELECTED(UseG1GC,            true));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51206
diff changeset
   101
  NOT_PARALLELGC(  FAIL_IF_SELECTED(UseParallelGC,      true));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51206
diff changeset
   102
  NOT_PARALLELGC(  FAIL_IF_SELECTED(UseParallelOldGC,   true));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51206
diff changeset
   103
  NOT_SERIALGC(    FAIL_IF_SELECTED(UseSerialGC,        true));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51206
diff changeset
   104
  NOT_SERIALGC(    FAIL_IF_SELECTED(UseParallelOldGC,   false));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51206
diff changeset
   105
  NOT_SHENANDOAHGC(FAIL_IF_SELECTED(UseShenandoahGC,    true));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51206
diff changeset
   106
  NOT_ZGC(         FAIL_IF_SELECTED(UseZGC,             true));
50629
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
   107
}
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
   108
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   109
void GCConfig::select_gc_ergonomically() {
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   110
  if (os::is_server_class_machine()) {
49982
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   111
#if INCLUDE_G1GC
54983
81becad91321 8224203: Remove need to specify type when using FLAG_SET macros
stefank
parents: 52925
diff changeset
   112
    FLAG_SET_ERGO_IF_DEFAULT(UseG1GC, true);
49982
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   113
#elif INCLUDE_PARALLELGC
54983
81becad91321 8224203: Remove need to specify type when using FLAG_SET macros
stefank
parents: 52925
diff changeset
   114
    FLAG_SET_ERGO_IF_DEFAULT(UseParallelGC, true);
49982
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   115
#elif INCLUDE_SERIALGC
54983
81becad91321 8224203: Remove need to specify type when using FLAG_SET macros
stefank
parents: 52925
diff changeset
   116
    FLAG_SET_ERGO_IF_DEFAULT(UseSerialGC, true);
49982
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   117
#endif
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   118
  } else {
49982
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   119
#if INCLUDE_SERIALGC
54983
81becad91321 8224203: Remove need to specify type when using FLAG_SET macros
stefank
parents: 52925
diff changeset
   120
    FLAG_SET_ERGO_IF_DEFAULT(UseSerialGC, true);
49982
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   121
#endif
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   122
  }
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
bool GCConfig::is_no_gc_selected() {
49923
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
   126
  FOR_EACH_SUPPORTED_GC(gc) {
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
   127
    if (gc->_flag) {
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   128
      return false;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   129
    }
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   130
  }
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   131
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   132
  return true;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   133
}
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   134
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   135
bool GCConfig::is_exactly_one_gc_selected() {
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   136
  CollectedHeap::Name selected = CollectedHeap::None;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   137
49923
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
   138
  FOR_EACH_SUPPORTED_GC(gc) {
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
   139
    if (gc->_flag) {
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
   140
      if (gc->_name == selected || selected == CollectedHeap::None) {
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   141
        // Selected
49923
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
   142
        selected = gc->_name;
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   143
      } else {
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   144
        // More than one selected
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   145
        return false;
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
    }
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   148
  }
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   149
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   150
  return selected != CollectedHeap::None;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   151
}
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   152
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   153
GCArguments* GCConfig::select_gc() {
50629
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
   154
  // Fail immediately if an unsupported GC is selected
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
   155
  fail_if_unsupported_gc_is_selected();
645a5962201d 8205064: Fail immediately if an unavailable GC is selected
pliden
parents: 50525
diff changeset
   156
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   157
  if (is_no_gc_selected()) {
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   158
    // Try select GC ergonomically
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   159
    select_gc_ergonomically();
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
    if (is_no_gc_selected()) {
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   162
      // Failed to select GC ergonomically
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   163
      vm_exit_during_initialization("Garbage collector not selected "
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   164
                                    "(default collector explicitly disabled)", NULL);
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   165
    }
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   166
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   167
    // Succeeded to select GC ergonomically
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   168
    _gc_selected_ergonomically = true;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   169
  }
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   170
49982
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   171
  if (!is_exactly_one_gc_selected()) {
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   172
    // More than one GC selected
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   173
    vm_exit_during_initialization("Multiple garbage collectors selected", NULL);
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   174
  }
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   175
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   176
  // Exactly one GC selected
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   177
  FOR_EACH_SUPPORTED_GC(gc) {
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   178
    if (gc->_flag) {
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   179
      return &gc->_arguments;
49629
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
49982
9042ffe5b7fe 8200729: Conditional compilation of GCs
stefank
parents: 49923
diff changeset
   183
  fatal("Should have found the selected GC");
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   184
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   185
  return NULL;
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
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   188
void GCConfig::initialize() {
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   189
  assert(_arguments == NULL, "Already initialized");
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   190
  _arguments = select_gc();
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   191
}
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
bool GCConfig::is_gc_supported(CollectedHeap::Name name) {
49923
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
   194
  FOR_EACH_SUPPORTED_GC(gc) {
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
   195
    if (gc->_name == name) {
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   196
      // Supported
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   197
      return true;
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
  }
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   200
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   201
  // Not supported
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   202
  return false;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   203
}
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
bool GCConfig::is_gc_selected(CollectedHeap::Name name) {
49923
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
   206
  FOR_EACH_SUPPORTED_GC(gc) {
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
   207
    if (gc->_name == name && gc->_flag) {
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   208
      // Selected
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   209
      return true;
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
  }
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   212
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   213
  // Not selected
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   214
  return false;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   215
}
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   216
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   217
bool GCConfig::is_gc_selected_ergonomically() {
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   218
  return _gc_selected_ergonomically;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   219
}
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   220
49922
3a64eea72624 8202364: Add GCConfig::hs_err_name() to avoid GC-specific code in error reporting
pliden
parents: 49629
diff changeset
   221
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
   222
  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
   223
    // Exacly one GC selected
49923
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
   224
    FOR_EACH_SUPPORTED_GC(gc) {
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
   225
      if (gc->_flag) {
764aea6237ad 8202366: Add macro for common loop in GCConfig
pliden
parents: 49922
diff changeset
   226
        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
   227
      }
3a64eea72624 8202364: Add GCConfig::hs_err_name() to avoid GC-specific code in error reporting
pliden
parents: 49629
diff changeset
   228
    }
3a64eea72624 8202364: Add GCConfig::hs_err_name() to avoid GC-specific code in error reporting
pliden
parents: 49629
diff changeset
   229
  }
3a64eea72624 8202364: Add GCConfig::hs_err_name() to avoid GC-specific code in error reporting
pliden
parents: 49629
diff changeset
   230
3a64eea72624 8202364: Add GCConfig::hs_err_name() to avoid GC-specific code in error reporting
pliden
parents: 49629
diff changeset
   231
  // 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
   232
  return "unknown gc";
3a64eea72624 8202364: Add GCConfig::hs_err_name() to avoid GC-specific code in error reporting
pliden
parents: 49629
diff changeset
   233
}
3a64eea72624 8202364: Add GCConfig::hs_err_name() to avoid GC-specific code in error reporting
pliden
parents: 49629
diff changeset
   234
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
   235
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
   236
  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
   237
    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
   238
      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
   239
    }
14b870bda24f 8207069: [AOT] we should check that VM uses the same GC as one used for AOT library generation.
kvn
parents: 50629
diff changeset
   240
  }
14b870bda24f 8207069: [AOT] we should check that VM uses the same GC as one used for AOT library generation.
kvn
parents: 50629
diff changeset
   241
  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
   242
}
14b870bda24f 8207069: [AOT] we should check that VM uses the same GC as one used for AOT library generation.
kvn
parents: 50629
diff changeset
   243
49629
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   244
GCArguments* GCConfig::arguments() {
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   245
  assert(_arguments != NULL, "Not initialized");
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   246
  return _arguments;
b786280276dc 8199925: Break out GC selection logic from GCArguments to GCConfig
pliden
parents:
diff changeset
   247
}