--- a/hotspot/src/os/linux/vm/os_linux.cpp Thu Oct 07 15:12:57 2010 -0400
+++ b/hotspot/src/os/linux/vm/os_linux.cpp Thu Oct 07 15:14:41 2010 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -827,8 +827,10 @@
switch (thr_type) {
case os::java_thread:
- // Java threads use ThreadStackSize which default value can be changed with the flag -Xss
- if (JavaThread::stack_size_at_create() > 0) stack_size = JavaThread::stack_size_at_create();
+ // Java threads use ThreadStackSize which default value can be
+ // changed with the flag -Xss
+ assert (JavaThread::stack_size_at_create() > 0, "this should be set");
+ stack_size = JavaThread::stack_size_at_create();
break;
case os::compiler_thread:
if (CompilerThreadStackSize > 0) {
@@ -3922,12 +3924,21 @@
Linux::signal_sets_init();
Linux::install_signal_handlers();
+ // Check minimum allowable stack size for thread creation and to initialize
+ // the java system classes, including StackOverflowError - depends on page
+ // size. Add a page for compiler2 recursion in main thread.
+ // Add in 2*BytesPerWord times page size to account for VM stack during
+ // class initialization depending on 32 or 64 bit VM.
+ os::Linux::min_stack_allowed = MAX2(os::Linux::min_stack_allowed,
+ (size_t)(StackYellowPages+StackRedPages+StackShadowPages+
+ 2*BytesPerWord COMPILER2_PRESENT(+1)) * Linux::page_size());
+
size_t threadStackSizeInBytes = ThreadStackSize * K;
if (threadStackSizeInBytes != 0 &&
- threadStackSizeInBytes < Linux::min_stack_allowed) {
+ threadStackSizeInBytes < os::Linux::min_stack_allowed) {
tty->print_cr("\nThe stack size specified is too small, "
"Specify at least %dk",
- Linux::min_stack_allowed / K);
+ os::Linux::min_stack_allowed/ K);
return JNI_ERR;
}
@@ -4839,7 +4850,7 @@
// Next, demultiplex/decode time arguments
timespec absTime;
- if (time < 0) { // don't wait at all
+ if (time < 0 || (isAbsolute && time == 0) ) { // don't wait at all
return;
}
if (time > 0) {
--- a/hotspot/src/os/solaris/vm/os_solaris.cpp Thu Oct 07 15:12:57 2010 -0400
+++ b/hotspot/src/os/solaris/vm/os_solaris.cpp Thu Oct 07 15:14:41 2010 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -4878,18 +4878,17 @@
// Check minimum allowable stack size for thread creation and to initialize
// the java system classes, including StackOverflowError - depends on page
// size. Add a page for compiler2 recursion in main thread.
- // Add in BytesPerWord times page size to account for VM stack during
+ // Add in 2*BytesPerWord times page size to account for VM stack during
// class initialization depending on 32 or 64 bit VM.
- guarantee((Solaris::min_stack_allowed >=
- (StackYellowPages+StackRedPages+StackShadowPages+BytesPerWord
- COMPILER2_PRESENT(+1)) * page_size),
- "need to increase Solaris::min_stack_allowed on this platform");
+ os::Solaris::min_stack_allowed = MAX2(os::Solaris::min_stack_allowed,
+ (size_t)(StackYellowPages+StackRedPages+StackShadowPages+
+ 2*BytesPerWord COMPILER2_PRESENT(+1)) * page_size);
size_t threadStackSizeInBytes = ThreadStackSize * K;
if (threadStackSizeInBytes != 0 &&
- threadStackSizeInBytes < Solaris::min_stack_allowed) {
+ threadStackSizeInBytes < os::Solaris::min_stack_allowed) {
tty->print_cr("\nThe stack size specified is too small, Specify at least %dk",
- Solaris::min_stack_allowed/K);
+ os::Solaris::min_stack_allowed/K);
return JNI_ERR;
}
@@ -5837,7 +5836,7 @@
// First, demultiplex/decode time arguments
timespec absTime;
- if (time < 0) { // don't wait at all
+ if (time < 0 || (isAbsolute && time == 0) ) { // don't wait at all
return;
}
if (time > 0) {
--- a/hotspot/src/os/windows/vm/os_windows.cpp Thu Oct 07 15:12:57 2010 -0400
+++ b/hotspot/src/os/windows/vm/os_windows.cpp Thu Oct 07 15:14:41 2010 -0400
@@ -3311,7 +3311,6 @@
}
}
-
// this is called _after_ the global arguments have been parsed
jint os::init_2(void) {
// Allocate a single page and mark it as readable for safepoint polling
@@ -3390,6 +3389,21 @@
actual_reserve_size = default_reserve_size;
}
+ // Check minimum allowable stack size for thread creation and to initialize
+ // the java system classes, including StackOverflowError - depends on page
+ // size. Add a page for compiler2 recursion in main thread.
+ // Add in 2*BytesPerWord times page size to account for VM stack during
+ // class initialization depending on 32 or 64 bit VM.
+ size_t min_stack_allowed =
+ (size_t)(StackYellowPages+StackRedPages+StackShadowPages+
+ 2*BytesPerWord COMPILER2_PRESENT(+1)) * os::vm_page_size();
+ if (actual_reserve_size < min_stack_allowed) {
+ tty->print_cr("\nThe stack size specified is too small, "
+ "Specify at least %dk",
+ min_stack_allowed / K);
+ return JNI_ERR;
+ }
+
JavaThread::set_stack_size_at_create(stack_commit_size);
// Calculate theoretical max. size of Threads to guard gainst artifical
@@ -3992,7 +4006,7 @@
if (time < 0) { // don't wait
return;
}
- else if (time == 0) {
+ else if (time == 0 && !isAbsolute) {
time = INFINITE;
}
else if (isAbsolute) {
--- a/hotspot/src/share/vm/runtime/arguments.cpp Thu Oct 07 15:12:57 2010 -0400
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Thu Oct 07 15:14:41 2010 -0400
@@ -1663,7 +1663,8 @@
bool status = true;
status = status && verify_min_value(StackYellowPages, 1, "StackYellowPages");
status = status && verify_min_value(StackRedPages, 1, "StackRedPages");
- status = status && verify_min_value(StackShadowPages, 1, "StackShadowPages");
+ // greater stack shadow pages can't generate instruction to bang stack
+ status = status && verify_interval(StackShadowPages, 1, 50, "StackShadowPages");
return status;
}
--- a/hotspot/src/share/vm/utilities/exceptions.cpp Thu Oct 07 15:12:57 2010 -0400
+++ b/hotspot/src/share/vm/utilities/exceptions.cpp Thu Oct 07 15:14:41 2010 -0400
@@ -61,6 +61,18 @@
ShouldNotReachHere();
}
+#ifdef ASSERT
+ // Check for trying to throw stack overflow before initialization is complete
+ // to prevent infinite recursion trying to initialize stack overflow without
+ // adequate stack space.
+ // This can happen with stress testing a large value of StackShadowPages
+ if (h_exception()->klass() == SystemDictionary::StackOverflowError_klass()) {
+ instanceKlass* ik = instanceKlass::cast(h_exception->klass());
+ assert(ik->is_initialized(),
+ "need to increase min_stack_allowed calculation");
+ }
+#endif // ASSERT
+
if (thread->is_VM_thread()
|| thread->is_Compiler_thread() ) {
// We do not care what kind of exception we get for the vm-thread or a thread which
@@ -91,7 +103,6 @@
thread->set_pending_exception(Universe::vm_exception(), file, line);
return true;
}
-
return false;
}
@@ -193,6 +204,7 @@
klassOop k = SystemDictionary::StackOverflowError_klass();
oop e = instanceKlass::cast(k)->allocate_instance(CHECK);
exception = Handle(THREAD, e); // fill_in_stack trace does gc
+ assert(instanceKlass::cast(k)->is_initialized(), "need to increase min_stack_allowed calculation");
if (StackTraceInThrowable) {
java_lang_Throwable::fill_in_stack_trace(exception);
}