annotate src/share/vm/runtime/globals.cpp @ 1091:6aa7255741f3

6906727: UseCompressedOops: some card-marking fixes related to object arrays Summary: Introduced a new write_ref_array(HeapWords* start, size_t count) method that does the requisite MemRegion range calculation so (some of the) clients of the erstwhile write_ref_array(MemRegion mr) do not need to worry. This removed all external uses of array_size(), which was also simplified and made private. Asserts were added to catch other possible issues. Further, less essential, fixes stemming from this investigation are deferred to CR 6904516 (to follow shortly in hs17). Reviewed-by: kvn, coleenp, jmasa
author ysr
date Thu, 03 Dec 2009 15:01:57 -0800
parents be41fa651400
children 473cce303f13
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;
350
d28aa69f0959 6618726: Introduce -XX:+UnlockExperimentalVMOptions flag
ysr
parents: 342
diff changeset
49 } else if (strcmp(kind, "{experimental}") == 0) {
d28aa69f0959 6618726: Introduce -XX:+UnlockExperimentalVMOptions flag
ysr
parents: 342
diff changeset
50 return UnlockExperimentalVMOptions;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
51 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
52 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 }
a61af66fc99e Initial load
duke
parents:
diff changeset
54 }
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56 bool Flag::is_writeable() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
57 return (strcmp(kind, "{manageable}") == 0 || strcmp(kind, "{product rw}") == 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
58 }
a61af66fc99e Initial load
duke
parents:
diff changeset
59
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // All flags except "manageable" are assumed internal flags.
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // Long term, we need to define a mechanism to specify which flags
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // are external/stable and change this function accordingly.
a61af66fc99e Initial load
duke
parents:
diff changeset
63 bool Flag::is_external() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
64 return (strcmp(kind, "{manageable}") == 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
65 }
a61af66fc99e Initial load
duke
parents:
diff changeset
66
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // Length of format string (e.g. "%.1234s") for printing ccstr below
a61af66fc99e Initial load
duke
parents:
diff changeset
68 #define FORMAT_BUFFER_LEN 16
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 void Flag::print_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
71 st->print("%5s %-35s %c= ", type, name, (origin != DEFAULT ? ':' : ' '));
a61af66fc99e Initial load
duke
parents:
diff changeset
72 if (is_bool()) st->print("%-16s", get_bool() ? "true" : "false");
a61af66fc99e Initial load
duke
parents:
diff changeset
73 if (is_intx()) st->print("%-16ld", get_intx());
a61af66fc99e Initial load
duke
parents:
diff changeset
74 if (is_uintx()) st->print("%-16lu", get_uintx());
a61af66fc99e Initial load
duke
parents:
diff changeset
75 if (is_ccstr()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
76 const char* cp = get_ccstr();
103
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
77 if (cp != NULL) {
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
78 const char* eol;
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
79 while ((eol = strchr(cp, '\n')) != NULL) {
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
80 char format_buffer[FORMAT_BUFFER_LEN];
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
81 size_t llen = pointer_delta(eol, cp, sizeof(char));
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
82 jio_snprintf(format_buffer, FORMAT_BUFFER_LEN,
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
83 "%%." SIZE_FORMAT "s", llen);
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
84 st->print(format_buffer, cp);
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
85 st->cr();
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
86 cp = eol+1;
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
87 st->print("%5s %-35s += ", "", name);
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
88 }
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
89 st->print("%-16s", cp);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
90 }
a61af66fc99e Initial load
duke
parents:
diff changeset
91 }
a61af66fc99e Initial load
duke
parents:
diff changeset
92 st->print(" %s", kind);
a61af66fc99e Initial load
duke
parents:
diff changeset
93 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
94 }
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96 void Flag::print_as_flag(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
97 if (is_bool()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
98 st->print("-XX:%s%s", get_bool() ? "+" : "-", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
99 } else if (is_intx()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
100 st->print("-XX:%s=" INTX_FORMAT, name, get_intx());
a61af66fc99e Initial load
duke
parents:
diff changeset
101 } else if (is_uintx()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
102 st->print("-XX:%s=" UINTX_FORMAT, name, get_uintx());
a61af66fc99e Initial load
duke
parents:
diff changeset
103 } else if (is_ccstr()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
104 st->print("-XX:%s=", name);
103
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
105 const char* cp = get_ccstr();
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
106 if (cp != NULL) {
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
107 // Need to turn embedded '\n's back into separate arguments
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
108 // Not so efficient to print one character at a time,
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
109 // 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
110 // and print that. And this need not be efficient.
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
111 for (; *cp != '\0'; cp += 1) {
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
112 switch (*cp) {
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
113 default:
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
114 st->print("%c", *cp);
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
115 break;
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
116 case '\n':
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
117 st->print(" -XX:%s=", name);
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
118 break;
38a50dd839cf 6619271: The -Xprintflags causes the VM to segv
never
parents: 13
diff changeset
119 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
120 }
a61af66fc99e Initial load
duke
parents:
diff changeset
121 }
a61af66fc99e Initial load
duke
parents:
diff changeset
122 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
123 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
124 }
a61af66fc99e Initial load
duke
parents:
diff changeset
125 }
a61af66fc99e Initial load
duke
parents:
diff changeset
126
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // 4991491 do not "optimize out" the was_set false values: omitting them
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // tickles a Microsoft compiler bug causing flagTable to be malformed
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 #define RUNTIME_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{product}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
131 #define RUNTIME_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{pd product}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
132 #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
133 #define RUNTIME_EXPERIMENTAL_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{experimental}", DEFAULT },
0
a61af66fc99e Initial load
duke
parents:
diff changeset
134 #define RUNTIME_MANAGEABLE_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{manageable}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
135 #define RUNTIME_PRODUCT_RW_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{product rw}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 #ifdef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
138 #define RUNTIME_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
a61af66fc99e Initial load
duke
parents:
diff changeset
139 #define RUNTIME_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */
a61af66fc99e Initial load
duke
parents:
diff changeset
140 #define RUNTIME_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc)
a61af66fc99e Initial load
duke
parents:
diff changeset
141 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
142 #define RUNTIME_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
143 #define RUNTIME_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{pd}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
144 #define RUNTIME_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{notproduct}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
145 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
146
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 103
diff changeset
147 #ifdef _LP64
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 103
diff changeset
148 #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
149 #else
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 103
diff changeset
150 #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
151 #endif // _LP64
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 103
diff changeset
152
0
a61af66fc99e Initial load
duke
parents:
diff changeset
153 #define C1_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C1 product}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
154 #define C1_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{C1 pd product}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
155 #ifdef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
156 #define C1_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
a61af66fc99e Initial load
duke
parents:
diff changeset
157 #define C1_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */
a61af66fc99e Initial load
duke
parents:
diff changeset
158 #define C1_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc)
a61af66fc99e Initial load
duke
parents:
diff changeset
159 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
160 #define C1_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C1}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
161 #define C1_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{C1 pd}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
162 #define C1_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C1 notproduct}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
163 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166 #define C2_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C2 product}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
167 #define C2_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{C2 pd product}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
168 #define C2_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C2 diagnostic}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
169 #ifdef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
170 #define C2_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
a61af66fc99e Initial load
duke
parents:
diff changeset
171 #define C2_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */
a61af66fc99e Initial load
duke
parents:
diff changeset
172 #define C2_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc)
a61af66fc99e Initial load
duke
parents:
diff changeset
173 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
174 #define C2_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C2}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
175 #define C2_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{C2 pd}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
176 #define C2_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C2 notproduct}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
177 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
178
a61af66fc99e Initial load
duke
parents:
diff changeset
179
a61af66fc99e Initial load
duke
parents:
diff changeset
180 static Flag flagTable[] = {
350
d28aa69f0959 6618726: Introduce -XX:+UnlockExperimentalVMOptions flag
ysr
parents: 342
diff changeset
181 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
182 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
183 #ifndef SERIALGC
350
d28aa69f0959 6618726: Introduce -XX:+UnlockExperimentalVMOptions flag
ysr
parents: 342
diff changeset
184 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
185 #endif // SERIALGC
0
a61af66fc99e Initial load
duke
parents:
diff changeset
186 #ifdef COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
187 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
188 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
189 #ifdef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
190 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_NOTPRODUCT_FLAG_STRUCT)
a61af66fc99e Initial load
duke
parents:
diff changeset
191 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
192 {0, NULL, NULL}
a61af66fc99e Initial load
duke
parents:
diff changeset
193 };
a61af66fc99e Initial load
duke
parents:
diff changeset
194
a61af66fc99e Initial load
duke
parents:
diff changeset
195 Flag* Flag::flags = flagTable;
a61af66fc99e Initial load
duke
parents:
diff changeset
196 size_t Flag::numFlags = (sizeof(flagTable) / sizeof(Flag));
a61af66fc99e Initial load
duke
parents:
diff changeset
197
a61af66fc99e Initial load
duke
parents:
diff changeset
198 inline bool str_equal(const char* s, char* q, size_t len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // s is null terminated, q is not!
a61af66fc99e Initial load
duke
parents:
diff changeset
200 if (strlen(s) != (unsigned int) len) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
201 return strncmp(s, q, len) == 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
202 }
a61af66fc99e Initial load
duke
parents:
diff changeset
203
a61af66fc99e Initial load
duke
parents:
diff changeset
204 Flag* Flag::find_flag(char* name, size_t length) {
a61af66fc99e Initial load
duke
parents:
diff changeset
205 for (Flag* current = &flagTable[0]; current->name; current++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
206 if (str_equal(current->name, name, length)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
207 if (!(current->is_unlocked() || current->is_unlocker())) {
350
d28aa69f0959 6618726: Introduce -XX:+UnlockExperimentalVMOptions flag
ysr
parents: 342
diff changeset
208 // disable use of diagnostic or experimental flags until they
d28aa69f0959 6618726: Introduce -XX:+UnlockExperimentalVMOptions flag
ysr
parents: 342
diff changeset
209 // are explicitly unlocked
0
a61af66fc99e Initial load
duke
parents:
diff changeset
210 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
212 return current;
a61af66fc99e Initial load
duke
parents:
diff changeset
213 }
a61af66fc99e Initial load
duke
parents:
diff changeset
214 }
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
a61af66fc99e Initial load
duke
parents:
diff changeset
218 // Returns the address of the index'th element
a61af66fc99e Initial load
duke
parents:
diff changeset
219 static Flag* address_of_flag(CommandLineFlagWithType flag) {
a61af66fc99e Initial load
duke
parents:
diff changeset
220 assert((size_t)flag < Flag::numFlags, "bad command line flag index");
a61af66fc99e Initial load
duke
parents:
diff changeset
221 return &Flag::flags[flag];
a61af66fc99e Initial load
duke
parents:
diff changeset
222 }
a61af66fc99e Initial load
duke
parents:
diff changeset
223
a61af66fc99e Initial load
duke
parents:
diff changeset
224 bool CommandLineFlagsEx::is_default(CommandLineFlag 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 Flag* f = &Flag::flags[flag];
a61af66fc99e Initial load
duke
parents:
diff changeset
227 return (f->origin == DEFAULT);
a61af66fc99e Initial load
duke
parents:
diff changeset
228 }
a61af66fc99e Initial load
duke
parents:
diff changeset
229
13
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
230 bool CommandLineFlagsEx::is_ergo(CommandLineFlag flag) {
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
231 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
232 Flag* f = &Flag::flags[flag];
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
233 return (f->origin == ERGONOMIC);
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
234 }
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
235
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
236 bool CommandLineFlagsEx::is_cmdline(CommandLineFlag flag) {
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
237 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
238 Flag* f = &Flag::flags[flag];
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
239 return (f->origin == COMMAND_LINE);
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
0
a61af66fc99e Initial load
duke
parents:
diff changeset
242 bool CommandLineFlags::wasSetOnCmdline(const char* name, bool* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
243 Flag* result = Flag::find_flag((char*)name, strlen(name));
a61af66fc99e Initial load
duke
parents:
diff changeset
244 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
245 *value = (result->origin == COMMAND_LINE);
a61af66fc99e Initial load
duke
parents:
diff changeset
246 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
247 }
a61af66fc99e Initial load
duke
parents:
diff changeset
248
a61af66fc99e Initial load
duke
parents:
diff changeset
249 bool CommandLineFlags::boolAt(char* name, size_t len, bool* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
250 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
251 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
252 if (!result->is_bool()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
253 *value = result->get_bool();
a61af66fc99e Initial load
duke
parents:
diff changeset
254 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
256
a61af66fc99e Initial load
duke
parents:
diff changeset
257 bool CommandLineFlags::boolAtPut(char* name, size_t len, bool* value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
258 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
259 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
260 if (!result->is_bool()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
261 bool old_value = result->get_bool();
a61af66fc99e Initial load
duke
parents:
diff changeset
262 result->set_bool(*value);
a61af66fc99e Initial load
duke
parents:
diff changeset
263 *value = old_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
264 result->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
265 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
266 }
a61af66fc99e Initial load
duke
parents:
diff changeset
267
a61af66fc99e Initial load
duke
parents:
diff changeset
268 void CommandLineFlagsEx::boolAtPut(CommandLineFlagWithType flag, bool value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
269 Flag* faddr = address_of_flag(flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
270 guarantee(faddr != NULL && faddr->is_bool(), "wrong flag type");
a61af66fc99e Initial load
duke
parents:
diff changeset
271 faddr->set_bool(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
272 faddr->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
273 }
a61af66fc99e Initial load
duke
parents:
diff changeset
274
a61af66fc99e Initial load
duke
parents:
diff changeset
275 bool CommandLineFlags::intxAt(char* name, size_t len, intx* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
276 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
277 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
278 if (!result->is_intx()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
279 *value = result->get_intx();
a61af66fc99e Initial load
duke
parents:
diff changeset
280 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
282
a61af66fc99e Initial load
duke
parents:
diff changeset
283 bool CommandLineFlags::intxAtPut(char* name, size_t len, intx* value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
284 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
285 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
286 if (!result->is_intx()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
287 intx old_value = result->get_intx();
a61af66fc99e Initial load
duke
parents:
diff changeset
288 result->set_intx(*value);
a61af66fc99e Initial load
duke
parents:
diff changeset
289 *value = old_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
290 result->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
291 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
292 }
a61af66fc99e Initial load
duke
parents:
diff changeset
293
a61af66fc99e Initial load
duke
parents:
diff changeset
294 void CommandLineFlagsEx::intxAtPut(CommandLineFlagWithType flag, intx value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
295 Flag* faddr = address_of_flag(flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
296 guarantee(faddr != NULL && faddr->is_intx(), "wrong flag type");
a61af66fc99e Initial load
duke
parents:
diff changeset
297 faddr->set_intx(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
298 faddr->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
299 }
a61af66fc99e Initial load
duke
parents:
diff changeset
300
a61af66fc99e Initial load
duke
parents:
diff changeset
301 bool CommandLineFlags::uintxAt(char* name, size_t len, uintx* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
302 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
303 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
304 if (!result->is_uintx()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
305 *value = result->get_uintx();
a61af66fc99e Initial load
duke
parents:
diff changeset
306 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
307 }
a61af66fc99e Initial load
duke
parents:
diff changeset
308
a61af66fc99e Initial load
duke
parents:
diff changeset
309 bool CommandLineFlags::uintxAtPut(char* name, size_t len, uintx* value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
310 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
311 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
312 if (!result->is_uintx()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
313 uintx old_value = result->get_uintx();
a61af66fc99e Initial load
duke
parents:
diff changeset
314 result->set_uintx(*value);
a61af66fc99e Initial load
duke
parents:
diff changeset
315 *value = old_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
316 result->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
317 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
318 }
a61af66fc99e Initial load
duke
parents:
diff changeset
319
a61af66fc99e Initial load
duke
parents:
diff changeset
320 void CommandLineFlagsEx::uintxAtPut(CommandLineFlagWithType flag, uintx value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
321 Flag* faddr = address_of_flag(flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
322 guarantee(faddr != NULL && faddr->is_uintx(), "wrong flag type");
a61af66fc99e Initial load
duke
parents:
diff changeset
323 faddr->set_uintx(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
324 faddr->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
325 }
a61af66fc99e Initial load
duke
parents:
diff changeset
326
a61af66fc99e Initial load
duke
parents:
diff changeset
327 bool CommandLineFlags::doubleAt(char* name, size_t len, double* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
328 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
329 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
330 if (!result->is_double()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
331 *value = result->get_double();
a61af66fc99e Initial load
duke
parents:
diff changeset
332 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
333 }
a61af66fc99e Initial load
duke
parents:
diff changeset
334
a61af66fc99e Initial load
duke
parents:
diff changeset
335 bool CommandLineFlags::doubleAtPut(char* name, size_t len, double* value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
336 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
337 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
338 if (!result->is_double()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
339 double old_value = result->get_double();
a61af66fc99e Initial load
duke
parents:
diff changeset
340 result->set_double(*value);
a61af66fc99e Initial load
duke
parents:
diff changeset
341 *value = old_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
342 result->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
343 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
344 }
a61af66fc99e Initial load
duke
parents:
diff changeset
345
a61af66fc99e Initial load
duke
parents:
diff changeset
346 void CommandLineFlagsEx::doubleAtPut(CommandLineFlagWithType flag, double value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
347 Flag* faddr = address_of_flag(flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
348 guarantee(faddr != NULL && faddr->is_double(), "wrong flag type");
a61af66fc99e Initial load
duke
parents:
diff changeset
349 faddr->set_double(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
350 faddr->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
351 }
a61af66fc99e Initial load
duke
parents:
diff changeset
352
a61af66fc99e Initial load
duke
parents:
diff changeset
353 bool CommandLineFlags::ccstrAt(char* name, size_t len, ccstr* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
354 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
355 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
356 if (!result->is_ccstr()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
357 *value = result->get_ccstr();
a61af66fc99e Initial load
duke
parents:
diff changeset
358 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
359 }
a61af66fc99e Initial load
duke
parents:
diff changeset
360
a61af66fc99e Initial load
duke
parents:
diff changeset
361 // Contract: Flag will make private copy of the incoming value.
a61af66fc99e Initial load
duke
parents:
diff changeset
362 // Outgoing value is always malloc-ed, and caller MUST call free.
a61af66fc99e Initial load
duke
parents:
diff changeset
363 bool CommandLineFlags::ccstrAtPut(char* name, size_t len, ccstr* value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
364 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
365 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
366 if (!result->is_ccstr()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
367 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
368 char* new_value = NULL;
885fe0f95828 6744783: HotSpot segfaults if given -XX options with an empty string argument
never
parents: 196
diff changeset
369 if (*value != NULL) {
885fe0f95828 6744783: HotSpot segfaults if given -XX options with an empty string argument
never
parents: 196
diff changeset
370 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
371 strcpy(new_value, *value);
885fe0f95828 6744783: HotSpot segfaults if given -XX options with an empty string argument
never
parents: 196
diff changeset
372 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
373 result->set_ccstr(new_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
374 if (result->origin == DEFAULT && old_value != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
375 // Prior value is NOT heap allocated, but was a literal constant.
a61af66fc99e Initial load
duke
parents:
diff changeset
376 char* old_value_to_free = NEW_C_HEAP_ARRAY(char, strlen(old_value)+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
377 strcpy(old_value_to_free, old_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
378 old_value = old_value_to_free;
a61af66fc99e Initial load
duke
parents:
diff changeset
379 }
a61af66fc99e Initial load
duke
parents:
diff changeset
380 *value = old_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
381 result->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
382 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
383 }
a61af66fc99e Initial load
duke
parents:
diff changeset
384
a61af66fc99e Initial load
duke
parents:
diff changeset
385 // Contract: Flag will make private copy of the incoming value.
a61af66fc99e Initial load
duke
parents:
diff changeset
386 void CommandLineFlagsEx::ccstrAtPut(CommandLineFlagWithType flag, ccstr value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
387 Flag* faddr = address_of_flag(flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
388 guarantee(faddr != NULL && faddr->is_ccstr(), "wrong flag type");
a61af66fc99e Initial load
duke
parents:
diff changeset
389 ccstr old_value = faddr->get_ccstr();
a61af66fc99e Initial load
duke
parents:
diff changeset
390 char* new_value = NEW_C_HEAP_ARRAY(char, strlen(value)+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
391 strcpy(new_value, value);
a61af66fc99e Initial load
duke
parents:
diff changeset
392 faddr->set_ccstr(new_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
393 if (faddr->origin != DEFAULT && old_value != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
394 // Prior value is heap allocated so free it.
a61af66fc99e Initial load
duke
parents:
diff changeset
395 FREE_C_HEAP_ARRAY(char, old_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
396 }
a61af66fc99e Initial load
duke
parents:
diff changeset
397 faddr->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
398 }
a61af66fc99e Initial load
duke
parents:
diff changeset
399
a61af66fc99e Initial load
duke
parents:
diff changeset
400 extern "C" {
a61af66fc99e Initial load
duke
parents:
diff changeset
401 static int compare_flags(const void* void_a, const void* void_b) {
a61af66fc99e Initial load
duke
parents:
diff changeset
402 return strcmp((*((Flag**) void_a))->name, (*((Flag**) void_b))->name);
a61af66fc99e Initial load
duke
parents:
diff changeset
403 }
a61af66fc99e Initial load
duke
parents:
diff changeset
404 }
a61af66fc99e Initial load
duke
parents:
diff changeset
405
a61af66fc99e Initial load
duke
parents:
diff changeset
406 void CommandLineFlags::printSetFlags() {
a61af66fc99e Initial load
duke
parents:
diff changeset
407 // Print which flags were set on the command line
a61af66fc99e Initial load
duke
parents:
diff changeset
408 // note: this method is called before the thread structure is in place
a61af66fc99e Initial load
duke
parents:
diff changeset
409 // which means resource allocation cannot be used.
a61af66fc99e Initial load
duke
parents:
diff changeset
410
a61af66fc99e Initial load
duke
parents:
diff changeset
411 // Compute size
a61af66fc99e Initial load
duke
parents:
diff changeset
412 int length= 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
413 while (flagTable[length].name != NULL) length++;
a61af66fc99e Initial load
duke
parents:
diff changeset
414
a61af66fc99e Initial load
duke
parents:
diff changeset
415 // Sort
a61af66fc99e Initial load
duke
parents:
diff changeset
416 Flag** array = NEW_C_HEAP_ARRAY(Flag*, length);
a61af66fc99e Initial load
duke
parents:
diff changeset
417 for (int index = 0; index < length; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
418 array[index] = &flagTable[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
419 }
a61af66fc99e Initial load
duke
parents:
diff changeset
420 qsort(array, length, sizeof(Flag*), compare_flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
421
a61af66fc99e Initial load
duke
parents:
diff changeset
422 // Print
a61af66fc99e Initial load
duke
parents:
diff changeset
423 for (int i = 0; i < length; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
424 if (array[i]->origin /* naked field! */) {
a61af66fc99e Initial load
duke
parents:
diff changeset
425 array[i]->print_as_flag(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
426 tty->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
427 }
a61af66fc99e Initial load
duke
parents:
diff changeset
428 }
a61af66fc99e Initial load
duke
parents:
diff changeset
429 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
430 FREE_C_HEAP_ARRAY(Flag*, array);
a61af66fc99e Initial load
duke
parents:
diff changeset
431 }
a61af66fc99e Initial load
duke
parents:
diff changeset
432
a61af66fc99e Initial load
duke
parents:
diff changeset
433 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
434
a61af66fc99e Initial load
duke
parents:
diff changeset
435
a61af66fc99e Initial load
duke
parents:
diff changeset
436 void CommandLineFlags::verify() {
a61af66fc99e Initial load
duke
parents:
diff changeset
437 assert(Arguments::check_vm_args_consistency(), "Some flag settings conflict");
a61af66fc99e Initial load
duke
parents:
diff changeset
438 }
a61af66fc99e Initial load
duke
parents:
diff changeset
439
a61af66fc99e Initial load
duke
parents:
diff changeset
440 void CommandLineFlags::printFlags() {
a61af66fc99e Initial load
duke
parents:
diff changeset
441 // Print the flags sorted by name
a61af66fc99e Initial load
duke
parents:
diff changeset
442 // note: this method is called before the thread structure is in place
a61af66fc99e Initial load
duke
parents:
diff changeset
443 // which means resource allocation cannot be used.
a61af66fc99e Initial load
duke
parents:
diff changeset
444
a61af66fc99e Initial load
duke
parents:
diff changeset
445 // Compute size
a61af66fc99e Initial load
duke
parents:
diff changeset
446 int length= 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
447 while (flagTable[length].name != NULL) length++;
a61af66fc99e Initial load
duke
parents:
diff changeset
448
a61af66fc99e Initial load
duke
parents:
diff changeset
449 // Sort
a61af66fc99e Initial load
duke
parents:
diff changeset
450 Flag** array = NEW_C_HEAP_ARRAY(Flag*, length);
a61af66fc99e Initial load
duke
parents:
diff changeset
451 for (int index = 0; index < length; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
452 array[index] = &flagTable[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
453 }
a61af66fc99e Initial load
duke
parents:
diff changeset
454 qsort(array, length, sizeof(Flag*), compare_flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
455
a61af66fc99e Initial load
duke
parents:
diff changeset
456 // Print
a61af66fc99e Initial load
duke
parents:
diff changeset
457 tty->print_cr("[Global flags]");
a61af66fc99e Initial load
duke
parents:
diff changeset
458 for (int i = 0; i < length; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
459 if (array[i]->is_unlocked()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
460 array[i]->print_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
461 }
a61af66fc99e Initial load
duke
parents:
diff changeset
462 }
a61af66fc99e Initial load
duke
parents:
diff changeset
463 FREE_C_HEAP_ARRAY(Flag*, array);
a61af66fc99e Initial load
duke
parents:
diff changeset
464 }
a61af66fc99e Initial load
duke
parents:
diff changeset
465
a61af66fc99e Initial load
duke
parents:
diff changeset
466 #endif