changeset 1511:348346af6676

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>
author twisti
date Thu, 06 May 2010 02:09:18 -0700
parents d6e880569997
children 6cfbdb113e52
files src/cpu/zero/vm/stack_zero.cpp src/cpu/zero/vm/stack_zero.hpp src/cpu/zero/vm/stack_zero.inline.hpp src/cpu/zero/vm/stubGenerator_zero.cpp src/share/vm/includeDB_zero
diffstat 5 files changed, 24 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/cpu/zero/vm/stack_zero.cpp	Wed May 05 05:57:21 2010 -0700
+++ b/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/src/cpu/zero/vm/stack_zero.hpp	Wed May 05 05:57:21 2010 -0700
+++ b/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/src/cpu/zero/vm/stack_zero.inline.hpp	Wed May 05 05:57:21 2010 -0700
+++ b/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/src/cpu/zero/vm/stubGenerator_zero.cpp	Wed May 05 05:57:21 2010 -0700
+++ b/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/src/share/vm/includeDB_zero	Wed May 05 05:57:21 2010 -0700
+++ b/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