summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--thread_pthread.c12
2 files changed, 16 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 27e60040e8..a2aa5c12bd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Thu Oct 4 11:43:28 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * thread_pthread.c (ruby_init_stack): round stack limit to page size
+ boundary to calculate stack size more precisely. [ruby-dev:46174]
+ [Bug #7084]
+
Wed Oct 3 19:51:57 2012 Narihiro Nakamura <authornari@gmail.com>
* gc.c: Use the non-recursive marking instead of recursion. The
diff --git a/thread_pthread.c b/thread_pthread.c
index 291b2f72a4..01ad0ce4b5 100644
--- a/thread_pthread.c
+++ b/thread_pthread.c
@@ -649,14 +649,22 @@ ruby_init_stack(volatile VALUE *addr
STACK_GROW_DIR_DETECTION;
get_stack(&stackaddr, &size);
space = STACK_DIR_UPPER((char *)addr - (char *)stackaddr, (char *)stackaddr - (char *)addr);
+ native_main_thread.stack_maxsize = size - space;
#elif defined(HAVE_GETRLIMIT)
+ int pagesize = getpagesize();
struct rlimit rlim;
if (getrlimit(RLIMIT_STACK, &rlim) == 0) {
size = (size_t)rlim.rlim_cur;
}
- space = size > 5 * 1024 * 1024 ? 1024 * 1024 : size / 5;
+ addr = native_main_thread.stack_start;
+ if (IS_STACK_DIR_UPPER()) {
+ space = ((size_t)((char *)addr + size) / pagesize) * pagesize - (size_t)addr;
+ }
+ else {
+ space = (size_t)addr - ((size_t)((char *)addr - size) / pagesize + 1) * pagesize;
+ }
+ native_main_thread.stack_maxsize = space;
#endif
- native_main_thread.stack_maxsize = size - space;
}
}