From 53953eee7c837541ad95e92bcda6ea3fd7f9ff34 Mon Sep 17 00:00:00 2001 From: nobu Date: Mon, 18 Nov 2013 13:47:12 +0000 Subject: thread_pthread.c: use get_main_stack properly * thread_pthread.c (ruby_init_stack): set stack_start properly by get_main_stack() if possible. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43706 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- thread_pthread.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) (limited to 'thread_pthread.c') diff --git a/thread_pthread.c b/thread_pthread.c index 10ef8daab3..57daa3b45d 100644 --- a/thread_pthread.c +++ b/thread_pthread.c @@ -485,7 +485,7 @@ static rb_thread_t *register_cached_thread_and_wait(void); #elif defined HAVE_PTHREAD_GET_STACKADDR_NP && defined HAVE_PTHREAD_GET_STACKSIZE_NP #define STACKADDR_AVAILABLE 1 #undef MAINSTACKADDR_AVAILABLE -#define MAINSTACKADDR_AVAILABLE 0 +#define MAINSTACKADDR_AVAILABLE 1 void *pthread_get_stackaddr_np(pthread_t); size_t pthread_get_stacksize_np(pthread_t); #elif defined HAVE_THR_STKSEGMENT || defined HAVE_PTHREAD_STACKSEG_NP @@ -676,8 +676,21 @@ ruby_init_stack(volatile VALUE *addr (VALUE*)bsp < native_main_thread.register_stack_start) { native_main_thread.register_stack_start = (VALUE*)bsp; } +#endif +#if MAINSTACKADDR_AVAILABLE + if (native_main_thread.stack_maxsize) return; + { + void* stackaddr; + size_t size; + if (get_main_stack(&stackaddr, &size) == 0) { + native_main_thread.stack_maxsize = size; + native_main_thread.stack_start = stackaddr; + return; + } + } #endif { +#if defined(HAVE_GETRLIMIT) #if defined(PTHREAD_STACK_DEFAULT) # if PTHREAD_STACK_DEFAULT < RUBY_STACK_SPACE*5 # error "PTHREAD_STACK_DEFAULT is too small" @@ -686,15 +699,7 @@ ruby_init_stack(volatile VALUE *addr #else size_t size = RUBY_VM_THREAD_VM_STACK_SIZE; #endif - size_t space = space_size(size); -#if MAINSTACKADDR_AVAILABLE - void* stackaddr; - STACK_GROW_DIR_DETECTION; - if (get_main_stack(&stackaddr, &size) == 0) { - space = STACK_DIR_UPPER((char *)addr - (char *)stackaddr, (char *)stackaddr - (char *)addr); - } - native_main_thread.stack_maxsize = size - space; -#elif defined(HAVE_GETRLIMIT) + size_t space; int pagesize = getpagesize(); struct rlimit rlim; STACK_GROW_DIR_DETECTION; -- cgit v1.2.3