< prev index next >
src/share/vm/runtime/arguments.cpp
Print this page
*** 89,99 ****
const char* Arguments::_java_vendor_url_bug = DEFAULT_VENDOR_URL_BUG;
const char* Arguments::_sun_java_launcher = DEFAULT_JAVA_LAUNCHER;
int Arguments::_sun_java_launcher_pid = -1;
bool Arguments::_sun_java_launcher_is_altjvm = false;
! // These parameters are reset in method parse_vm_init_args(JavaVMInitArgs*)
bool Arguments::_AlwaysCompileLoopMethods = AlwaysCompileLoopMethods;
bool Arguments::_UseOnStackReplacement = UseOnStackReplacement;
bool Arguments::_BackgroundCompilation = BackgroundCompilation;
bool Arguments::_ClipInlining = ClipInlining;
intx Arguments::_Tier3InvokeNotifyFreqLog = Tier3InvokeNotifyFreqLog;
--- 89,99 ----
const char* Arguments::_java_vendor_url_bug = DEFAULT_VENDOR_URL_BUG;
const char* Arguments::_sun_java_launcher = DEFAULT_JAVA_LAUNCHER;
int Arguments::_sun_java_launcher_pid = -1;
bool Arguments::_sun_java_launcher_is_altjvm = false;
! // These parameters are reset in method parse_vm_init_args()
bool Arguments::_AlwaysCompileLoopMethods = AlwaysCompileLoopMethods;
bool Arguments::_UseOnStackReplacement = UseOnStackReplacement;
bool Arguments::_BackgroundCompilation = BackgroundCompilation;
bool Arguments::_ClipInlining = ClipInlining;
intx Arguments::_Tier3InvokeNotifyFreqLog = Tier3InvokeNotifyFreqLog;
*** 2247,2257 ****
return check_memory_size(*long_arg, min_size);
}
// Parse JavaVMInitArgs structure
! jint Arguments::parse_vm_init_args(const JavaVMInitArgs* args) {
// For components of the system classpath.
SysClassPath scp(Arguments::get_sysclasspath());
bool scp_assembly_required = false;
// Save default settings for some mode flags
--- 2247,2259 ----
return check_memory_size(*long_arg, min_size);
}
// Parse JavaVMInitArgs structure
! jint Arguments::parse_vm_init_args(const JavaVMInitArgs *java_tool_options_args,
! const JavaVMInitArgs *java_options_args,
! const JavaVMInitArgs *cmd_line_args) {
// For components of the system classpath.
SysClassPath scp(Arguments::get_sysclasspath());
bool scp_assembly_required = false;
// Save default settings for some mode flags
*** 2265,2288 ****
}
// Setup flags for mixed which is the default
set_mode_flags(_mixed);
! // Parse JAVA_TOOL_OPTIONS environment variable (if present)
! jint result = parse_java_tool_options_environment_variable(&scp, &scp_assembly_required);
if (result != JNI_OK) {
return result;
}
! // Parse JavaVMInitArgs structure passed in
! result = parse_each_vm_init_arg(args, &scp, &scp_assembly_required, Flag::COMMAND_LINE);
if (result != JNI_OK) {
return result;
}
! // Parse _JAVA_OPTIONS environment variable (if present) (mimics classic VM)
! result = parse_java_options_environment_variable(&scp, &scp_assembly_required);
if (result != JNI_OK) {
return result;
}
// Do final processing now that all arguments have been parsed
--- 2267,2295 ----
}
// Setup flags for mixed which is the default
set_mode_flags(_mixed);
! // Parse args structure generated from JAVA_TOOL_OPTIONS environment
! // variable (if present).
! jint result = parse_each_vm_init_arg(
! java_tool_options_args, &scp, &scp_assembly_required, Flag::ENVIRON_VAR);
if (result != JNI_OK) {
return result;
}
! // Parse args structure generated from the command line flags.
! result = parse_each_vm_init_arg(cmd_line_args, &scp, &scp_assembly_required,
! Flag::COMMAND_LINE);
if (result != JNI_OK) {
return result;
}
! // Parse args structure generated from the _JAVA_OPTIONS environment
! // variable (if present) (mimics classic VM)
! result = parse_each_vm_init_arg(
! java_options_args, &scp, &scp_assembly_required, Flag::ENVIRON_VAR);
if (result != JNI_OK) {
return result;
}
// Do final processing now that all arguments have been parsed
*** 3381,3404 ****
}
return JNI_OK;
}
! jint Arguments::parse_java_options_environment_variable(SysClassPath* scp_p, bool* scp_assembly_required_p) {
! return parse_options_environment_variable("_JAVA_OPTIONS", scp_p,
! scp_assembly_required_p);
}
! jint Arguments::parse_java_tool_options_environment_variable(SysClassPath* scp_p, bool* scp_assembly_required_p) {
! return parse_options_environment_variable("JAVA_TOOL_OPTIONS", scp_p,
! scp_assembly_required_p);
}
! jint Arguments::parse_options_environment_variable(const char* name, SysClassPath* scp_p, bool* scp_assembly_required_p) {
char *buffer = ::getenv(name);
! // Don't check this variable if user has special privileges
// (e.g. unix su command).
if (buffer == NULL || os::have_special_privileges()) {
return JNI_OK;
}
--- 3388,3414 ----
}
return JNI_OK;
}
! jint Arguments::parse_java_options_environment_variable(JavaVMInitArgs* args) {
! return parse_options_environment_variable("_JAVA_OPTIONS", args);
}
! jint Arguments::parse_java_tool_options_environment_variable(JavaVMInitArgs* args) {
! return parse_options_environment_variable("JAVA_TOOL_OPTIONS", args);
}
! jint Arguments::parse_options_environment_variable(const char* name, JavaVMInitArgs* vm_args) {
char *buffer = ::getenv(name);
! vm_args->version = JNI_VERSION_1_2;
! vm_args->options = NULL;
! vm_args->nOptions = 0;
! vm_args->ignoreUnrecognized = false;
!
! // Don't check this environment variable if user has special privileges
// (e.g. unix su command).
if (buffer == NULL || os::have_special_privileges()) {
return JNI_OK;
}
*** 3420,3429 ****
--- 3430,3440 ----
char* wrt = rd;
JavaVMOption option;
option.optionString = wrt;
options->append(option); // Fill in option
+
while (*rd != 0 && !isspace(*rd)) { // unquoted strings terminate with a space or NULL
if (*rd == '\'' || *rd == '"') { // handle a quoted string
int quote = *rd; // matching quote to look for
rd++; // don't copy open quote
while (*rd != quote) { // include everything (even spaces) up until quote
*** 3439,3490 ****
rd++; // don't copy close quote
} else {
*wrt++ = *rd++; // copy to option string
}
}
! // Need to check if we're done before writing a NULL,
! // because the write could be to the byte that rd is pointing to.
! if (*rd++ == 0) {
! *wrt = 0;
! break;
}
*wrt = 0; // Zero terminate option
}
JavaVMOption* options_arr =
NEW_C_HEAP_ARRAY_RETURN_NULL(JavaVMOption, options->length(), mtInternal);
if (options_arr == NULL) {
delete options;
os::free(buffer);
return JNI_ENOMEM;
}
for (int i = 0; i < options->length(); i++) {
options_arr[i] = options->at(i);
}
! // Construct JavaVMInitArgs structure and parse as if it was part of the command line
! JavaVMInitArgs vm_args;
! vm_args.version = JNI_VERSION_1_2;
! vm_args.options = options_arr;
! vm_args.nOptions = options->length();
! vm_args.ignoreUnrecognized = IgnoreUnrecognizedVMOptions;
!
! if (PrintVMOptions) {
! const char* tail;
! for (int i = 0; i < vm_args.nOptions; i++) {
! const JavaVMOption *option = vm_args.options + i;
! if (match_option(option, "-XX:", &tail)) {
! logOption(tail);
! }
! }
! }
- jint result = parse_each_vm_init_arg(&vm_args, scp_p, scp_assembly_required_p,
- Flag::ENVIRON_VAR);
- FREE_C_HEAP_ARRAY(JavaVMOption, options_arr);
delete options;
os::free(buffer);
! return result;
}
void Arguments::set_shared_spaces_flags() {
if (DumpSharedSpaces) {
if (RequireSharedSpaces) {
--- 3450,3494 ----
rd++; // don't copy close quote
} else {
*wrt++ = *rd++; // copy to option string
}
}
! if (*rd != 0) {
! // In this case, the assignment to wrt below will make *rd nul,
! // which will interfere with the next loop iteration.
! rd++;
}
*wrt = 0; // Zero terminate option
}
+
+ // Fill out JavaVMInitArgs structure.
JavaVMOption* options_arr =
NEW_C_HEAP_ARRAY_RETURN_NULL(JavaVMOption, options->length(), mtInternal);
if (options_arr == NULL) {
delete options;
os::free(buffer);
return JNI_ENOMEM;
}
for (int i = 0; i < options->length(); i++) {
options_arr[i] = options->at(i);
+ options_arr[i].optionString = os::strdup(options_arr[i].optionString);
}
! vm_args->options = options_arr;
! vm_args->nOptions = options->length();
! vm_args->ignoreUnrecognized = IgnoreUnrecognizedVMOptions;
delete options;
os::free(buffer);
! return JNI_OK;
! }
!
! static void free_memory_for_vm_init_args(JavaVMInitArgs* args) {
! for (int i = 0; i < args->nOptions; i++) {
! os::free(args->options[i].optionString);
! }
! FREE_C_HEAP_ARRAY(JavaVMOption, args->options);
}
void Arguments::set_shared_spaces_flags() {
if (DumpSharedSpaces) {
if (RequireSharedSpaces) {
*** 3563,3598 ****
return false;
}
#endif // PRODUCT
! // Parse entry point called from JNI_CreateJavaVM
!
! jint Arguments::parse(const JavaVMInitArgs* args) {
!
! // Initialize ranges and constraints
! CommandLineFlagRangeList::init();
! CommandLineFlagConstraintList::init();
!
// Remaining part of option string
const char* tail;
! // If flag "-XX:Flags=flags-file" is used it will be the first option to be processed.
! const char* hotspotrc = ".hotspotrc";
! bool settings_file_specified = false;
! bool needs_hotspotrc_warning = false;
!
! const char* flags_file;
! int index;
! for (index = 0; index < args->nOptions; index++) {
! const JavaVMOption *option = args->options + index;
if (ArgumentsExt::process_options(option)) {
continue;
}
if (match_option(option, "-XX:Flags=", &tail)) {
! flags_file = tail;
! settings_file_specified = true;
continue;
}
if (match_option(option, "-XX:+PrintVMOptions")) {
PrintVMOptions = true;
continue;
--- 3567,3588 ----
return false;
}
#endif // PRODUCT
! static int match_special_option_and_act(const JavaVMInitArgs* args,
! char** flags_file) {
// Remaining part of option string
const char* tail;
! for (int index = 0; index < args->nOptions; index++) {
! const JavaVMOption* option = args->options + index;
if (ArgumentsExt::process_options(option)) {
continue;
}
if (match_option(option, "-XX:Flags=", &tail)) {
! *flags_file = (char *) tail;
continue;
}
if (match_option(option, "-XX:+PrintVMOptions")) {
PrintVMOptions = true;
continue;
*** 3642,3660 ****
--- 3632,3694 ----
CommandLineFlags::printFlags(tty, true);
vm_exit(0);
}
#endif
}
+ return JNI_OK;
+ }
+
+ static void print_options(const JavaVMInitArgs *args) {
+ const char* tail;
+ for (int index = 0; index < args->nOptions; index++) {
+ const JavaVMOption *option = args->options + index;
+ if (match_option(option, "-XX:", &tail)) {
+ logOption(tail);
+ }
+ }
+ }
+
+ // Parse entry point called from JNI_CreateJavaVM
+
+ jint Arguments::parse(const JavaVMInitArgs* args) {
+ // If flag "-XX:Flags=flags-file" is used it will be the first option to be processed.
+ const char* hotspotrc = ".hotspotrc";
+ char* flags_file = NULL;
+ bool settings_file_specified = false;
+ bool needs_hotspotrc_warning = false;
+ JavaVMInitArgs java_tool_options_args;
+ JavaVMInitArgs java_options_args;
+
+ int code =
+ parse_java_tool_options_environment_variable(&java_tool_options_args);
+ if (code != JNI_OK) {
+ return code;
+ }
+
+ code = parse_java_options_environment_variable(&java_options_args);
+ if (code != JNI_OK) {
+ free_memory_for_vm_init_args(&java_tool_options_args);
+ return code;
+ }
+
+ match_special_option_and_act(&java_tool_options_args, &flags_file);
+ match_special_option_and_act(args, &flags_file);
+ match_special_option_and_act(&java_options_args, &flags_file);
+ settings_file_specified = (flags_file != NULL);
if (IgnoreUnrecognizedVMOptions) {
// uncast const to modify the flag args->ignoreUnrecognized
*(jboolean*)(&args->ignoreUnrecognized) = true;
+ java_tool_options_args.ignoreUnrecognized = true;
+ java_options_args.ignoreUnrecognized = true;
}
// Parse specified settings file
if (settings_file_specified) {
if (!process_settings_file(flags_file, true, args->ignoreUnrecognized)) {
+ free_memory_for_vm_init_args(&java_tool_options_args);
+ free_memory_for_vm_init_args(&java_options_args);
return JNI_EINVAL;
}
} else {
#ifdef ASSERT
// Parse default .hotspotrc settings file
*** 3668,3687 ****
}
#endif
}
if (PrintVMOptions) {
! for (index = 0; index < args->nOptions; index++) {
! const JavaVMOption *option = args->options + index;
! if (match_option(option, "-XX:", &tail)) {
! logOption(tail);
! }
! }
}
// Parse JavaVMInitArgs structure passed in, as well as JAVA_TOOL_OPTIONS and _JAVA_OPTIONS
! jint result = parse_vm_init_args(args);
if (result != JNI_OK) {
return result;
}
// Call get_shared_archive_path() here, after possible SharedArchiveFile option got parsed.
--- 3702,3724 ----
}
#endif
}
if (PrintVMOptions) {
! print_options(&java_tool_options_args);
! print_options(args);
! print_options(&java_options_args);
}
// Parse JavaVMInitArgs structure passed in, as well as JAVA_TOOL_OPTIONS and _JAVA_OPTIONS
! jint result =
! parse_vm_init_args(&java_tool_options_args, &java_options_args, args);
!
! // Done with the envvars
! free_memory_for_vm_init_args(&java_tool_options_args);
! free_memory_for_vm_init_args(&java_options_args);
!
if (result != JNI_OK) {
return result;
}
// Call get_shared_archive_path() here, after possible SharedArchiveFile option got parsed.
< prev index next >