1// Licensed to the .NET Foundation under one or more agreements.
2// The .NET Foundation licenses this file to you under the MIT license.
3// See the LICENSE file in the project root for more information.
4
5#ifndef __GCCONFIG_H__
6#define __GCCONFIG_H__
7
8// gcconfig.h - GC configuration management and retrieval.
9//
10// This file and the GCConfig class are designed to be the primary entry point
11// for querying configuration information from within the GC.
12
13// GCConfigStringHolder is a wrapper around a configuration string obtained
14// from the EE. Such strings must be disposed using GCToEEInterface::FreeStringConfigValue,
15// so this class ensures that is done correctly.
16//
17// The name is unfortunately a little long, but "ConfigStringHolder" is already taken by the
18// EE's config mechanism.
19class GCConfigStringHolder
20{
21private:
22 const char* m_str;
23
24public:
25 // Constructs a new GCConfigStringHolder around a string obtained from
26 // GCToEEInterface::GetStringConfigValue.
27 explicit GCConfigStringHolder(const char* str)
28 : m_str(str) {}
29
30 // No copy operators - this type cannot be copied.
31 GCConfigStringHolder(const GCConfigStringHolder&) = delete;
32 GCConfigStringHolder& operator=(const GCConfigStringHolder&) = delete;
33
34 // This type is returned by-value by string config functions, so it
35 // requires a move constructor.
36 GCConfigStringHolder(GCConfigStringHolder&&) = default;
37
38 // Frees a string config value by delegating to GCToEEInterface::FreeStringConfigValue.
39 ~GCConfigStringHolder()
40 {
41 if (m_str)
42 {
43 GCToEEInterface::FreeStringConfigValue(m_str);
44 }
45
46 m_str = nullptr;
47 }
48
49 // Retrieves the wrapped config string.
50 const char* Get() const { return m_str; }
51};
52
53// Each one of these keys produces a method on GCConfig with the name "Get{name}", where {name}
54// is the first parameter of the *_CONFIG macros below.
55#define GC_CONFIGURATION_KEYS \
56 BOOL_CONFIG(ServerGC, "gcServer", false, "Whether we should be using Server GC") \
57 BOOL_CONFIG(ConcurrentGC, "gcConcurrent", true, "Whether we should be using Concurrent GC") \
58 BOOL_CONFIG(ConservativeGC, "gcConservative", false, "Enables/Disables conservative GC") \
59 BOOL_CONFIG(ForceCompact, "gcForceCompact", false, \
60 "When set to true, always do compacting GC") \
61 BOOL_CONFIG(RetainVM, "GCRetainVM", false, \
62 "When set we put the segments that should be deleted on a standby list (instead of " \
63 "releasing them back to the OS) which will be considered to satisfy new segment requests"\
64 " (note that the same thing can be specified via API which is the supported way)") \
65 BOOL_CONFIG(StressMix, "GCStressMix", false, \
66 "Specifies whether the GC mix mode is enabled or not") \
67 BOOL_CONFIG(BreakOnOOM, "GCBreakOnOOM", false, \
68 "Does a DebugBreak at the soonest time we detect an OOM") \
69 BOOL_CONFIG(NoAffinitize, "GCNoAffinitize", false, \
70 "If set, do not affinitize server GC threads") \
71 BOOL_CONFIG(LogEnabled, "GCLogEnabled", false, \
72 "Specifies if you want to turn on logging in GC") \
73 BOOL_CONFIG(ConfigLogEnabled, "GCConfigLogEnabled", false, \
74 "Specifies the name of the GC config log file") \
75 BOOL_CONFIG(GCNumaAware, "GCNumaAware", true, "Enables numa allocations in the GC") \
76 BOOL_CONFIG(GCCpuGroup, "GCCpuGroup", false, "Enables CPU groups in the GC") \
77 INT_CONFIG(HeapVerifyLevel, "HeapVerify", HEAPVERIFY_NONE, \
78 "When set verifies the integrity of the managed heap on entry and exit of each GC") \
79 INT_CONFIG(LOHCompactionMode, "GCLOHCompact", 0, "Specifies the LOH compaction mode") \
80 INT_CONFIG(LOHThreshold, "GCLOHThreshold", LARGE_OBJECT_SIZE, \
81 "Specifies the size that will make objects go on LOH") \
82 INT_CONFIG(BGCSpinCount, "BGCSpinCount", 140, "Specifies the bgc spin count") \
83 INT_CONFIG(BGCSpin, "BGCSpin", 2, "Specifies the bgc spin time") \
84 INT_CONFIG(HeapCount, "GCHeapCount", 0, "Specifies the number of server GC heaps") \
85 INT_CONFIG(Gen0Size, "GCgen0size", 0, "Specifies the smallest gen0 size") \
86 INT_CONFIG(SegmentSize, "GCSegmentSize", 0, "Specifies the managed heap segment size") \
87 INT_CONFIG(LatencyMode, "GCLatencyMode", -1, \
88 "Specifies the GC latency mode - batch, interactive or low latency (note that the same " \
89 "thing can be specified via API which is the supported way") \
90 INT_CONFIG(LatencyLevel, "GCLatencyLevel", 1, \
91 "Specifies the GC latency level that you want to optimize for. Must be a number from 0" \
92 "3. See documentation for more details on each level.") \
93 INT_CONFIG(LogFileSize, "GCLogFileSize", 0, "Specifies the GC log file size") \
94 INT_CONFIG(CompactRatio, "GCCompactRatio", 0, \
95 "Specifies the ratio compacting GCs vs sweeping") \
96 INT_CONFIG(GCHeapAffinitizeMask, "GCHeapAffinitizeMask", 0, \
97 "Specifies processor mask for Server GC threads") \
98 INT_CONFIG(GCHighMemPercent, "GCHighMemPercent", 0, \
99 "The percent for GC to consider as high memory") \
100 INT_CONFIG(GCProvModeStress, "GCProvModeStress", 0, \
101 "Stress the provisional modes") \
102 STRING_CONFIG(LogFile, "GCLogFile", "Specifies the name of the GC log file") \
103 STRING_CONFIG(ConfigLogFile, "GCConfigLogFile", \
104 "Specifies the name of the GC config log file") \
105 STRING_CONFIG(MixLogFile, "GCMixLog", \
106 "Specifies the name of the log file for GC mix statistics")
107
108// This class is responsible for retreiving configuration information
109// for how the GC should operate.
110class GCConfig
111{
112#define BOOL_CONFIG(name, unused_key, unused_default, unused_doc) \
113 public: static bool Get##name(); \
114 private: static bool s_##name;
115#define INT_CONFIG(name, unused_key, unused_default, unused_doc) \
116 public: static int64_t Get##name(); \
117 private: static int64_t s_##name;
118#define STRING_CONFIG(name, unused_key, unused_doc) \
119 public: static GCConfigStringHolder Get##name();
120GC_CONFIGURATION_KEYS
121#undef BOOL_CONFIG
122#undef INT_CONFIG
123#undef STRING_CONFIG
124
125public:
126// Flags that may inhabit the number returned for the HeapVerifyLevel config option.
127// Keep this in sync with vm\eeconfig.h if this ever changes.
128enum HeapVerifyFlags {
129 HEAPVERIFY_NONE = 0,
130 HEAPVERIFY_GC = 1, // Verify the heap at beginning and end of GC
131 HEAPVERIFY_BARRIERCHECK = 2, // Verify the brick table
132 HEAPVERIFY_SYNCBLK = 4, // Verify sync block scanning
133
134 // the following options can be used to mitigate some of the overhead introduced
135 // by heap verification. some options might cause heap verifiction to be less
136 // effective depending on the scenario.
137
138 HEAPVERIFY_NO_RANGE_CHECKS = 0x10, // Excludes checking if an OBJECTREF is within the bounds of the managed heap
139 HEAPVERIFY_NO_MEM_FILL = 0x20, // Excludes filling unused segment portions with fill pattern
140 HEAPVERIFY_POST_GC_ONLY = 0x40, // Performs heap verification post-GCs only (instead of before and after each GC)
141 HEAPVERIFY_DEEP_ON_COMPACT = 0x80 // Performs deep object verfication only on compacting GCs.
142};
143
144// Initializes the GCConfig subsystem. Must be called before accessing any
145// configuration information.
146static void Initialize();
147
148};
149
150#endif // __GCCONFIG_H__
151