annotate src/share/vm/runtime/globals.cpp @ 94:0834225a7916

6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction Summary: The option CMSInitiatingPermOccupancyFraction now controls perm triggering threshold. Even though the actual value of the threshold has not yet been changed, so there is no change in policy, we now have the infrastructure in place for dynamically deciding when to collect the perm gen, an issue that will be addressed in the near future. Reviewed-by: jmasa
author ysr
date Sun, 16 Mar 2008 21:57:25 -0700
parents 183f41cf8bfe
children 38a50dd839cf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
2 * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
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, \
a61af66fc99e Initial load
duke
parents:
diff changeset
31 MATERIALIZE_DIAGNOSTIC_FLAG, MATERIALIZE_NOTPRODUCT_FLAG, \
a61af66fc99e Initial load
duke
parents:
diff changeset
32 MATERIALIZE_MANAGEABLE_FLAG, MATERIALIZE_PRODUCT_RW_FLAG)
a61af66fc99e Initial load
duke
parents:
diff changeset
33
a61af66fc99e Initial load
duke
parents:
diff changeset
34 RUNTIME_OS_FLAGS(MATERIALIZE_DEVELOPER_FLAG, MATERIALIZE_PD_DEVELOPER_FLAG, \
a61af66fc99e Initial load
duke
parents:
diff changeset
35 MATERIALIZE_PRODUCT_FLAG, MATERIALIZE_PD_PRODUCT_FLAG, \
a61af66fc99e Initial load
duke
parents:
diff changeset
36 MATERIALIZE_DIAGNOSTIC_FLAG, MATERIALIZE_NOTPRODUCT_FLAG)
a61af66fc99e Initial load
duke
parents:
diff changeset
37
a61af66fc99e Initial load
duke
parents:
diff changeset
38 bool Flag::is_unlocker() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
39 return strcmp(name, "UnlockDiagnosticVMOptions") == 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
40 }
a61af66fc99e Initial load
duke
parents:
diff changeset
41
a61af66fc99e Initial load
duke
parents:
diff changeset
42 bool Flag::is_unlocked() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
43 if (strcmp(kind, "{diagnostic}") == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
44 return UnlockDiagnosticVMOptions;
a61af66fc99e Initial load
duke
parents:
diff changeset
45 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
46 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
47 }
a61af66fc99e Initial load
duke
parents:
diff changeset
48 }
a61af66fc99e Initial load
duke
parents:
diff changeset
49
a61af66fc99e Initial load
duke
parents:
diff changeset
50 bool Flag::is_writeable() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
51 return (strcmp(kind, "{manageable}") == 0 || strcmp(kind, "{product rw}") == 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
52 }
a61af66fc99e Initial load
duke
parents:
diff changeset
53
a61af66fc99e Initial load
duke
parents:
diff changeset
54 // All flags except "manageable" are assumed internal flags.
a61af66fc99e Initial load
duke
parents:
diff changeset
55 // Long term, we need to define a mechanism to specify which flags
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // are external/stable and change this function accordingly.
a61af66fc99e Initial load
duke
parents:
diff changeset
57 bool Flag::is_external() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
58 return (strcmp(kind, "{manageable}") == 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 // Length of format string (e.g. "%.1234s") for printing ccstr below
a61af66fc99e Initial load
duke
parents:
diff changeset
62 #define FORMAT_BUFFER_LEN 16
a61af66fc99e Initial load
duke
parents:
diff changeset
63
a61af66fc99e Initial load
duke
parents:
diff changeset
64 void Flag::print_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
65 st->print("%5s %-35s %c= ", type, name, (origin != DEFAULT ? ':' : ' '));
a61af66fc99e Initial load
duke
parents:
diff changeset
66 if (is_bool()) st->print("%-16s", get_bool() ? "true" : "false");
a61af66fc99e Initial load
duke
parents:
diff changeset
67 if (is_intx()) st->print("%-16ld", get_intx());
a61af66fc99e Initial load
duke
parents:
diff changeset
68 if (is_uintx()) st->print("%-16lu", get_uintx());
a61af66fc99e Initial load
duke
parents:
diff changeset
69 if (is_ccstr()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
70 const char* cp = get_ccstr();
a61af66fc99e Initial load
duke
parents:
diff changeset
71 const char* eol;
a61af66fc99e Initial load
duke
parents:
diff changeset
72 while ((eol = strchr(cp, '\n')) != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
73 char format_buffer[FORMAT_BUFFER_LEN];
a61af66fc99e Initial load
duke
parents:
diff changeset
74 size_t llen = pointer_delta(eol, cp, sizeof(char));
a61af66fc99e Initial load
duke
parents:
diff changeset
75 jio_snprintf(format_buffer, FORMAT_BUFFER_LEN,
a61af66fc99e Initial load
duke
parents:
diff changeset
76 "%%." SIZE_FORMAT "s", llen);
a61af66fc99e Initial load
duke
parents:
diff changeset
77 st->print(format_buffer, cp);
a61af66fc99e Initial load
duke
parents:
diff changeset
78 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
79 cp = eol+1;
a61af66fc99e Initial load
duke
parents:
diff changeset
80 st->print("%5s %-35s += ", "", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
81 }
a61af66fc99e Initial load
duke
parents:
diff changeset
82 st->print("%-16s", cp);
a61af66fc99e Initial load
duke
parents:
diff changeset
83 }
a61af66fc99e Initial load
duke
parents:
diff changeset
84 st->print(" %s", kind);
a61af66fc99e Initial load
duke
parents:
diff changeset
85 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
86 }
a61af66fc99e Initial load
duke
parents:
diff changeset
87
a61af66fc99e Initial load
duke
parents:
diff changeset
88 void Flag::print_as_flag(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
89 if (is_bool()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
90 st->print("-XX:%s%s", get_bool() ? "+" : "-", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
91 } else if (is_intx()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
92 st->print("-XX:%s=" INTX_FORMAT, name, get_intx());
a61af66fc99e Initial load
duke
parents:
diff changeset
93 } else if (is_uintx()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
94 st->print("-XX:%s=" UINTX_FORMAT, name, get_uintx());
a61af66fc99e Initial load
duke
parents:
diff changeset
95 } else if (is_ccstr()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
96 st->print("-XX:%s=", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // Need to turn embedded '\n's back into separate arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // Not so efficient to print one character at a time,
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // but the choice is to do the transformation to a buffer
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // and print that. And this need not be efficient.
a61af66fc99e Initial load
duke
parents:
diff changeset
101 for (const char* cp = get_ccstr(); *cp != '\0'; cp += 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
102 switch (*cp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
103 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
104 st->print("%c", *cp);
a61af66fc99e Initial load
duke
parents:
diff changeset
105 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
106 case '\n':
a61af66fc99e Initial load
duke
parents:
diff changeset
107 st->print(" -XX:%s=", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
108 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
109 }
a61af66fc99e Initial load
duke
parents:
diff changeset
110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
111 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
112 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
113 }
a61af66fc99e Initial load
duke
parents:
diff changeset
114 }
a61af66fc99e Initial load
duke
parents:
diff changeset
115
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // 4991491 do not "optimize out" the was_set false values: omitting them
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // tickles a Microsoft compiler bug causing flagTable to be malformed
a61af66fc99e Initial load
duke
parents:
diff changeset
118
a61af66fc99e Initial load
duke
parents:
diff changeset
119 #define RUNTIME_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{product}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
120 #define RUNTIME_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{pd product}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
121 #define RUNTIME_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{diagnostic}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
122 #define RUNTIME_MANAGEABLE_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{manageable}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
123 #define RUNTIME_PRODUCT_RW_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{product rw}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
124
a61af66fc99e Initial load
duke
parents:
diff changeset
125 #ifdef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
126 #define RUNTIME_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
a61af66fc99e Initial load
duke
parents:
diff changeset
127 #define RUNTIME_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */
a61af66fc99e Initial load
duke
parents:
diff changeset
128 #define RUNTIME_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc)
a61af66fc99e Initial load
duke
parents:
diff changeset
129 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
130 #define RUNTIME_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
131 #define RUNTIME_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{pd}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
132 #define RUNTIME_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{notproduct}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
133 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135 #define C1_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C1 product}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
136 #define C1_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{C1 pd product}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
137 #ifdef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
138 #define C1_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
a61af66fc99e Initial load
duke
parents:
diff changeset
139 #define C1_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */
a61af66fc99e Initial load
duke
parents:
diff changeset
140 #define C1_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 C1_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C1}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
143 #define C1_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{C1 pd}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
144 #define C1_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C1 notproduct}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
145 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148 #define C2_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C2 product}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
149 #define C2_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{C2 pd product}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
150 #define C2_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C2 diagnostic}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
151 #ifdef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
152 #define C2_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
a61af66fc99e Initial load
duke
parents:
diff changeset
153 #define C2_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */
a61af66fc99e Initial load
duke
parents:
diff changeset
154 #define C2_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc)
a61af66fc99e Initial load
duke
parents:
diff changeset
155 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
156 #define C2_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C2}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
157 #define C2_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{C2 pd}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
158 #define C2_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C2 notproduct}", DEFAULT },
a61af66fc99e Initial load
duke
parents:
diff changeset
159 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
160
a61af66fc99e Initial load
duke
parents:
diff changeset
161
a61af66fc99e Initial load
duke
parents:
diff changeset
162 static Flag flagTable[] = {
a61af66fc99e Initial load
duke
parents:
diff changeset
163 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_NOTPRODUCT_FLAG_STRUCT, RUNTIME_MANAGEABLE_FLAG_STRUCT, RUNTIME_PRODUCT_RW_FLAG_STRUCT)
a61af66fc99e Initial load
duke
parents:
diff changeset
164 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)
a61af66fc99e Initial load
duke
parents:
diff changeset
165 #ifdef COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
166 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
167 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
168 #ifdef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
169 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
170 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
171 {0, NULL, NULL}
a61af66fc99e Initial load
duke
parents:
diff changeset
172 };
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 Flag* Flag::flags = flagTable;
a61af66fc99e Initial load
duke
parents:
diff changeset
175 size_t Flag::numFlags = (sizeof(flagTable) / sizeof(Flag));
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177 inline bool str_equal(const char* s, char* q, size_t len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
178 // s is null terminated, q is not!
a61af66fc99e Initial load
duke
parents:
diff changeset
179 if (strlen(s) != (unsigned int) len) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
180 return strncmp(s, q, len) == 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
181 }
a61af66fc99e Initial load
duke
parents:
diff changeset
182
a61af66fc99e Initial load
duke
parents:
diff changeset
183 Flag* Flag::find_flag(char* name, size_t length) {
a61af66fc99e Initial load
duke
parents:
diff changeset
184 for (Flag* current = &flagTable[0]; current->name; current++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
185 if (str_equal(current->name, name, length)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
186 if (!(current->is_unlocked() || current->is_unlocker())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // disable use of diagnostic flags until they are unlocked
a61af66fc99e Initial load
duke
parents:
diff changeset
188 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
189 }
a61af66fc99e Initial load
duke
parents:
diff changeset
190 return current;
a61af66fc99e Initial load
duke
parents:
diff changeset
191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
192 }
a61af66fc99e Initial load
duke
parents:
diff changeset
193 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
194 }
a61af66fc99e Initial load
duke
parents:
diff changeset
195
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // Returns the address of the index'th element
a61af66fc99e Initial load
duke
parents:
diff changeset
197 static Flag* address_of_flag(CommandLineFlagWithType flag) {
a61af66fc99e Initial load
duke
parents:
diff changeset
198 assert((size_t)flag < Flag::numFlags, "bad command line flag index");
a61af66fc99e Initial load
duke
parents:
diff changeset
199 return &Flag::flags[flag];
a61af66fc99e Initial load
duke
parents:
diff changeset
200 }
a61af66fc99e Initial load
duke
parents:
diff changeset
201
a61af66fc99e Initial load
duke
parents:
diff changeset
202 bool CommandLineFlagsEx::is_default(CommandLineFlag flag) {
a61af66fc99e Initial load
duke
parents:
diff changeset
203 assert((size_t)flag < Flag::numFlags, "bad command line flag index");
a61af66fc99e Initial load
duke
parents:
diff changeset
204 Flag* f = &Flag::flags[flag];
a61af66fc99e Initial load
duke
parents:
diff changeset
205 return (f->origin == DEFAULT);
a61af66fc99e Initial load
duke
parents:
diff changeset
206 }
a61af66fc99e Initial load
duke
parents:
diff changeset
207
13
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
208 bool CommandLineFlagsEx::is_ergo(CommandLineFlag flag) {
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
209 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
210 Flag* f = &Flag::flags[flag];
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
211 return (f->origin == ERGONOMIC);
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
212 }
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
213
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
214 bool CommandLineFlagsEx::is_cmdline(CommandLineFlag flag) {
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
215 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
216 Flag* f = &Flag::flags[flag];
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
217 return (f->origin == COMMAND_LINE);
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
218 }
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 0
diff changeset
219
0
a61af66fc99e Initial load
duke
parents:
diff changeset
220 bool CommandLineFlags::wasSetOnCmdline(const char* name, bool* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
221 Flag* result = Flag::find_flag((char*)name, strlen(name));
a61af66fc99e Initial load
duke
parents:
diff changeset
222 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
223 *value = (result->origin == COMMAND_LINE);
a61af66fc99e Initial load
duke
parents:
diff changeset
224 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
225 }
a61af66fc99e Initial load
duke
parents:
diff changeset
226
a61af66fc99e Initial load
duke
parents:
diff changeset
227 bool CommandLineFlags::boolAt(char* name, size_t len, bool* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
228 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
229 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
230 if (!result->is_bool()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
231 *value = result->get_bool();
a61af66fc99e Initial load
duke
parents:
diff changeset
232 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
233 }
a61af66fc99e Initial load
duke
parents:
diff changeset
234
a61af66fc99e Initial load
duke
parents:
diff changeset
235 bool CommandLineFlags::boolAtPut(char* name, size_t len, bool* value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
236 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
237 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
238 if (!result->is_bool()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
239 bool old_value = result->get_bool();
a61af66fc99e Initial load
duke
parents:
diff changeset
240 result->set_bool(*value);
a61af66fc99e Initial load
duke
parents:
diff changeset
241 *value = old_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
242 result->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
243 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
244 }
a61af66fc99e Initial load
duke
parents:
diff changeset
245
a61af66fc99e Initial load
duke
parents:
diff changeset
246 void CommandLineFlagsEx::boolAtPut(CommandLineFlagWithType flag, bool value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
247 Flag* faddr = address_of_flag(flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
248 guarantee(faddr != NULL && faddr->is_bool(), "wrong flag type");
a61af66fc99e Initial load
duke
parents:
diff changeset
249 faddr->set_bool(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
250 faddr->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
251 }
a61af66fc99e Initial load
duke
parents:
diff changeset
252
a61af66fc99e Initial load
duke
parents:
diff changeset
253 bool CommandLineFlags::intxAt(char* name, size_t len, intx* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
254 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
255 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
256 if (!result->is_intx()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
257 *value = result->get_intx();
a61af66fc99e Initial load
duke
parents:
diff changeset
258 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
259 }
a61af66fc99e Initial load
duke
parents:
diff changeset
260
a61af66fc99e Initial load
duke
parents:
diff changeset
261 bool CommandLineFlags::intxAtPut(char* name, size_t len, intx* value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
262 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
263 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
264 if (!result->is_intx()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
265 intx old_value = result->get_intx();
a61af66fc99e Initial load
duke
parents:
diff changeset
266 result->set_intx(*value);
a61af66fc99e Initial load
duke
parents:
diff changeset
267 *value = old_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
268 result->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
269 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
270 }
a61af66fc99e Initial load
duke
parents:
diff changeset
271
a61af66fc99e Initial load
duke
parents:
diff changeset
272 void CommandLineFlagsEx::intxAtPut(CommandLineFlagWithType flag, intx value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
273 Flag* faddr = address_of_flag(flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
274 guarantee(faddr != NULL && faddr->is_intx(), "wrong flag type");
a61af66fc99e Initial load
duke
parents:
diff changeset
275 faddr->set_intx(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
276 faddr->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
277 }
a61af66fc99e Initial load
duke
parents:
diff changeset
278
a61af66fc99e Initial load
duke
parents:
diff changeset
279 bool CommandLineFlags::uintxAt(char* name, size_t len, uintx* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
280 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
281 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
282 if (!result->is_uintx()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
283 *value = result->get_uintx();
a61af66fc99e Initial load
duke
parents:
diff changeset
284 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
285 }
a61af66fc99e Initial load
duke
parents:
diff changeset
286
a61af66fc99e Initial load
duke
parents:
diff changeset
287 bool CommandLineFlags::uintxAtPut(char* name, size_t len, uintx* value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
288 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
289 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
290 if (!result->is_uintx()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
291 uintx old_value = result->get_uintx();
a61af66fc99e Initial load
duke
parents:
diff changeset
292 result->set_uintx(*value);
a61af66fc99e Initial load
duke
parents:
diff changeset
293 *value = old_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
294 result->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
295 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
296 }
a61af66fc99e Initial load
duke
parents:
diff changeset
297
a61af66fc99e Initial load
duke
parents:
diff changeset
298 void CommandLineFlagsEx::uintxAtPut(CommandLineFlagWithType flag, uintx value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
299 Flag* faddr = address_of_flag(flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
300 guarantee(faddr != NULL && faddr->is_uintx(), "wrong flag type");
a61af66fc99e Initial load
duke
parents:
diff changeset
301 faddr->set_uintx(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
302 faddr->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
303 }
a61af66fc99e Initial load
duke
parents:
diff changeset
304
a61af66fc99e Initial load
duke
parents:
diff changeset
305 bool CommandLineFlags::doubleAt(char* name, size_t len, double* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
306 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
307 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
308 if (!result->is_double()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
309 *value = result->get_double();
a61af66fc99e Initial load
duke
parents:
diff changeset
310 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
311 }
a61af66fc99e Initial load
duke
parents:
diff changeset
312
a61af66fc99e Initial load
duke
parents:
diff changeset
313 bool CommandLineFlags::doubleAtPut(char* name, size_t len, double* value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
314 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
315 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
316 if (!result->is_double()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
317 double old_value = result->get_double();
a61af66fc99e Initial load
duke
parents:
diff changeset
318 result->set_double(*value);
a61af66fc99e Initial load
duke
parents:
diff changeset
319 *value = old_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
320 result->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
321 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
322 }
a61af66fc99e Initial load
duke
parents:
diff changeset
323
a61af66fc99e Initial load
duke
parents:
diff changeset
324 void CommandLineFlagsEx::doubleAtPut(CommandLineFlagWithType flag, double value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
325 Flag* faddr = address_of_flag(flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
326 guarantee(faddr != NULL && faddr->is_double(), "wrong flag type");
a61af66fc99e Initial load
duke
parents:
diff changeset
327 faddr->set_double(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
328 faddr->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
329 }
a61af66fc99e Initial load
duke
parents:
diff changeset
330
a61af66fc99e Initial load
duke
parents:
diff changeset
331 bool CommandLineFlags::ccstrAt(char* name, size_t len, ccstr* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
332 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
333 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
334 if (!result->is_ccstr()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
335 *value = result->get_ccstr();
a61af66fc99e Initial load
duke
parents:
diff changeset
336 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
337 }
a61af66fc99e Initial load
duke
parents:
diff changeset
338
a61af66fc99e Initial load
duke
parents:
diff changeset
339 // Contract: Flag will make private copy of the incoming value.
a61af66fc99e Initial load
duke
parents:
diff changeset
340 // Outgoing value is always malloc-ed, and caller MUST call free.
a61af66fc99e Initial load
duke
parents:
diff changeset
341 bool CommandLineFlags::ccstrAtPut(char* name, size_t len, ccstr* value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
342 Flag* result = Flag::find_flag(name, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
343 if (result == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
344 if (!result->is_ccstr()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
345 ccstr old_value = result->get_ccstr();
a61af66fc99e Initial load
duke
parents:
diff changeset
346 char* new_value = NEW_C_HEAP_ARRAY(char, strlen(*value)+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
347 strcpy(new_value, *value);
a61af66fc99e Initial load
duke
parents:
diff changeset
348 result->set_ccstr(new_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
349 if (result->origin == DEFAULT && old_value != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
350 // Prior value is NOT heap allocated, but was a literal constant.
a61af66fc99e Initial load
duke
parents:
diff changeset
351 char* old_value_to_free = NEW_C_HEAP_ARRAY(char, strlen(old_value)+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
352 strcpy(old_value_to_free, old_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
353 old_value = old_value_to_free;
a61af66fc99e Initial load
duke
parents:
diff changeset
354 }
a61af66fc99e Initial load
duke
parents:
diff changeset
355 *value = old_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
356 result->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
357 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
358 }
a61af66fc99e Initial load
duke
parents:
diff changeset
359
a61af66fc99e Initial load
duke
parents:
diff changeset
360 // Contract: Flag will make private copy of the incoming value.
a61af66fc99e Initial load
duke
parents:
diff changeset
361 void CommandLineFlagsEx::ccstrAtPut(CommandLineFlagWithType flag, ccstr value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
362 Flag* faddr = address_of_flag(flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
363 guarantee(faddr != NULL && faddr->is_ccstr(), "wrong flag type");
a61af66fc99e Initial load
duke
parents:
diff changeset
364 ccstr old_value = faddr->get_ccstr();
a61af66fc99e Initial load
duke
parents:
diff changeset
365 char* new_value = NEW_C_HEAP_ARRAY(char, strlen(value)+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
366 strcpy(new_value, value);
a61af66fc99e Initial load
duke
parents:
diff changeset
367 faddr->set_ccstr(new_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
368 if (faddr->origin != DEFAULT && old_value != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
369 // Prior value is heap allocated so free it.
a61af66fc99e Initial load
duke
parents:
diff changeset
370 FREE_C_HEAP_ARRAY(char, old_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
371 }
a61af66fc99e Initial load
duke
parents:
diff changeset
372 faddr->origin = origin;
a61af66fc99e Initial load
duke
parents:
diff changeset
373 }
a61af66fc99e Initial load
duke
parents:
diff changeset
374
a61af66fc99e Initial load
duke
parents:
diff changeset
375 extern "C" {
a61af66fc99e Initial load
duke
parents:
diff changeset
376 static int compare_flags(const void* void_a, const void* void_b) {
a61af66fc99e Initial load
duke
parents:
diff changeset
377 return strcmp((*((Flag**) void_a))->name, (*((Flag**) void_b))->name);
a61af66fc99e Initial load
duke
parents:
diff changeset
378 }
a61af66fc99e Initial load
duke
parents:
diff changeset
379 }
a61af66fc99e Initial load
duke
parents:
diff changeset
380
a61af66fc99e Initial load
duke
parents:
diff changeset
381 void CommandLineFlags::printSetFlags() {
a61af66fc99e Initial load
duke
parents:
diff changeset
382 // Print which flags were set on the command line
a61af66fc99e Initial load
duke
parents:
diff changeset
383 // note: this method is called before the thread structure is in place
a61af66fc99e Initial load
duke
parents:
diff changeset
384 // which means resource allocation cannot be used.
a61af66fc99e Initial load
duke
parents:
diff changeset
385
a61af66fc99e Initial load
duke
parents:
diff changeset
386 // Compute size
a61af66fc99e Initial load
duke
parents:
diff changeset
387 int length= 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
388 while (flagTable[length].name != NULL) length++;
a61af66fc99e Initial load
duke
parents:
diff changeset
389
a61af66fc99e Initial load
duke
parents:
diff changeset
390 // Sort
a61af66fc99e Initial load
duke
parents:
diff changeset
391 Flag** array = NEW_C_HEAP_ARRAY(Flag*, length);
a61af66fc99e Initial load
duke
parents:
diff changeset
392 for (int index = 0; index < length; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
393 array[index] = &flagTable[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
394 }
a61af66fc99e Initial load
duke
parents:
diff changeset
395 qsort(array, length, sizeof(Flag*), compare_flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
396
a61af66fc99e Initial load
duke
parents:
diff changeset
397 // Print
a61af66fc99e Initial load
duke
parents:
diff changeset
398 for (int i = 0; i < length; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
399 if (array[i]->origin /* naked field! */) {
a61af66fc99e Initial load
duke
parents:
diff changeset
400 array[i]->print_as_flag(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
401 tty->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
402 }
a61af66fc99e Initial load
duke
parents:
diff changeset
403 }
a61af66fc99e Initial load
duke
parents:
diff changeset
404 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
405 FREE_C_HEAP_ARRAY(Flag*, array);
a61af66fc99e Initial load
duke
parents:
diff changeset
406 }
a61af66fc99e Initial load
duke
parents:
diff changeset
407
a61af66fc99e Initial load
duke
parents:
diff changeset
408 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
409
a61af66fc99e Initial load
duke
parents:
diff changeset
410
a61af66fc99e Initial load
duke
parents:
diff changeset
411 void CommandLineFlags::verify() {
a61af66fc99e Initial load
duke
parents:
diff changeset
412 assert(Arguments::check_vm_args_consistency(), "Some flag settings conflict");
a61af66fc99e Initial load
duke
parents:
diff changeset
413 }
a61af66fc99e Initial load
duke
parents:
diff changeset
414
a61af66fc99e Initial load
duke
parents:
diff changeset
415 void CommandLineFlags::printFlags() {
a61af66fc99e Initial load
duke
parents:
diff changeset
416 // Print the flags sorted by name
a61af66fc99e Initial load
duke
parents:
diff changeset
417 // note: this method is called before the thread structure is in place
a61af66fc99e Initial load
duke
parents:
diff changeset
418 // which means resource allocation cannot be used.
a61af66fc99e Initial load
duke
parents:
diff changeset
419
a61af66fc99e Initial load
duke
parents:
diff changeset
420 // Compute size
a61af66fc99e Initial load
duke
parents:
diff changeset
421 int length= 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
422 while (flagTable[length].name != NULL) length++;
a61af66fc99e Initial load
duke
parents:
diff changeset
423
a61af66fc99e Initial load
duke
parents:
diff changeset
424 // Sort
a61af66fc99e Initial load
duke
parents:
diff changeset
425 Flag** array = NEW_C_HEAP_ARRAY(Flag*, length);
a61af66fc99e Initial load
duke
parents:
diff changeset
426 for (int index = 0; index < length; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
427 array[index] = &flagTable[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
428 }
a61af66fc99e Initial load
duke
parents:
diff changeset
429 qsort(array, length, sizeof(Flag*), compare_flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
430
a61af66fc99e Initial load
duke
parents:
diff changeset
431 // Print
a61af66fc99e Initial load
duke
parents:
diff changeset
432 tty->print_cr("[Global flags]");
a61af66fc99e Initial load
duke
parents:
diff changeset
433 for (int i = 0; i < length; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
434 if (array[i]->is_unlocked()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
435 array[i]->print_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
436 }
a61af66fc99e Initial load
duke
parents:
diff changeset
437 }
a61af66fc99e Initial load
duke
parents:
diff changeset
438 FREE_C_HEAP_ARRAY(Flag*, array);
a61af66fc99e Initial load
duke
parents:
diff changeset
439 }
a61af66fc99e Initial load
duke
parents:
diff changeset
440
a61af66fc99e Initial load
duke
parents:
diff changeset
441 #endif