зеркало из https://github.com/github/ruby.git
* thread_pthread.c (ruby_init_stack): Avoid using uninitialized value.
stackaddr and size are not set if get_stack() fails. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40102 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
112a3b1fca
Коммит
360edb1c04
|
@ -1,3 +1,8 @@
|
||||||
|
Wed Apr 3 17:25:31 2013 Yuki Yugui Sonoda <yugui@google.com>
|
||||||
|
|
||||||
|
* thread_pthread.c (ruby_init_stack): Avoid using uninitialized value.
|
||||||
|
stackaddr and size are not set if get_stack() fails.
|
||||||
|
|
||||||
Thu Apr 4 16:55:08 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Thu Apr 4 16:55:08 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* struct.c (make_struct): avoid inadvertent symbol creation.
|
* struct.c (make_struct): avoid inadvertent symbol creation.
|
||||||
|
|
|
@ -588,6 +588,23 @@ static struct {
|
||||||
extern void *STACK_END_ADDRESS;
|
extern void *STACK_END_ADDRESS;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
enum {
|
||||||
|
RUBY_STACK_SPACE_LIMIT = 1024 * 1024, /* 1024KB */
|
||||||
|
RUBY_STACK_SPACE_RATIO = 5
|
||||||
|
};
|
||||||
|
|
||||||
|
static size_t
|
||||||
|
space_size(size_t stack_size)
|
||||||
|
{
|
||||||
|
size_t space_size = stack_size / RUBY_STACK_SPACE_RATIO;
|
||||||
|
if (space_size > RUBY_STACK_SPACE_LIMIT) {
|
||||||
|
return RUBY_STACK_SPACE_LIMIT;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return space_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#undef ruby_init_stack
|
#undef ruby_init_stack
|
||||||
/* Set stack bottom of Ruby implementation.
|
/* Set stack bottom of Ruby implementation.
|
||||||
*
|
*
|
||||||
|
@ -618,13 +635,21 @@ ruby_init_stack(volatile VALUE *addr
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
size_t size = 0;
|
#if defined(PTHREAD_STACK_DEFAULT)
|
||||||
size_t space = 0;
|
# if PTHREAD_STACK_DEFAULT < RUBY_STACK_SPACE*5
|
||||||
|
# error "PTHREAD_STACK_DEFAULT is too small"
|
||||||
|
# endif
|
||||||
|
size_t size = PTHREAD_STACK_DEFAULT;
|
||||||
|
#else
|
||||||
|
size_t size = RUBY_VM_THREAD_VM_STACK_SIZE;
|
||||||
|
#endif
|
||||||
|
size_t space = space_size(size);
|
||||||
#if MAINSTACKADDR_AVAILABLE
|
#if MAINSTACKADDR_AVAILABLE
|
||||||
void* stackaddr;
|
void* stackaddr;
|
||||||
STACK_GROW_DIR_DETECTION;
|
STACK_GROW_DIR_DETECTION;
|
||||||
get_stack(&stackaddr, &size);
|
if (get_stack(&stackaddr, &size) == 0) {
|
||||||
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;
|
native_main_thread.stack_maxsize = size - space;
|
||||||
#elif defined(HAVE_GETRLIMIT)
|
#elif defined(HAVE_GETRLIMIT)
|
||||||
int pagesize = getpagesize();
|
int pagesize = getpagesize();
|
||||||
|
@ -831,23 +856,6 @@ use_cached_thread(rb_thread_t *th)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum {
|
|
||||||
RUBY_STACK_SPACE_LIMIT = 1024 * 1024, /* 1024KB */
|
|
||||||
RUBY_STACK_SPACE_RATIO = 5
|
|
||||||
};
|
|
||||||
|
|
||||||
static size_t
|
|
||||||
space_size(size_t stack_size)
|
|
||||||
{
|
|
||||||
size_t space_size = stack_size / RUBY_STACK_SPACE_RATIO;
|
|
||||||
if (space_size > RUBY_STACK_SPACE_LIMIT) {
|
|
||||||
return RUBY_STACK_SPACE_LIMIT;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return space_size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
native_thread_create(rb_thread_t *th)
|
native_thread_create(rb_thread_t *th)
|
||||||
{
|
{
|
||||||
|
|
Загрузка…
Ссылка в новой задаче