duke@435: /* xdono@631: * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. duke@435: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@435: * duke@435: * This code is free software; you can redistribute it and/or modify it duke@435: * under the terms of the GNU General Public License version 2 only, as duke@435: * published by the Free Software Foundation. duke@435: * duke@435: * This code is distributed in the hope that it will be useful, but WITHOUT duke@435: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@435: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@435: * version 2 for more details (a copy is included in the LICENSE file that duke@435: * accompanied this code). duke@435: * duke@435: * You should have received a copy of the GNU General Public License version duke@435: * 2 along with this work; if not, write to the Free Software Foundation, duke@435: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@435: * duke@435: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, duke@435: * CA 95054 USA or visit www.sun.com if you need additional information or duke@435: * have any questions. duke@435: * duke@435: */ duke@435: duke@435: # include "incls/_precompiled.incl" duke@435: # include "incls/_globals.cpp.incl" duke@435: duke@435: duke@435: RUNTIME_FLAGS(MATERIALIZE_DEVELOPER_FLAG, MATERIALIZE_PD_DEVELOPER_FLAG, \ duke@435: MATERIALIZE_PRODUCT_FLAG, MATERIALIZE_PD_PRODUCT_FLAG, \ ysr@785: MATERIALIZE_DIAGNOSTIC_FLAG, MATERIALIZE_EXPERIMENTAL_FLAG, \ ysr@785: MATERIALIZE_NOTPRODUCT_FLAG, \ coleenp@548: MATERIALIZE_MANAGEABLE_FLAG, MATERIALIZE_PRODUCT_RW_FLAG, \ coleenp@548: MATERIALIZE_LP64_PRODUCT_FLAG) duke@435: duke@435: RUNTIME_OS_FLAGS(MATERIALIZE_DEVELOPER_FLAG, MATERIALIZE_PD_DEVELOPER_FLAG, \ duke@435: MATERIALIZE_PRODUCT_FLAG, MATERIALIZE_PD_PRODUCT_FLAG, \ duke@435: MATERIALIZE_DIAGNOSTIC_FLAG, MATERIALIZE_NOTPRODUCT_FLAG) duke@435: duke@435: bool Flag::is_unlocker() const { ysr@785: return strcmp(name, "UnlockDiagnosticVMOptions") == 0 || ysr@785: strcmp(name, "UnlockExperimentalVMOptions") == 0; ysr@785: duke@435: } duke@435: duke@435: bool Flag::is_unlocked() const { duke@435: if (strcmp(kind, "{diagnostic}") == 0) { duke@435: return UnlockDiagnosticVMOptions; ysr@785: } else if (strcmp(kind, "{experimental}") == 0) { ysr@785: return UnlockExperimentalVMOptions; duke@435: } else { duke@435: return true; duke@435: } duke@435: } duke@435: duke@435: bool Flag::is_writeable() const { duke@435: return (strcmp(kind, "{manageable}") == 0 || strcmp(kind, "{product rw}") == 0); duke@435: } duke@435: duke@435: // All flags except "manageable" are assumed internal flags. duke@435: // Long term, we need to define a mechanism to specify which flags duke@435: // are external/stable and change this function accordingly. duke@435: bool Flag::is_external() const { duke@435: return (strcmp(kind, "{manageable}") == 0); duke@435: } duke@435: duke@435: // Length of format string (e.g. "%.1234s") for printing ccstr below duke@435: #define FORMAT_BUFFER_LEN 16 duke@435: duke@435: void Flag::print_on(outputStream* st) { duke@435: st->print("%5s %-35s %c= ", type, name, (origin != DEFAULT ? ':' : ' ')); phh@1502: if (is_bool()) st->print("%-16s", get_bool() ? "true" : "false"); phh@1502: if (is_intx()) st->print("%-16ld", get_intx()); phh@1502: if (is_uintx()) st->print("%-16lu", get_uintx()); phh@1502: if (is_uint64_t()) st->print("%-16lu", get_uint64_t()); duke@435: if (is_ccstr()) { duke@435: const char* cp = get_ccstr(); never@538: if (cp != NULL) { never@538: const char* eol; never@538: while ((eol = strchr(cp, '\n')) != NULL) { never@538: char format_buffer[FORMAT_BUFFER_LEN]; never@538: size_t llen = pointer_delta(eol, cp, sizeof(char)); never@538: jio_snprintf(format_buffer, FORMAT_BUFFER_LEN, never@538: "%%." SIZE_FORMAT "s", llen); never@538: st->print(format_buffer, cp); never@538: st->cr(); never@538: cp = eol+1; never@538: st->print("%5s %-35s += ", "", name); never@538: } never@538: st->print("%-16s", cp); duke@435: } duke@435: } duke@435: st->print(" %s", kind); duke@435: st->cr(); duke@435: } duke@435: duke@435: void Flag::print_as_flag(outputStream* st) { duke@435: if (is_bool()) { duke@435: st->print("-XX:%s%s", get_bool() ? "+" : "-", name); duke@435: } else if (is_intx()) { duke@435: st->print("-XX:%s=" INTX_FORMAT, name, get_intx()); duke@435: } else if (is_uintx()) { duke@435: st->print("-XX:%s=" UINTX_FORMAT, name, get_uintx()); phh@1502: } else if (is_uint64_t()) { phh@1502: st->print("-XX:%s=" UINT64_FORMAT, name, get_uint64_t()); duke@435: } else if (is_ccstr()) { duke@435: st->print("-XX:%s=", name); never@538: const char* cp = get_ccstr(); never@538: if (cp != NULL) { never@538: // Need to turn embedded '\n's back into separate arguments never@538: // Not so efficient to print one character at a time, never@538: // but the choice is to do the transformation to a buffer never@538: // and print that. And this need not be efficient. never@538: for (; *cp != '\0'; cp += 1) { never@538: switch (*cp) { never@538: default: never@538: st->print("%c", *cp); never@538: break; never@538: case '\n': never@538: st->print(" -XX:%s=", name); never@538: break; never@538: } duke@435: } duke@435: } duke@435: } else { duke@435: ShouldNotReachHere(); duke@435: } duke@435: } duke@435: duke@435: // 4991491 do not "optimize out" the was_set false values: omitting them duke@435: // tickles a Microsoft compiler bug causing flagTable to be malformed duke@435: duke@435: #define RUNTIME_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{product}", DEFAULT }, duke@435: #define RUNTIME_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{pd product}", DEFAULT }, duke@435: #define RUNTIME_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{diagnostic}", DEFAULT }, ysr@785: #define RUNTIME_EXPERIMENTAL_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{experimental}", DEFAULT }, duke@435: #define RUNTIME_MANAGEABLE_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{manageable}", DEFAULT }, duke@435: #define RUNTIME_PRODUCT_RW_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{product rw}", DEFAULT }, duke@435: duke@435: #ifdef PRODUCT duke@435: #define RUNTIME_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */ duke@435: #define RUNTIME_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */ duke@435: #define RUNTIME_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) duke@435: #else duke@435: #define RUNTIME_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "", DEFAULT }, duke@435: #define RUNTIME_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{pd}", DEFAULT }, duke@435: #define RUNTIME_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{notproduct}", DEFAULT }, duke@435: #endif duke@435: coleenp@548: #ifdef _LP64 coleenp@548: #define RUNTIME_LP64_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{lp64_product}", DEFAULT }, coleenp@548: #else coleenp@548: #define RUNTIME_LP64_PRODUCT_FLAG_STRUCT(type, name, value, doc) /* flag is constant */ coleenp@548: #endif // _LP64 coleenp@548: duke@435: #define C1_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C1 product}", DEFAULT }, duke@435: #define C1_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{C1 pd product}", DEFAULT }, duke@435: #ifdef PRODUCT duke@435: #define C1_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */ duke@435: #define C1_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */ duke@435: #define C1_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) duke@435: #else duke@435: #define C1_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C1}", DEFAULT }, duke@435: #define C1_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{C1 pd}", DEFAULT }, duke@435: #define C1_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C1 notproduct}", DEFAULT }, duke@435: #endif duke@435: duke@435: duke@435: #define C2_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C2 product}", DEFAULT }, duke@435: #define C2_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{C2 pd product}", DEFAULT }, duke@435: #define C2_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C2 diagnostic}", DEFAULT }, duke@435: #ifdef PRODUCT duke@435: #define C2_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */ duke@435: #define C2_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */ duke@435: #define C2_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) duke@435: #else duke@435: #define C2_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C2}", DEFAULT }, duke@435: #define C2_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, "{C2 pd}", DEFAULT }, duke@435: #define C2_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, "{C2 notproduct}", DEFAULT }, duke@435: #endif duke@435: duke@435: duke@435: static Flag flagTable[] = { ysr@785: 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) duke@435: 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) ysr@777: #ifndef SERIALGC ysr@785: 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) ysr@777: #endif // SERIALGC duke@435: #ifdef COMPILER1 duke@435: C1_FLAGS(C1_DEVELOP_FLAG_STRUCT, C1_PD_DEVELOP_FLAG_STRUCT, C1_PRODUCT_FLAG_STRUCT, C1_PD_PRODUCT_FLAG_STRUCT, C1_NOTPRODUCT_FLAG_STRUCT) duke@435: #endif duke@435: #ifdef COMPILER2 duke@435: 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) duke@435: #endif duke@435: {0, NULL, NULL} duke@435: }; duke@435: duke@435: Flag* Flag::flags = flagTable; duke@435: size_t Flag::numFlags = (sizeof(flagTable) / sizeof(Flag)); duke@435: duke@435: inline bool str_equal(const char* s, char* q, size_t len) { duke@435: // s is null terminated, q is not! duke@435: if (strlen(s) != (unsigned int) len) return false; duke@435: return strncmp(s, q, len) == 0; duke@435: } duke@435: duke@435: Flag* Flag::find_flag(char* name, size_t length) { duke@435: for (Flag* current = &flagTable[0]; current->name; current++) { duke@435: if (str_equal(current->name, name, length)) { duke@435: if (!(current->is_unlocked() || current->is_unlocker())) { ysr@785: // disable use of diagnostic or experimental flags until they ysr@785: // are explicitly unlocked duke@435: return NULL; duke@435: } duke@435: return current; duke@435: } duke@435: } duke@435: return NULL; duke@435: } duke@435: duke@435: // Returns the address of the index'th element duke@435: static Flag* address_of_flag(CommandLineFlagWithType flag) { duke@435: assert((size_t)flag < Flag::numFlags, "bad command line flag index"); duke@435: return &Flag::flags[flag]; duke@435: } duke@435: duke@435: bool CommandLineFlagsEx::is_default(CommandLineFlag flag) { duke@435: assert((size_t)flag < Flag::numFlags, "bad command line flag index"); duke@435: Flag* f = &Flag::flags[flag]; duke@435: return (f->origin == DEFAULT); duke@435: } duke@435: jmasa@448: bool CommandLineFlagsEx::is_ergo(CommandLineFlag flag) { jmasa@448: assert((size_t)flag < Flag::numFlags, "bad command line flag index"); jmasa@448: Flag* f = &Flag::flags[flag]; jmasa@448: return (f->origin == ERGONOMIC); jmasa@448: } jmasa@448: jmasa@448: bool CommandLineFlagsEx::is_cmdline(CommandLineFlag flag) { jmasa@448: assert((size_t)flag < Flag::numFlags, "bad command line flag index"); jmasa@448: Flag* f = &Flag::flags[flag]; jmasa@448: return (f->origin == COMMAND_LINE); jmasa@448: } jmasa@448: duke@435: bool CommandLineFlags::wasSetOnCmdline(const char* name, bool* value) { duke@435: Flag* result = Flag::find_flag((char*)name, strlen(name)); duke@435: if (result == NULL) return false; duke@435: *value = (result->origin == COMMAND_LINE); duke@435: return true; duke@435: } duke@435: duke@435: bool CommandLineFlags::boolAt(char* name, size_t len, bool* value) { duke@435: Flag* result = Flag::find_flag(name, len); duke@435: if (result == NULL) return false; duke@435: if (!result->is_bool()) return false; duke@435: *value = result->get_bool(); duke@435: return true; duke@435: } duke@435: duke@435: bool CommandLineFlags::boolAtPut(char* name, size_t len, bool* value, FlagValueOrigin origin) { duke@435: Flag* result = Flag::find_flag(name, len); duke@435: if (result == NULL) return false; duke@435: if (!result->is_bool()) return false; duke@435: bool old_value = result->get_bool(); duke@435: result->set_bool(*value); duke@435: *value = old_value; duke@435: result->origin = origin; duke@435: return true; duke@435: } duke@435: duke@435: void CommandLineFlagsEx::boolAtPut(CommandLineFlagWithType flag, bool value, FlagValueOrigin origin) { duke@435: Flag* faddr = address_of_flag(flag); duke@435: guarantee(faddr != NULL && faddr->is_bool(), "wrong flag type"); duke@435: faddr->set_bool(value); duke@435: faddr->origin = origin; duke@435: } duke@435: duke@435: bool CommandLineFlags::intxAt(char* name, size_t len, intx* value) { duke@435: Flag* result = Flag::find_flag(name, len); duke@435: if (result == NULL) return false; duke@435: if (!result->is_intx()) return false; duke@435: *value = result->get_intx(); duke@435: return true; duke@435: } duke@435: duke@435: bool CommandLineFlags::intxAtPut(char* name, size_t len, intx* value, FlagValueOrigin origin) { duke@435: Flag* result = Flag::find_flag(name, len); duke@435: if (result == NULL) return false; duke@435: if (!result->is_intx()) return false; duke@435: intx old_value = result->get_intx(); duke@435: result->set_intx(*value); duke@435: *value = old_value; duke@435: result->origin = origin; duke@435: return true; duke@435: } duke@435: duke@435: void CommandLineFlagsEx::intxAtPut(CommandLineFlagWithType flag, intx value, FlagValueOrigin origin) { duke@435: Flag* faddr = address_of_flag(flag); duke@435: guarantee(faddr != NULL && faddr->is_intx(), "wrong flag type"); duke@435: faddr->set_intx(value); duke@435: faddr->origin = origin; duke@435: } duke@435: duke@435: bool CommandLineFlags::uintxAt(char* name, size_t len, uintx* value) { duke@435: Flag* result = Flag::find_flag(name, len); duke@435: if (result == NULL) return false; duke@435: if (!result->is_uintx()) return false; duke@435: *value = result->get_uintx(); duke@435: return true; duke@435: } duke@435: duke@435: bool CommandLineFlags::uintxAtPut(char* name, size_t len, uintx* value, FlagValueOrigin origin) { duke@435: Flag* result = Flag::find_flag(name, len); duke@435: if (result == NULL) return false; duke@435: if (!result->is_uintx()) return false; duke@435: uintx old_value = result->get_uintx(); duke@435: result->set_uintx(*value); duke@435: *value = old_value; duke@435: result->origin = origin; duke@435: return true; duke@435: } duke@435: duke@435: void CommandLineFlagsEx::uintxAtPut(CommandLineFlagWithType flag, uintx value, FlagValueOrigin origin) { duke@435: Flag* faddr = address_of_flag(flag); duke@435: guarantee(faddr != NULL && faddr->is_uintx(), "wrong flag type"); duke@435: faddr->set_uintx(value); duke@435: faddr->origin = origin; duke@435: } duke@435: phh@1499: bool CommandLineFlags::uint64_tAt(char* name, size_t len, uint64_t* value) { phh@1499: Flag* result = Flag::find_flag(name, len); phh@1499: if (result == NULL) return false; phh@1499: if (!result->is_uint64_t()) return false; phh@1499: *value = result->get_uint64_t(); phh@1499: return true; phh@1499: } phh@1499: phh@1499: bool CommandLineFlags::uint64_tAtPut(char* name, size_t len, uint64_t* value, FlagValueOrigin origin) { phh@1499: Flag* result = Flag::find_flag(name, len); phh@1499: if (result == NULL) return false; phh@1499: if (!result->is_uint64_t()) return false; phh@1499: uint64_t old_value = result->get_uint64_t(); phh@1499: result->set_uint64_t(*value); phh@1499: *value = old_value; phh@1499: result->origin = origin; phh@1499: return true; phh@1499: } phh@1499: phh@1499: void CommandLineFlagsEx::uint64_tAtPut(CommandLineFlagWithType flag, uint64_t value, FlagValueOrigin origin) { phh@1499: Flag* faddr = address_of_flag(flag); phh@1499: guarantee(faddr != NULL && faddr->is_uint64_t(), "wrong flag type"); phh@1499: faddr->set_uint64_t(value); phh@1499: faddr->origin = origin; phh@1499: } phh@1499: duke@435: bool CommandLineFlags::doubleAt(char* name, size_t len, double* value) { duke@435: Flag* result = Flag::find_flag(name, len); duke@435: if (result == NULL) return false; duke@435: if (!result->is_double()) return false; duke@435: *value = result->get_double(); duke@435: return true; duke@435: } duke@435: duke@435: bool CommandLineFlags::doubleAtPut(char* name, size_t len, double* value, FlagValueOrigin origin) { duke@435: Flag* result = Flag::find_flag(name, len); duke@435: if (result == NULL) return false; duke@435: if (!result->is_double()) return false; duke@435: double old_value = result->get_double(); duke@435: result->set_double(*value); duke@435: *value = old_value; duke@435: result->origin = origin; duke@435: return true; duke@435: } duke@435: duke@435: void CommandLineFlagsEx::doubleAtPut(CommandLineFlagWithType flag, double value, FlagValueOrigin origin) { duke@435: Flag* faddr = address_of_flag(flag); duke@435: guarantee(faddr != NULL && faddr->is_double(), "wrong flag type"); duke@435: faddr->set_double(value); duke@435: faddr->origin = origin; duke@435: } duke@435: duke@435: bool CommandLineFlags::ccstrAt(char* name, size_t len, ccstr* value) { duke@435: Flag* result = Flag::find_flag(name, len); duke@435: if (result == NULL) return false; duke@435: if (!result->is_ccstr()) return false; duke@435: *value = result->get_ccstr(); duke@435: return true; duke@435: } duke@435: duke@435: // Contract: Flag will make private copy of the incoming value. duke@435: // Outgoing value is always malloc-ed, and caller MUST call free. duke@435: bool CommandLineFlags::ccstrAtPut(char* name, size_t len, ccstr* value, FlagValueOrigin origin) { duke@435: Flag* result = Flag::find_flag(name, len); duke@435: if (result == NULL) return false; duke@435: if (!result->is_ccstr()) return false; duke@435: ccstr old_value = result->get_ccstr(); never@805: char* new_value = NULL; never@805: if (*value != NULL) { never@805: new_value = NEW_C_HEAP_ARRAY(char, strlen(*value)+1); never@805: strcpy(new_value, *value); never@805: } duke@435: result->set_ccstr(new_value); duke@435: if (result->origin == DEFAULT && old_value != NULL) { duke@435: // Prior value is NOT heap allocated, but was a literal constant. duke@435: char* old_value_to_free = NEW_C_HEAP_ARRAY(char, strlen(old_value)+1); duke@435: strcpy(old_value_to_free, old_value); duke@435: old_value = old_value_to_free; duke@435: } duke@435: *value = old_value; duke@435: result->origin = origin; duke@435: return true; duke@435: } duke@435: duke@435: // Contract: Flag will make private copy of the incoming value. duke@435: void CommandLineFlagsEx::ccstrAtPut(CommandLineFlagWithType flag, ccstr value, FlagValueOrigin origin) { duke@435: Flag* faddr = address_of_flag(flag); duke@435: guarantee(faddr != NULL && faddr->is_ccstr(), "wrong flag type"); duke@435: ccstr old_value = faddr->get_ccstr(); duke@435: char* new_value = NEW_C_HEAP_ARRAY(char, strlen(value)+1); duke@435: strcpy(new_value, value); duke@435: faddr->set_ccstr(new_value); duke@435: if (faddr->origin != DEFAULT && old_value != NULL) { duke@435: // Prior value is heap allocated so free it. duke@435: FREE_C_HEAP_ARRAY(char, old_value); duke@435: } duke@435: faddr->origin = origin; duke@435: } duke@435: duke@435: extern "C" { duke@435: static int compare_flags(const void* void_a, const void* void_b) { duke@435: return strcmp((*((Flag**) void_a))->name, (*((Flag**) void_b))->name); duke@435: } duke@435: } duke@435: duke@435: void CommandLineFlags::printSetFlags() { duke@435: // Print which flags were set on the command line duke@435: // note: this method is called before the thread structure is in place duke@435: // which means resource allocation cannot be used. duke@435: duke@435: // Compute size duke@435: int length= 0; duke@435: while (flagTable[length].name != NULL) length++; duke@435: duke@435: // Sort duke@435: Flag** array = NEW_C_HEAP_ARRAY(Flag*, length); duke@435: for (int index = 0; index < length; index++) { duke@435: array[index] = &flagTable[index]; duke@435: } duke@435: qsort(array, length, sizeof(Flag*), compare_flags); duke@435: duke@435: // Print duke@435: for (int i = 0; i < length; i++) { duke@435: if (array[i]->origin /* naked field! */) { duke@435: array[i]->print_as_flag(tty); duke@435: tty->print(" "); duke@435: } duke@435: } duke@435: tty->cr(); duke@435: FREE_C_HEAP_ARRAY(Flag*, array); duke@435: } duke@435: duke@435: #ifndef PRODUCT duke@435: duke@435: duke@435: void CommandLineFlags::verify() { duke@435: assert(Arguments::check_vm_args_consistency(), "Some flag settings conflict"); duke@435: } duke@435: duke@435: void CommandLineFlags::printFlags() { duke@435: // Print the flags sorted by name duke@435: // note: this method is called before the thread structure is in place duke@435: // which means resource allocation cannot be used. duke@435: duke@435: // Compute size duke@435: int length= 0; duke@435: while (flagTable[length].name != NULL) length++; duke@435: duke@435: // Sort duke@435: Flag** array = NEW_C_HEAP_ARRAY(Flag*, length); duke@435: for (int index = 0; index < length; index++) { duke@435: array[index] = &flagTable[index]; duke@435: } duke@435: qsort(array, length, sizeof(Flag*), compare_flags); duke@435: duke@435: // Print duke@435: tty->print_cr("[Global flags]"); duke@435: for (int i = 0; i < length; i++) { duke@435: if (array[i]->is_unlocked()) { duke@435: array[i]->print_on(tty); duke@435: } duke@435: } duke@435: FREE_C_HEAP_ARRAY(Flag*, array); duke@435: } duke@435: duke@435: #endif