8232080: jlink plugins for vendor information and run-time options

Reviewed-by: ihse, alanb, kvn, bobv, mchung
This commit is contained in:
Mark Reinhold 2019-10-29 08:26:55 -07:00
parent 72b3f81dd4
commit d83df45396
33 changed files with 848 additions and 45 deletions

View file

@ -60,12 +60,6 @@
#include "jfr/jfr.hpp"
#endif
// Note: This is a special bug reporting site for the JVM
#ifdef VENDOR_URL_VM_BUG
# define DEFAULT_VENDOR_URL_BUG VENDOR_URL_VM_BUG
#else
# define DEFAULT_VENDOR_URL_BUG "http://bugreport.java.com/bugreport/crash.jsp"
#endif
#define DEFAULT_JAVA_LAUNCHER "generic"
char* Arguments::_jvm_flags_file = NULL;
@ -80,7 +74,7 @@ size_t Arguments::_conservative_max_heap_alignment = 0;
Arguments::Mode Arguments::_mode = _mixed;
bool Arguments::_java_compiler = false;
bool Arguments::_xdebug_mode = false;
const char* Arguments::_java_vendor_url_bug = DEFAULT_VENDOR_URL_BUG;
const char* Arguments::_java_vendor_url_bug = NULL;
const char* Arguments::_sun_java_launcher = DEFAULT_JAVA_LAUNCHER;
bool Arguments::_sun_java_launcher_is_altjvm = false;
@ -1422,12 +1416,16 @@ bool Arguments::add_property(const char* prop, PropertyWriteable writeable, Prop
os::free(old_java_command);
}
} else if (strcmp(key, "java.vendor.url.bug") == 0) {
// If this property is set on the command line then its value will be
// displayed in VM error logs as the URL at which to submit such logs.
// Normally the URL displayed in error logs is different from the value
// of this system property, so a different property should have been
// used here, but we leave this as-is in case someone depends upon it.
const char* old_java_vendor_url_bug = _java_vendor_url_bug;
// save it in _java_vendor_url_bug, so JVM fatal error handler can access
// its value without going through the property list or making a Java call.
_java_vendor_url_bug = os::strdup_check_oom(value, mtArguments);
if (old_java_vendor_url_bug != DEFAULT_VENDOR_URL_BUG) {
assert(old_java_vendor_url_bug != NULL, "_java_vendor_url_bug is NULL");
if (old_java_vendor_url_bug != NULL) {
os::free((void *)old_java_vendor_url_bug);
}
}
@ -2185,7 +2183,8 @@ Arguments::ArgsRange Arguments::parse_memory_size(const char* s,
// Parse JavaVMInitArgs structure
jint Arguments::parse_vm_init_args(const JavaVMInitArgs *java_tool_options_args,
jint Arguments::parse_vm_init_args(const JavaVMInitArgs *vm_options_args,
const JavaVMInitArgs *java_tool_options_args,
const JavaVMInitArgs *java_options_args,
const JavaVMInitArgs *cmd_line_args) {
bool patch_mod_javabase = false;
@ -2203,9 +2202,15 @@ jint Arguments::parse_vm_init_args(const JavaVMInitArgs *java_tool_options_args,
// Setup flags for mixed which is the default
set_mode_flags(_mixed);
// Parse args structure generated from java.base vm options resource
jint result = parse_each_vm_init_arg(vm_options_args, &patch_mod_javabase, JVMFlag::JIMAGE_RESOURCE);
if (result != JNI_OK) {
return result;
}
// Parse args structure generated from JAVA_TOOL_OPTIONS environment
// variable (if present).
jint result = parse_each_vm_init_arg(java_tool_options_args, &patch_mod_javabase, JVMFlag::ENVIRON_VAR);
result = parse_each_vm_init_arg(java_tool_options_args, &patch_mod_javabase, JVMFlag::ENVIRON_VAR);
if (result != JNI_OK) {
return result;
}
@ -2711,7 +2716,6 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, bool* patch_m
needs_module_property_warning = true;
continue;
}
if (!add_property(tail)) {
return JNI_ENOMEM;
}
@ -3832,16 +3836,19 @@ jint Arguments::parse(const JavaVMInitArgs* initial_cmd_args) {
const char* hotspotrc = ".hotspotrc";
bool settings_file_specified = false;
bool needs_hotspotrc_warning = false;
ScopedVMInitArgs initial_vm_options_args("");
ScopedVMInitArgs initial_java_tool_options_args("env_var='JAVA_TOOL_OPTIONS'");
ScopedVMInitArgs initial_java_options_args("env_var='_JAVA_OPTIONS'");
// Pointers to current working set of containers
JavaVMInitArgs* cur_cmd_args;
JavaVMInitArgs* cur_vm_options_args;
JavaVMInitArgs* cur_java_options_args;
JavaVMInitArgs* cur_java_tool_options_args;
// Containers for modified/expanded options
ScopedVMInitArgs mod_cmd_args("cmd_line_args");
ScopedVMInitArgs mod_vm_options_args("vm_options_args");
ScopedVMInitArgs mod_java_tool_options_args("env_var='JAVA_TOOL_OPTIONS'");
ScopedVMInitArgs mod_java_options_args("env_var='_JAVA_OPTIONS'");
@ -3857,6 +3864,16 @@ jint Arguments::parse(const JavaVMInitArgs* initial_cmd_args) {
return code;
}
// Parse the options in the /java.base/jdk/internal/vm/options resource, if present
char *vmoptions = ClassLoader::lookup_vm_options();
if (vmoptions != NULL) {
code = parse_options_buffer("vm options resource", vmoptions, strlen(vmoptions), &initial_vm_options_args);
FREE_C_HEAP_ARRAY(char, vmoptions);
if (code != JNI_OK) {
return code;
}
}
code = expand_vm_options_as_needed(initial_java_tool_options_args.get(),
&mod_java_tool_options_args,
&cur_java_tool_options_args);
@ -3878,6 +3895,13 @@ jint Arguments::parse(const JavaVMInitArgs* initial_cmd_args) {
return code;
}
code = expand_vm_options_as_needed(initial_vm_options_args.get(),
&mod_vm_options_args,
&cur_vm_options_args);
if (code != JNI_OK) {
return code;
}
const char* flags_file = Arguments::get_jvm_flags_file();
settings_file_specified = (flags_file != NULL);
@ -3915,7 +3939,8 @@ jint Arguments::parse(const JavaVMInitArgs* initial_cmd_args) {
}
// Parse JavaVMInitArgs structure passed in, as well as JAVA_TOOL_OPTIONS and _JAVA_OPTIONS
jint result = parse_vm_init_args(cur_java_tool_options_args,
jint result = parse_vm_init_args(cur_vm_options_args,
cur_java_tool_options_args,
cur_java_options_args,
cur_cmd_args);