diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-10-04 02:43:30 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-10-04 02:43:30 +0000 |
commit | fab7e66131a899fcb1839dbc0564cc84d1a43674 (patch) | |
tree | 696af33567512f9979b5b604b57eca79d174d9b1 | |
parent | cbe3646e683e8d1112ff832cfb74ca2aec006991 (diff) |
thread_pthread.c: precise stack size
* thread_pthread.c (ruby_init_stack): round stack limit to page size
boundary to calculate stack size more precisely. [ruby-dev:46174]
[Bug #7084]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37080 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | thread_pthread.c | 12 |
2 files changed, 16 insertions, 2 deletions
@@ -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; } } |