Thu, 06 May 2010 02:09:18 -0700
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>
1.1 --- a/src/cpu/zero/vm/stack_zero.cpp Wed May 05 05:57:21 2010 -0700 1.2 +++ b/src/cpu/zero/vm/stack_zero.cpp Thu May 06 02:09:18 2010 -0700 1.3 @@ -26,6 +26,11 @@ 1.4 #include "incls/_precompiled.incl" 1.5 #include "incls/_stack_zero.cpp.incl" 1.6 1.7 +int ZeroStack::suggest_size(Thread *thread) const { 1.8 + assert(needs_setup(), "already set up"); 1.9 + return align_size_down(abi_stack_available(thread) / 2, wordSize); 1.10 +} 1.11 + 1.12 void ZeroStack::handle_overflow(TRAPS) { 1.13 JavaThread *thread = (JavaThread *) THREAD; 1.14
2.1 --- a/src/cpu/zero/vm/stack_zero.hpp Wed May 05 05:57:21 2010 -0700 2.2 +++ b/src/cpu/zero/vm/stack_zero.hpp Thu May 06 02:09:18 2010 -0700 2.3 @@ -42,6 +42,8 @@ 2.4 return _base == NULL; 2.5 } 2.6 2.7 + int suggest_size(Thread *thread) const; 2.8 + 2.9 void setup(void *mem, size_t size) { 2.10 assert(needs_setup(), "already set up"); 2.11 assert(!(size & WordAlignmentMask), "unaligned"); 2.12 @@ -67,6 +69,9 @@ 2.13 _sp = new_sp; 2.14 } 2.15 2.16 + int total_words() const { 2.17 + return _top - _base; 2.18 + } 2.19 int available_words() const { 2.20 return _sp - _base; 2.21 } 2.22 @@ -89,6 +94,7 @@ 2.23 int shadow_pages_size() const { 2.24 return _shadow_pages_size; 2.25 } 2.26 + int abi_stack_available(Thread *thread) const; 2.27 2.28 public: 2.29 void overflow_check(int required_words, TRAPS);
3.1 --- a/src/cpu/zero/vm/stack_zero.inline.hpp Wed May 05 05:57:21 2010 -0700 3.2 +++ b/src/cpu/zero/vm/stack_zero.inline.hpp Thu May 06 02:09:18 2010 -0700 3.3 @@ -25,19 +25,24 @@ 3.4 3.5 // This function should match SharkStack::CreateStackOverflowCheck 3.6 inline void ZeroStack::overflow_check(int required_words, TRAPS) { 3.7 - JavaThread *thread = (JavaThread *) THREAD; 3.8 - 3.9 // Check the Zero stack 3.10 - if (required_words > available_words()) { 3.11 + if (available_words() < required_words) { 3.12 handle_overflow(THREAD); 3.13 return; 3.14 } 3.15 3.16 // Check the ABI stack 3.17 - address stack_top = thread->stack_base() - thread->stack_size(); 3.18 - int free_stack = ((address) &stack_top) - stack_top; 3.19 - if (free_stack < shadow_pages_size()) { 3.20 + if (abi_stack_available(THREAD) < 0) { 3.21 handle_overflow(THREAD); 3.22 return; 3.23 } 3.24 } 3.25 + 3.26 +// This method returns the amount of ABI stack available for us 3.27 +// to use under normal circumstances. Note that the returned 3.28 +// value can be negative. 3.29 +inline int ZeroStack::abi_stack_available(Thread *thread) const { 3.30 + int stack_used = thread->stack_base() - (address) &stack_used; 3.31 + int stack_free = thread->stack_size() - stack_used; 3.32 + return stack_free - shadow_pages_size(); 3.33 +}
4.1 --- a/src/cpu/zero/vm/stubGenerator_zero.cpp Wed May 05 05:57:21 2010 -0700 4.2 +++ b/src/cpu/zero/vm/stubGenerator_zero.cpp Thu May 06 02:09:18 2010 -0700 4.3 @@ -51,10 +51,7 @@ 4.4 // Set up the stack if necessary 4.5 bool stack_needs_teardown = false; 4.6 if (stack->needs_setup()) { 4.7 - size_t stack_used = thread->stack_base() - (address) &stack_used; 4.8 - size_t stack_free = thread->stack_size() - stack_used; 4.9 - size_t zero_stack_size = align_size_down(stack_free / 2, wordSize); 4.10 - 4.11 + size_t zero_stack_size = stack->suggest_size(thread); 4.12 stack->setup(alloca(zero_stack_size), zero_stack_size); 4.13 stack_needs_teardown = true; 4.14 }
5.1 --- a/src/share/vm/includeDB_zero Wed May 05 05:57:21 2010 -0700 5.2 +++ b/src/share/vm/includeDB_zero Thu May 06 02:09:18 2010 -0700 5.3 @@ -61,6 +61,7 @@ 5.4 5.5 stack_<arch>.cpp interpreterRuntime.hpp 5.6 stack_<arch>.cpp stack_<arch>.hpp 5.7 +stack_<arch>.cpp stack_<arch>.inline.hpp 5.8 5.9 stubGenerator_<arch>.cpp stack_<arch>.inline.hpp 5.10