提交 e401acac 编写于 作者: J johnc

6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash

Summary: Interval checking is now being performed on the values passed in for these two flags. The current acceptable range for RefDiscoveryPolicy is [0..1], and for TLABWasteTargetPercent it is [1..100].
Reviewed-by: apetrusenko, ysr
上级 02c3152b
...@@ -175,6 +175,7 @@ arguments.cpp jvmtiExport.hpp ...@@ -175,6 +175,7 @@ arguments.cpp jvmtiExport.hpp
arguments.cpp management.hpp arguments.cpp management.hpp
arguments.cpp oop.inline.hpp arguments.cpp oop.inline.hpp
arguments.cpp os_<os_family>.inline.hpp arguments.cpp os_<os_family>.inline.hpp
arguments.cpp referenceProcessor.hpp
arguments.cpp universe.inline.hpp arguments.cpp universe.inline.hpp
arguments.cpp vm_version_<arch>.hpp arguments.cpp vm_version_<arch>.hpp
......
...@@ -263,10 +263,13 @@ class ReferenceProcessor : public CHeapObj { ...@@ -263,10 +263,13 @@ class ReferenceProcessor : public CHeapObj {
int parallel_gc_threads = 1, int parallel_gc_threads = 1,
bool mt_processing = false, bool mt_processing = false,
bool discovered_list_needs_barrier = false); bool discovered_list_needs_barrier = false);
// RefDiscoveryPolicy values // RefDiscoveryPolicy values
enum { enum DiscoveryPolicy {
ReferenceBasedDiscovery = 0, ReferenceBasedDiscovery = 0,
ReferentBasedDiscovery = 1 ReferentBasedDiscovery = 1,
DiscoveryPolicyMin = ReferenceBasedDiscovery,
DiscoveryPolicyMax = ReferentBasedDiscovery
}; };
static void init_statics(); static void init_statics();
......
...@@ -1487,6 +1487,20 @@ bool Arguments::created_by_java_launcher() { ...@@ -1487,6 +1487,20 @@ bool Arguments::created_by_java_launcher() {
//=========================================================================================================== //===========================================================================================================
// Parsing of main arguments // Parsing of main arguments
bool Arguments::verify_interval(uintx val, uintx min,
uintx max, const char* name) {
// Returns true iff value is in the inclusive interval [min..max]
// false, otherwise.
if (val >= min && val <= max) {
return true;
}
jio_fprintf(defaultStream::error_stream(),
"%s of " UINTX_FORMAT " is invalid; must be between " UINTX_FORMAT
" and " UINTX_FORMAT "\n",
name, val, min, max);
return false;
}
bool Arguments::verify_percentage(uintx value, const char* name) { bool Arguments::verify_percentage(uintx value, const char* name) {
if (value <= 100) { if (value <= 100) {
return true; return true;
...@@ -1723,6 +1737,16 @@ bool Arguments::check_vm_args_consistency() { ...@@ -1723,6 +1737,16 @@ bool Arguments::check_vm_args_consistency() {
status = false; status = false;
} }
status = status && verify_interval(RefDiscoveryPolicy,
ReferenceProcessor::DiscoveryPolicyMin,
ReferenceProcessor::DiscoveryPolicyMax,
"RefDiscoveryPolicy");
// Limit the lower bound of this flag to 1 as it is used in a division
// expression.
status = status && verify_interval(TLABWasteTargetPercent,
1, 100, "TLABWasteTargetPercent");
return status; return status;
} }
......
...@@ -336,6 +336,8 @@ class Arguments : AllStatic { ...@@ -336,6 +336,8 @@ class Arguments : AllStatic {
static bool is_bad_option(const JavaVMOption* option, jboolean ignore) { static bool is_bad_option(const JavaVMOption* option, jboolean ignore) {
return is_bad_option(option, ignore, NULL); return is_bad_option(option, ignore, NULL);
} }
static bool verify_interval(uintx val, uintx min,
uintx max, const char* name);
static bool verify_percentage(uintx value, const char* name); static bool verify_percentage(uintx value, const char* name);
static void describe_range_error(ArgsRange errcode); static void describe_range_error(ArgsRange errcode);
static ArgsRange check_memory_size(julong size, julong min_size); static ArgsRange check_memory_size(julong size, julong min_size);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册