annotate src/share/vm/runtime/globals.cpp @ 1145:e018e6884bd8

6631166: CMS: better heuristics when combatting fragmentation Summary: Autonomic per-worker free block cache sizing, tunable coalition policies, fixes to per-size block statistics, retuned gain and bandwidth of some feedback loop filters to allow quicker reactivity to abrupt changes in ambient demand, and other heuristics to reduce fragmentation of the CMS old gen. Also tightened some assertions, including those related to locking. Reviewed-by: jmasa
author ysr
date Wed, 23 Dec 2009 09:23:54 -0800
parents 7c57aead6d3e
children f62a22282a47
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
196
d1605aabd0a1 6719955: Update copyright year
xdono
parents: 113
diff changeset
2 * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 # include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 # include "incls/_globals.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28
a61af66fc99e Initial load
duke
parents:
diff changeset
29 RUNTIME_FLAGS(MATERIALIZE_DEVELOPER_FLAG, MATERIALIZE_PD_DEVELOPER_FLAG, \
a61af66fc99e Initial load
duke
parents:
diff changeset
30 MATERIALIZE_PRODUCT_FLAG, MATERIALIZE_PD_PRODUCT_FLAG, \
350
d28aa69f0959 6618726: Introduce -XX:+UnlockExperimentalVMOptions flag
ysr
parents: 342
diff changeset
31 MATERIALIZE_DIAGNOSTIC_FLAG, MATERIALIZE_EXPERIMENTAL_FLAG, \
d28aa69f0959 6618726: Introduce -XX:+UnlockExperimentalVMOptions flag
ysr
parents: 342
diff changeset
32 MATERIALIZE_NOTPRODUCT_FLAG, \
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 103
diff changeset
33 MATERIALIZE_MANAGEABLE_FLAG, MATERIALIZE_PRODUCT_RW_FLAG, \
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 103
diff changeset
34 MATERIALIZE_LP64_PRODUCT_FLAG)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
35
a61af66fc99e Initial load
duke
parents:
diff changeset
36 RUNTIME_OS_FLAGS(MATERIALIZE_DEVELOPER_FLAG, MATERIALIZE_PD_DEVELOPER_FLAG, \
a61af66fc99e Initial load
duke
parents:
diff changeset
37 MATERIALIZE_PRODUCT_FLAG, MATERIALIZE_PD_PRODUCT_FLAG, \
a61af66fc99e Initial load
duke
parents:
diff changeset
38 MATERIALIZE_DIAGNOSTIC_FLAG, MATERIALIZE_NOTPRODUCT_FLAG)
a61af66fc99e Initial load
duke
parents:
diff changeset
39
a61af66fc99e Initial load
duke
parents:
diff changeset
40 bool Flag::is_unlocker() const {
350
d28aa69f0959 6618726: Introduce -XX:+UnlockExperimentalVMOptions flag
ysr
parents: 342
diff changeset
41 return strcmp(name, "UnlockDiagnosticVMOptions") == 0 ||
d28aa69f0959 6618726: Introduce -XX:+UnlockExperimentalVMOptions flag
ysr
parents: 342
diff changeset
42 strcmp(name, "UnlockExperimentalVMOptions") == 0;
d28aa69f0959 6618726: Introduce -XX:+UnlockExperimentalVMOptions flag
ysr
parents: 342
diff changeset
43
0
a61af66fc99e Initial load
duke
parents:
diff changeset
44 }
a61af66fc99e Initial load
duke
parents:
diff changeset
45
a61af66fc99e Initial load
duke
parents:
diff changeset
46 bool Flag::is_unlocked() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
47 if (strcmp(kind, "{diagnostic}") == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
48 return UnlockDiagnosticVMOptions;
1080
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 1067
diff changeset
49 } else if (strcmp(kind, "{experimental}") == 0 ||
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 1067
diff changeset
50 strcmp(kind, "{C2 experimental}") == 0) {
350
d28aa69f0959 6618726: Introduce -XX:+UnlockExperimentalVMOptions flag
ysr
parents: 342
diff changeset
51 return UnlockExperimentalVMOptions;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
52 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
53 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
54 }
a61af66fc99e Initial load
duke
parents:
diff changeset
55 }
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57 bool Flag::is_writeable() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
58 return (strcmp(kind, "{manageable}") == 0 || strcmp(kind, "{product rw}") == 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
59 }
a61af66fc99e Initial load
duke
parents:
diff changeset
60
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // All flags except "manageable" are assumed internal flags.
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // Long term, we need to define a mechanism to specify which flags
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // are external/stable and change this function accordingly.
a61af66fc99e Initial load
duke
parents:
diff changeset
64 bool Flag::is_external() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
65 return (strcmp(kind, "{manageable}") == 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
66 }
a61af66fc99e Initial load
duke
parents:
diff changeset
67
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // Length of format string (e.g. "%.1234s") for printing ccstr below
a61af66fc99e Initial load
duke
parents:
diff changeset
69 #define FORMAT_BUFFER_LEN 16
a61af66fc99e Initial load
duke
parents:
diff changeset
70
a61af66fc99e Initial load
duke
parents:
diff changeset
71 void Flag::print_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
72 st->print("%5s %-35s %c= ", type, name, (origin != DEFAULT ? ':' : ' '));
1067
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 1064
diff changeset
73 if (is_bool()) st->print("%-16s", get_bool() ? "true" : "false");
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 1064
diff changeset
74 if (is_intx()) st->print("%-16ld", get_intx());
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 1064
diff changeset
75 if (is_uintx()) st->print("%-16lu", get_uintx());
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 1064
diff changeset
76 if (is_uint64_t()) st->print("%-16lu", get_uint64_t());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
77 if (is_ccstr()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
78 const char* cp = get_ccstr();
103
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
79 if (cp != NULL) {
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
80 const char* eol;
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
81 while ((eol = strchr(cp, '\n')) != NULL) {
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
82 char format_buffer[FORMAT_BUFFER_LEN];
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
83 size_t llen = pointer_delta(eol, cp, sizeof(char));
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
84 jio_snprintf(format_buffer, FORMAT_BUFFER_LEN,
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
85 "%%." SIZE_FORMAT "s", llen);
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
86 st->print(format_buffer, cp);
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
87 st->cr();
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
88 cp = eol+1;
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
89 st->print("%5s %-35s += ", "", name);
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
90 }
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
91 st->print("%-16s", cp);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
92 }
a61af66fc99e Initial load
duke
parents:
diff changeset
93 }
a61af66fc99e Initial load
duke
parents:
diff changeset
94 st->print(" %s", kind);
a61af66fc99e Initial load
duke
parents:
diff changeset
95 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
96 }
a61af66fc99e Initial load
duke
parents:
diff changeset
97
a61af66fc99e Initial load
duke
parents:
diff changeset
98 void Flag::print_as_flag(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
99 if (is_bool()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
100 st->print("-XX:%s%s", get_bool() ? "+" : "-", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
101 } else if (is_intx()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
102 st->print("-XX:%s=" INTX_FORMAT, name, get_intx());
a61af66fc99e Initial load
duke
parents:
diff changeset
103 } else if (is_uintx()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
104 st->print("-XX:%s=" UINTX_FORMAT, name, get_uintx());
1067
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 1064
diff changeset
105 } else if (is_uint64_t()) {
ba7ea42fc66e 6898160: Need serviceability support for new vm argument type 'uint64_t'
phh
parents: 1064
diff changeset
106 st->print("-XX:%s=" UINT64_FORMAT, name, get_uint64_t());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
107 } else if (is_ccstr()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
108 st->print("-XX:%s=", name);
103
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
109 const char* cp = get_ccstr();
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
110 if (cp != NULL) {
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
111 // Need to turn embedded '\n's back into separate arguments
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
112 // Not so efficient to print one character at a time,
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
113 // but the choice is to do the transformation to a buffer
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
114 // and print that. And this need not be efficient.
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
115 for (; *cp != '\0'; cp += 1) {
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
116 switch (*cp) {
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
117 default:
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
118 st->print("%c", *cp);
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
119 break;
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
120 case '\n':
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
121 st->print(" -XX:%s=", name);
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
122 break;
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
123 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
124 }
a61af66fc99e Initial load
duke
parents:
diff changeset
125 }
a61af66fc99e Initial load
duke
parents:
diff changeset
126 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
127 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
129 }
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // 4991491 do not "optimize out" the was_set false values: omitting them
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // tickles a Microsoft compiler bug causing flagTable to be malformed
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134 #define RUNTIME_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{product}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
135 #define RUNTIME_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{pd product}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
136 #define RUNTIME_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{diagnostic}", DEFAULT },
350
d28aa69f0959 6618726: Introduce -XX:+UnlockExperimentalVMOptions flag
ysr
parents: 342
diff changeset
137 #define RUNTIME_EXPERIMENTAL_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{experimental}", DEFAULT },
0
a61af66fc99e Initial load
duke
parents:
diff changeset
138 #define RUNTIME_MANAGEABLE_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{manageable}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
139 #define RUNTIME_PRODUCT_RW_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{product rw}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141 #ifdef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
142 #define RUNTIME_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
a61af66fc99e Initial load
duke
parents:
diff changeset
143 #define RUNTIME_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */
a61af66fc99e Initial load
duke
parents:
diff changeset
144 #define RUNTIME_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc)
a61af66fc99e Initial load
duke
parents:
diff changeset
145 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
146 #define RUNTIME_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
147 #define RUNTIME_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{pd}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
148 #define RUNTIME_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{notproduct}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
149 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
150
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 103
diff changeset
151 #ifdef _LP64
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 103
diff changeset
152 #define RUNTIME_LP64_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{lp64_product}", DEFAULT },
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 103
diff changeset
153 #else
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 103
diff changeset
154 #define RUNTIME_LP64_PRODUCT_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 103
diff changeset
155 #endif // _LP64
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 103
diff changeset
156
0
a61af66fc99e Initial load
duke
parents:
diff changeset
157 #define C1_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C1 product}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
158 #define C1_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{C1 pd product}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
159 #ifdef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
160 #define C1_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
a61af66fc99e Initial load
duke
parents:
diff changeset
161 #define C1_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */
a61af66fc99e Initial load
duke
parents:
diff changeset
162 #define C1_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc)
a61af66fc99e Initial load
duke
parents:
diff changeset
163 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
164 #define C1_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C1}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
165 #define C1_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{C1 pd}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
166 #define C1_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C1 notproduct}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
167 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169
a61af66fc99e Initial load
duke
parents:
diff changeset
170 #define C2_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C2 product}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
171 #define C2_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{C2 pd product}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
172 #define C2_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C2 diagnostic}", DEFAULT },
1080
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 1067
diff changeset
173 #define C2_EXPERIMENTAL_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C2 experimental}", DEFAULT },
0
a61af66fc99e Initial load
duke
parents:
diff changeset
174 #ifdef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
175 #define C2_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
a61af66fc99e Initial load
duke
parents:
diff changeset
176 #define C2_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */
a61af66fc99e Initial load
duke
parents:
diff changeset
177 #define C2_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc)
a61af66fc99e Initial load
duke
parents:
diff changeset
178 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
179 #define C2_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C2}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
180 #define C2_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{C2 pd}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
181 #define C2_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C2 notproduct}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
182 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
183
a61af66fc99e Initial load
duke
parents:
diff changeset
184
a61af66fc99e Initial load
duke
parents:
diff changeset
185 static Flag flagTable[] = {
350
d28aa69f0959 6618726: Introduce -XX:+UnlockExperimentalVMOptions flag
ysr
parents: 342
diff changeset
186 RUNTIME_FLAGS(RUNTIME_DEVELOP_FLAG_STRUCT, RUNTIME_PD_DEVELOP_FLAG_STRUCT, RUNTIME_PRODUCT_FLAG_STRUCT, RUNTIME_PD_PRODUCT_FLAG_STRUCT, RUNTIME_DIAGNOSTIC_FLAG_STRUCT, RUNTIME_EXPERIMENTAL_FLAG_STRUCT, RUNTIME_NOTPRODUCT_FLAG_STRUCT, RUNTIME_MANAGEABLE_FLAG_STRUCT, RUNTIME_PRODUCT_RW_FLAG_STRUCT, RUNTIME_LP64_PRODUCT_FLAG_STRUCT)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
187 RUNTIME_OS_FLAGS(RUNTIME_DEVELOP_FLAG_STRUCT, RUNTIME_PD_DEVELOP_FLAG_STRUCT, RUNTIME_PRODUCT_FLAG_STRUCT, RUNTIME_PD_PRODUCT_FLAG_STRUCT, RUNTIME_DIAGNOSTIC_FLAG_STRUCT, RUNTIME_NOTPRODUCT_FLAG_STRUCT)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
188 #ifndef SERIALGC
350
d28aa69f0959 6618726: Introduce -XX:+UnlockExperimentalVMOptions flag
ysr
parents: 342
diff changeset
189 G1_FLAGS(RUNTIME_DEVELOP_FLAG_STRUCT, RUNTIME_PD_DEVELOP_FLAG_STRUCT, RUNTIME_PRODUCT_FLAG_STRUCT, RUNTIME_PD_PRODUCT_FLAG_STRUCT, RUNTIME_DIAGNOSTIC_FLAG_STRUCT, RUNTIME_EXPERIMENTAL_FLAG_STRUCT, RUNTIME_NOTPRODUCT_FLAG_STRUCT, RUNTIME_MANAGEABLE_FLAG_STRUCT, RUNTIME_PRODUCT_RW_FLAG_STRUCT)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
190 #endif // SERIALGC
0
a61af66fc99e Initial load
duke
parents:
diff changeset
191 #ifdef COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
192 C1_FLAGS(C1_DEVELOP_FLAG_STRUCT, C1_PD_DEVELOP_FLAG_STRUCT, C1_PRODUCT_FLAG_STRUCT, C1_PD_PRODUCT_FLAG_STRUCT, C1_NOTPRODUCT_FLAG_STRUCT)
a61af66fc99e Initial load
duke
parents:
diff changeset
193 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
194 #ifdef COMPILER2
1080
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 1067
diff changeset
195 C2_FLAGS(C2_DEVELOP_FLAG_STRUCT, C2_PD_DEVELOP_FLAG_STRUCT, C2_PRODUCT_FLAG_STRUCT, C2_PD_PRODUCT_FLAG_STRUCT, C2_DIAGNOSTIC_FLAG_STRUCT, C2_EXPERIMENTAL_FLAG_STRUCT, C2_NOTPRODUCT_FLAG_STRUCT)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
196 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
197 {0, NULL, NULL}
a61af66fc99e Initial load
duke
parents:
diff changeset
198 };
a61af66fc99e Initial load
duke
parents:
diff changeset
199
a61af66fc99e Initial load
duke
parents:
diff changeset
200 Flag* Flag::flags = flagTable;
a61af66fc99e Initial load
duke
parents:
diff changeset
201 size_t Flag::numFlags = (sizeof(flagTable) / sizeof(Flag));
a61af66fc99e Initial load
duke
parents:
diff changeset
202
a61af66fc99e Initial load
duke
parents:
diff changeset
203 inline bool str_equal(const char* s, char* q, size_t len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
204 // s is null terminated, q is not!
a61af66fc99e Initial load
duke
parents:
diff changeset
205 if (strlen(s) != (unsigned int) len) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
206 return strncmp(s, q, len) == 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
207 }
a61af66fc99e Initial load
duke
parents:
diff changeset
208
a61af66fc99e Initial load
duke
parents:
diff changeset
209 Flag* Flag::find_flag(char* name, size_t length) {
a61af66fc99e Initial load
duke
parents:
diff changeset
210 for (Flag* current = &flagTable[0]; current->name; current++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
211 if (str_equal(current->name, name, length)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
212 if (!(current->is_unlocked() || current->is_unlocker())) {
350
d28aa69f0959 6618726: Introduce -XX:+UnlockExperimentalVMOptions flag
ysr
parents: 342
diff changeset
213 // disable use of diagnostic or experimental flags until they
d28aa69f0959 6618726: Introduce -XX:+UnlockExperimentalVMOptions flag
ysr
parents: 342
diff changeset
214 // are explicitly unlocked
0
a61af66fc99e Initial load
duke
parents:
diff changeset
215 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
216 }
a61af66fc99e Initial load
duke
parents:
diff changeset
217 return current;
a61af66fc99e Initial load
duke
parents:
diff changeset
218 }
a61af66fc99e Initial load
duke
parents:
diff changeset
219 }
a61af66fc99e Initial load
duke
parents:
diff changeset
220 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
221 }
a61af66fc99e Initial load
duke
parents:
diff changeset
222
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // Returns the address of the index'th element
a61af66fc99e Initial load
duke
parents:
diff changeset
224 static Flag* address_of_flag(CommandLineFlagWithType flag) {
a61af66fc99e Initial load
duke
parents:
diff changeset
225 assert((size_t)flag < Flag::numFlags, "bad command line flag index");
a61af66fc99e Initial load
duke
parents:
diff changeset
226 return &Flag::flags[flag];
a61af66fc99e Initial load
duke
parents:
diff changeset
227 }
a61af66fc99e Initial load
duke
parents:
diff changeset
228
a61af66fc99e Initial load
duke
parents:
diff changeset
229 bool CommandLineFlagsEx::is_default(CommandLineFlag flag) {
a61af66fc99e Initial load
duke
parents:
diff changeset
230 assert((size_t)flag < Flag::numFlags, "bad command line flag index");
a61af66fc99e Initial load
duke
parents:
diff changeset
231 Flag* f = &Flag::flags[flag];
a61af66fc99e Initial load
duke
parents:
diff changeset
232 return (f->origin == DEFAULT);
a61af66fc99e Initial load
duke
parents:
diff changeset
233 }
a61af66fc99e Initial load
duke
parents:
diff changeset
234
13
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
235 bool CommandLineFlagsEx::is_ergo(CommandLineFlag flag) {
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
236 assert((size_t)flag < Flag::numFlags, "bad command line flag index");
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
237 Flag* f = &Flag::flags[flag];
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
238 return (f->origin == ERGONOMIC);
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
239 }
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
240
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
241 bool CommandLineFlagsEx::is_cmdline(CommandLineFlag flag) {
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
242 assert((size_t)flag < Flag::numFlags, "bad command line flag index");
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
243 Flag* f = &Flag::flags[flag];
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
244 return (f->origin == COMMAND_LINE);
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
245 }
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
246
0
a61af66fc99e Initial load
duke
parents:
diff changeset
247 bool CommandLineFlags::wasSetOnCmdline(const char* name, bool* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
248 Flag* result = Flag::find_flag((char*)name, strlen(name));
a61af66fc99e Initial load
duke
parents:
diff changeset
249 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
250 *value = (result->origin == COMMAND_LINE);
a61af66fc99e Initial load
duke
parents:
diff changeset
251 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
252 }
a61af66fc99e Initial load
duke
parents:
diff changeset
253
a61af66fc99e Initial load
duke
parents:
diff changeset
254 bool CommandLineFlags::boolAt(char* name, size_t len, bool* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
255 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
256 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
257 if (!result->is_bool()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
258 *value = result->get_bool();
a61af66fc99e Initial load
duke
parents:
diff changeset
259 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
260 }
a61af66fc99e Initial load
duke
parents:
diff changeset
261
a61af66fc99e Initial load
duke
parents:
diff changeset
262 bool CommandLineFlags::boolAtPut(char* name, size_t len, bool* value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
263 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
264 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
265 if (!result->is_bool()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
266 bool old_value = result->get_bool();
a61af66fc99e Initial load
duke
parents:
diff changeset
267 result->set_bool(*value);
a61af66fc99e Initial load
duke
parents:
diff changeset
268 *value = old_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
269 result->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
270 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
272
a61af66fc99e Initial load
duke
parents:
diff changeset
273 void CommandLineFlagsEx::boolAtPut(CommandLineFlagWithType flag, bool value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
274 Flag* faddr = address_of_flag(flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
275 guarantee(faddr != NULL && faddr->is_bool(), "wrong flag type");
a61af66fc99e Initial load
duke
parents:
diff changeset
276 faddr->set_bool(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
277 faddr->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
278 }
a61af66fc99e Initial load
duke
parents:
diff changeset
279
a61af66fc99e Initial load
duke
parents:
diff changeset
280 bool CommandLineFlags::intxAt(char* name, size_t len, intx* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
281 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
282 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
283 if (!result->is_intx()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
284 *value = result->get_intx();
a61af66fc99e Initial load
duke
parents:
diff changeset
285 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
286 }
a61af66fc99e Initial load
duke
parents:
diff changeset
287
a61af66fc99e Initial load
duke
parents:
diff changeset
288 bool CommandLineFlags::intxAtPut(char* name, size_t len, intx* value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
289 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
290 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
291 if (!result->is_intx()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
292 intx old_value = result->get_intx();
a61af66fc99e Initial load
duke
parents:
diff changeset
293 result->set_intx(*value);
a61af66fc99e Initial load
duke
parents:
diff changeset
294 *value = old_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
295 result->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
296 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
297 }
a61af66fc99e Initial load
duke
parents:
diff changeset
298
a61af66fc99e Initial load
duke
parents:
diff changeset
299 void CommandLineFlagsEx::intxAtPut(CommandLineFlagWithType flag, intx value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
300 Flag* faddr = address_of_flag(flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
301 guarantee(faddr != NULL && faddr->is_intx(), "wrong flag type");
a61af66fc99e Initial load
duke
parents:
diff changeset
302 faddr->set_intx(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
303 faddr->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
304 }
a61af66fc99e Initial load
duke
parents:
diff changeset
305
a61af66fc99e Initial load
duke
parents:
diff changeset
306 bool CommandLineFlags::uintxAt(char* name, size_t len, uintx* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
307 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
308 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
309 if (!result->is_uintx()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
310 *value = result->get_uintx();
a61af66fc99e Initial load
duke
parents:
diff changeset
311 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
312 }
a61af66fc99e Initial load
duke
parents:
diff changeset
313
a61af66fc99e Initial load
duke
parents:
diff changeset
314 bool CommandLineFlags::uintxAtPut(char* name, size_t len, uintx* value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
315 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
316 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
317 if (!result->is_uintx()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
318 uintx old_value = result->get_uintx();
a61af66fc99e Initial load
duke
parents:
diff changeset
319 result->set_uintx(*value);
a61af66fc99e Initial load
duke
parents:
diff changeset
320 *value = old_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
321 result->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
322 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
323 }
a61af66fc99e Initial load
duke
parents:
diff changeset
324
a61af66fc99e Initial load
duke
parents:
diff changeset
325 void CommandLineFlagsEx::uintxAtPut(CommandLineFlagWithType flag, uintx value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
326 Flag* faddr = address_of_flag(flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
327 guarantee(faddr != NULL && faddr->is_uintx(), "wrong flag type");
a61af66fc99e Initial load
duke
parents:
diff changeset
328 faddr->set_uintx(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
329 faddr->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
330 }
a61af66fc99e Initial load
duke
parents:
diff changeset
331
1064
473cce303f13 6887571: Increase default heap config sizes
phh
parents: 372
diff changeset
332 bool CommandLineFlags::uint64_tAt(char* name, size_t len, uint64_t* value) {
473cce303f13 6887571: Increase default heap config sizes
phh
parents: 372
diff changeset
333 Flag* result = Flag::find_flag(name, len);
473cce303f13 6887571: Increase default heap config sizes
phh
parents: 372
diff changeset
334 if (result == NULL) return false;
473cce303f13 6887571: Increase default heap config sizes
phh
parents: 372
diff changeset
335 if (!result->is_uint64_t()) return false;
473cce303f13 6887571: Increase default heap config sizes
phh
parents: 372
diff changeset
336 *value = result->get_uint64_t();
473cce303f13 6887571: Increase default heap config sizes
phh
parents: 372
diff changeset
337 return true;
473cce303f13 6887571: Increase default heap config sizes
phh
parents: 372
diff changeset
338 }
473cce303f13 6887571: Increase default heap config sizes
phh
parents: 372
diff changeset
339
473cce303f13 6887571: Increase default heap config sizes
phh
parents: 372
diff changeset
340 bool CommandLineFlags::uint64_tAtPut(char* name, size_t len, uint64_t* value, FlagValueOrigin origin) {
473cce303f13 6887571: Increase default heap config sizes
phh
parents: 372
diff changeset
341 Flag* result = Flag::find_flag(name, len);
473cce303f13 6887571: Increase default heap config sizes
phh
parents: 372
diff changeset
342 if (result == NULL) return false;
473cce303f13 6887571: Increase default heap config sizes
phh
parents: 372
diff changeset
343 if (!result->is_uint64_t()) return false;
473cce303f13 6887571: Increase default heap config sizes
phh
parents: 372
diff changeset
344 uint64_t old_value = result->get_uint64_t();
473cce303f13 6887571: Increase default heap config sizes
phh
parents: 372
diff changeset
345 result->set_uint64_t(*value);
473cce303f13 6887571: Increase default heap config sizes
phh
parents: 372
diff changeset
346 *value = old_value;
473cce303f13 6887571: Increase default heap config sizes
phh
parents: 372
diff changeset
347 result->origin = origin;
473cce303f13 6887571: Increase default heap config sizes
phh
parents: 372
diff changeset
348 return true;
473cce303f13 6887571: Increase default heap config sizes
phh
parents: 372
diff changeset
349 }
473cce303f13 6887571: Increase default heap config sizes
phh
parents: 372
diff changeset
350
473cce303f13 6887571: Increase default heap config sizes
phh
parents: 372
diff changeset
351 void CommandLineFlagsEx::uint64_tAtPut(CommandLineFlagWithType flag, uint64_t value, FlagValueOrigin origin) {
473cce303f13 6887571: Increase default heap config sizes
phh
parents: 372
diff changeset
352 Flag* faddr = address_of_flag(flag);
473cce303f13 6887571: Increase default heap config sizes
phh
parents: 372
diff changeset
353 guarantee(faddr != NULL && faddr->is_uint64_t(), "wrong flag type");
473cce303f13 6887571: Increase default heap config sizes
phh
parents: 372
diff changeset
354 faddr->set_uint64_t(value);
473cce303f13 6887571: Increase default heap config sizes
phh
parents: 372
diff changeset
355 faddr->origin = origin;
473cce303f13 6887571: Increase default heap config sizes
phh
parents: 372
diff changeset
356 }
473cce303f13 6887571: Increase default heap config sizes
phh
parents: 372
diff changeset
357
0
a61af66fc99e Initial load
duke
parents:
diff changeset
358 bool CommandLineFlags::doubleAt(char* name, size_t len, double* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
359 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
360 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
361 if (!result->is_double()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
362 *value = result->get_double();
a61af66fc99e Initial load
duke
parents:
diff changeset
363 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
364 }
a61af66fc99e Initial load
duke
parents:
diff changeset
365
a61af66fc99e Initial load
duke
parents:
diff changeset
366 bool CommandLineFlags::doubleAtPut(char* name, size_t len, double* value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
367 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
368 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
369 if (!result->is_double()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
370 double old_value = result->get_double();
a61af66fc99e Initial load
duke
parents:
diff changeset
371 result->set_double(*value);
a61af66fc99e Initial load
duke
parents:
diff changeset
372 *value = old_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
373 result->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
374 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
375 }
a61af66fc99e Initial load
duke
parents:
diff changeset
376
a61af66fc99e Initial load
duke
parents:
diff changeset
377 void CommandLineFlagsEx::doubleAtPut(CommandLineFlagWithType flag, double value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
378 Flag* faddr = address_of_flag(flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
379 guarantee(faddr != NULL && faddr->is_double(), "wrong flag type");
a61af66fc99e Initial load
duke
parents:
diff changeset
380 faddr->set_double(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
381 faddr->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
382 }
a61af66fc99e Initial load
duke
parents:
diff changeset
383
a61af66fc99e Initial load
duke
parents:
diff changeset
384 bool CommandLineFlags::ccstrAt(char* name, size_t len, ccstr* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
385 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
386 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
387 if (!result->is_ccstr()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
388 *value = result->get_ccstr();
a61af66fc99e Initial load
duke
parents:
diff changeset
389 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
390 }
a61af66fc99e Initial load
duke
parents:
diff changeset
391
a61af66fc99e Initial load
duke
parents:
diff changeset
392 // Contract: Flag will make private copy of the incoming value.
a61af66fc99e Initial load
duke
parents:
diff changeset
393 // Outgoing value is always malloc-ed, and caller MUST call free.
a61af66fc99e Initial load
duke
parents:
diff changeset
394 bool CommandLineFlags::ccstrAtPut(char* name, size_t len, ccstr* value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
395 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
396 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
397 if (!result->is_ccstr()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
398 ccstr old_value = result->get_ccstr();
370
885fe0f95828 6744783: HotSpot segfaults if given -XX options with an empty string argument
never
parents: 196
diff changeset
399 char* new_value = NULL;
885fe0f95828 6744783: HotSpot segfaults if given -XX options with an empty string argument
never
parents: 196
diff changeset
400 if (*value != NULL) {
885fe0f95828 6744783: HotSpot segfaults if given -XX options with an empty string argument
never
parents: 196
diff changeset
401 new_value = NEW_C_HEAP_ARRAY(char, strlen(*value)+1);
885fe0f95828 6744783: HotSpot segfaults if given -XX options with an empty string argument
never
parents: 196
diff changeset
402 strcpy(new_value, *value);
885fe0f95828 6744783: HotSpot segfaults if given -XX options with an empty string argument
never
parents: 196
diff changeset
403 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
404 result->set_ccstr(new_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
405 if (result->origin == DEFAULT && old_value != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
406 // Prior value is NOT heap allocated, but was a literal constant.
a61af66fc99e Initial load
duke
parents:
diff changeset
407 char* old_value_to_free = NEW_C_HEAP_ARRAY(char, strlen(old_value)+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
408 strcpy(old_value_to_free, old_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
409 old_value = old_value_to_free;
a61af66fc99e Initial load
duke
parents:
diff changeset
410 }
a61af66fc99e Initial load
duke
parents:
diff changeset
411 *value = old_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
412 result->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
413 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
414 }
a61af66fc99e Initial load
duke
parents:
diff changeset
415
a61af66fc99e Initial load
duke
parents:
diff changeset
416 // Contract: Flag will make private copy of the incoming value.
a61af66fc99e Initial load
duke
parents:
diff changeset
417 void CommandLineFlagsEx::ccstrAtPut(CommandLineFlagWithType flag, ccstr value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
418 Flag* faddr = address_of_flag(flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
419 guarantee(faddr != NULL && faddr->is_ccstr(), "wrong flag type");
a61af66fc99e Initial load
duke
parents:
diff changeset
420 ccstr old_value = faddr->get_ccstr();
a61af66fc99e Initial load
duke
parents:
diff changeset
421 char* new_value = NEW_C_HEAP_ARRAY(char, strlen(value)+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
422 strcpy(new_value, value);
a61af66fc99e Initial load
duke
parents:
diff changeset
423 faddr->set_ccstr(new_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
424 if (faddr->origin != DEFAULT && old_value != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
425 // Prior value is heap allocated so free it.
a61af66fc99e Initial load
duke
parents:
diff changeset
426 FREE_C_HEAP_ARRAY(char, old_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
427 }
a61af66fc99e Initial load
duke
parents:
diff changeset
428 faddr->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
429 }
a61af66fc99e Initial load
duke
parents:
diff changeset
430
a61af66fc99e Initial load
duke
parents:
diff changeset
431 extern "C" {
a61af66fc99e Initial load
duke
parents:
diff changeset
432 static int compare_flags(const void* void_a, const void* void_b) {
a61af66fc99e Initial load
duke
parents:
diff changeset
433 return strcmp((*((Flag**) void_a))->name, (*((Flag**) void_b))->name);
a61af66fc99e Initial load
duke
parents:
diff changeset
434 }
a61af66fc99e Initial load
duke
parents:
diff changeset
435 }
a61af66fc99e Initial load
duke
parents:
diff changeset
436
a61af66fc99e Initial load
duke
parents:
diff changeset
437 void CommandLineFlags::printSetFlags() {
a61af66fc99e Initial load
duke
parents:
diff changeset
438 // Print which flags were set on the command line
a61af66fc99e Initial load
duke
parents:
diff changeset
439 // note: this method is called before the thread structure is in place
a61af66fc99e Initial load
duke
parents:
diff changeset
440 // which means resource allocation cannot be used.
a61af66fc99e Initial load
duke
parents:
diff changeset
441
a61af66fc99e Initial load
duke
parents:
diff changeset
442 // Compute size
a61af66fc99e Initial load
duke
parents:
diff changeset
443 int length= 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
444 while (flagTable[length].name != NULL) length++;
a61af66fc99e Initial load
duke
parents:
diff changeset
445
a61af66fc99e Initial load
duke
parents:
diff changeset
446 // Sort
a61af66fc99e Initial load
duke
parents:
diff changeset
447 Flag** array = NEW_C_HEAP_ARRAY(Flag*, length);
a61af66fc99e Initial load
duke
parents:
diff changeset
448 for (int index = 0; index < length; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
449 array[index] = &flagTable[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
450 }
a61af66fc99e Initial load
duke
parents:
diff changeset
451 qsort(array, length, sizeof(Flag*), compare_flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
452
a61af66fc99e Initial load
duke
parents:
diff changeset
453 // Print
a61af66fc99e Initial load
duke
parents:
diff changeset
454 for (int i = 0; i < length; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
455 if (array[i]->origin /* naked field! */) {
a61af66fc99e Initial load
duke
parents:
diff changeset
456 array[i]->print_as_flag(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
457 tty->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
458 }
a61af66fc99e Initial load
duke
parents:
diff changeset
459 }
a61af66fc99e Initial load
duke
parents:
diff changeset
460 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
461 FREE_C_HEAP_ARRAY(Flag*, array);
a61af66fc99e Initial load
duke
parents:
diff changeset
462 }
a61af66fc99e Initial load
duke
parents:
diff changeset
463
a61af66fc99e Initial load
duke
parents:
diff changeset
464 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
465
a61af66fc99e Initial load
duke
parents:
diff changeset
466
a61af66fc99e Initial load
duke
parents:
diff changeset
467 void CommandLineFlags::verify() {
a61af66fc99e Initial load
duke
parents:
diff changeset
468 assert(Arguments::check_vm_args_consistency(), "Some flag settings conflict");
a61af66fc99e Initial load
duke
parents:
diff changeset
469 }
a61af66fc99e Initial load
duke
parents:
diff changeset
470
a61af66fc99e Initial load
duke
parents:
diff changeset
471 void CommandLineFlags::printFlags() {
a61af66fc99e Initial load
duke
parents:
diff changeset
472 // Print the flags sorted by name
a61af66fc99e Initial load
duke
parents:
diff changeset
473 // note: this method is called before the thread structure is in place
a61af66fc99e Initial load
duke
parents:
diff changeset
474 // which means resource allocation cannot be used.
a61af66fc99e Initial load
duke
parents:
diff changeset
475
a61af66fc99e Initial load
duke
parents:
diff changeset
476 // Compute size
a61af66fc99e Initial load
duke
parents:
diff changeset
477 int length= 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
478 while (flagTable[length].name != NULL) length++;
a61af66fc99e Initial load
duke
parents:
diff changeset
479
a61af66fc99e Initial load
duke
parents:
diff changeset
480 // Sort
a61af66fc99e Initial load
duke
parents:
diff changeset
481 Flag** array = NEW_C_HEAP_ARRAY(Flag*, length);
a61af66fc99e Initial load
duke
parents:
diff changeset
482 for (int index = 0; index < length; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
483 array[index] = &flagTable[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
484 }
a61af66fc99e Initial load
duke
parents:
diff changeset
485 qsort(array, length, sizeof(Flag*), compare_flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
486
a61af66fc99e Initial load
duke
parents:
diff changeset
487 // Print
a61af66fc99e Initial load
duke
parents:
diff changeset
488 tty->print_cr("[Global flags]");
a61af66fc99e Initial load
duke
parents:
diff changeset
489 for (int i = 0; i < length; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
490 if (array[i]->is_unlocked()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
491 array[i]->print_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
492 }
a61af66fc99e Initial load
duke
parents:
diff changeset
493 }
a61af66fc99e Initial load
duke
parents:
diff changeset
494 FREE_C_HEAP_ARRAY(Flag*, array);
a61af66fc99e Initial load
duke
parents:
diff changeset
495 }
a61af66fc99e Initial load
duke
parents:
diff changeset
496
a61af66fc99e Initial load
duke
parents:
diff changeset
497 #endif