6950178: Zero stack improvements
Summary: Moves the logic for determining the size of the Zero stack into the ZeroStack class.
Reviewed-by: twisti
Contributed-by: Gary Benson <gbenson@redhat.com>
--- a/hotspot/src/cpu/zero/vm/stack_zero.cpp Wed May 05 05:57:21 2010 -0700
+++ b/hotspot/src/cpu/zero/vm/stack_zero.cpp Thu May 06 02:09:18 2010 -0700
@@ -26,6 +26,11 @@
#include "incls/_precompiled.incl"
#include "incls/_stack_zero.cpp.incl"
+int ZeroStack::suggest_size(Thread *thread) const {
+ assert(needs_setup(), "already set up");
+ return align_size_down(abi_stack_available(thread) / 2, wordSize);
+}
+
void ZeroStack::handle_overflow(TRAPS) {
JavaThread *thread = (JavaThread *) THREAD;
--- a/hotspot/src/cpu/zero/vm/stack_zero.hpp Wed May 05 05:57:21 2010 -0700
+++ b/hotspot/src/cpu/zero/vm/stack_zero.hpp Thu May 06 02:09:18 2010 -0700
@@ -42,6 +42,8 @@
return _base == NULL;
}
+ int suggest_size(Thread *thread) const;
+
void setup(void *mem, size_t size) {
assert(needs_setup(), "already set up");
assert(!(size & WordAlignmentMask), "unaligned");
@@ -67,6 +69,9 @@
_sp = new_sp;
}
+ int total_words() const {
+ return _top - _base;
+ }
int available_words() const {
return _sp - _base;
}
@@ -89,6 +94,7 @@
int shadow_pages_size() const {
return _shadow_pages_size;
}
+ int abi_stack_available(Thread *thread) const;
public:
void overflow_check(int required_words, TRAPS);
--- a/hotspot/src/cpu/zero/vm/stack_zero.inline.hpp Wed May 05 05:57:21 2010 -0700
+++ b/hotspot/src/cpu/zero/vm/stack_zero.inline.hpp Thu May 06 02:09:18 2010 -0700
@@ -25,19 +25,24 @@
// This function should match SharkStack::CreateStackOverflowCheck
inline void ZeroStack::overflow_check(int required_words, TRAPS) {
- JavaThread *thread = (JavaThread *) THREAD;
-
// Check the Zero stack
- if (required_words > available_words()) {
+ if (available_words() < required_words) {
handle_overflow(THREAD);
return;
}
// Check the ABI stack
- address stack_top = thread->stack_base() - thread->stack_size();
- int free_stack = ((address) &stack_top) - stack_top;
- if (free_stack < shadow_pages_size()) {
+ if (abi_stack_available(THREAD) < 0) {
handle_overflow(THREAD);
return;
}
}
+
+// This method returns the amount of ABI stack available for us
+// to use under normal circumstances. Note that the returned
+// value can be negative.
+inline int ZeroStack::abi_stack_available(Thread *thread) const {
+ int stack_used = thread->stack_base() - (address) &stack_used;
+ int stack_free = thread->stack_size() - stack_used;
+ return stack_free - shadow_pages_size();
+}
--- a/hotspot/src/cpu/zero/vm/stubGenerator_zero.cpp Wed May 05 05:57:21 2010 -0700
+++ b/hotspot/src/cpu/zero/vm/stubGenerator_zero.cpp Thu May 06 02:09:18 2010 -0700
@@ -51,10 +51,7 @@
// Set up the stack if necessary
bool stack_needs_teardown = false;
if (stack->needs_setup()) {
- size_t stack_used = thread->stack_base() - (address) &stack_used;
- size_t stack_free = thread->stack_size() - stack_used;
- size_t zero_stack_size = align_size_down(stack_free / 2, wordSize);
-
+ size_t zero_stack_size = stack->suggest_size(thread);
stack->setup(alloca(zero_stack_size), zero_stack_size);
stack_needs_teardown = true;
}
--- a/hotspot/src/share/vm/includeDB_zero Wed May 05 05:57:21 2010 -0700
+++ b/hotspot/src/share/vm/includeDB_zero Thu May 06 02:09:18 2010 -0700
@@ -61,6 +61,7 @@
stack_<arch>.cpp interpreterRuntime.hpp
stack_<arch>.cpp stack_<arch>.hpp
+stack_<arch>.cpp stack_<arch>.inline.hpp
stubGenerator_<arch>.cpp stack_<arch>.inline.hpp