mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
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
This commit is contained in:
parent
cbe3646e68
commit
fab7e66131
2 changed files with 16 additions and 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>
|
Wed Oct 3 19:51:57 2012 Narihiro Nakamura <authornari@gmail.com>
|
||||||
|
|
||||||
* gc.c: Use the non-recursive marking instead of recursion. The
|
* gc.c: Use the non-recursive marking instead of recursion. The
|
||||||
|
|
|
@ -649,14 +649,22 @@ ruby_init_stack(volatile VALUE *addr
|
||||||
STACK_GROW_DIR_DETECTION;
|
STACK_GROW_DIR_DETECTION;
|
||||||
get_stack(&stackaddr, &size);
|
get_stack(&stackaddr, &size);
|
||||||
space = STACK_DIR_UPPER((char *)addr - (char *)stackaddr, (char *)stackaddr - (char *)addr);
|
space = STACK_DIR_UPPER((char *)addr - (char *)stackaddr, (char *)stackaddr - (char *)addr);
|
||||||
|
native_main_thread.stack_maxsize = size - space;
|
||||||
#elif defined(HAVE_GETRLIMIT)
|
#elif defined(HAVE_GETRLIMIT)
|
||||||
|
int pagesize = getpagesize();
|
||||||
struct rlimit rlim;
|
struct rlimit rlim;
|
||||||
if (getrlimit(RLIMIT_STACK, &rlim) == 0) {
|
if (getrlimit(RLIMIT_STACK, &rlim) == 0) {
|
||||||
size = (size_t)rlim.rlim_cur;
|
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
|
#endif
|
||||||
native_main_thread.stack_maxsize = size - space;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue