* thread_pthread.c (native_thread_init_stack): use get_stack.

patched by KOSAKI Motohiro [ruby-dev:40309]

* thread_pthread.c (ruby_init_stack): use get_stack
  on platforms which have pthread_attr_get_np.
  (FreeBSD, DragonFlyBSD and NetBSD)
  This is because FreeBSD and DragonFly BSD must use
  pthread_attr_get_np to get stack size of main thread,
  but Mac OS X and Linux with LinuxThreads must use getrlimit.
  <http://www.nminoru.jp/~nminoru/programming/stackoverflow_handling.html>
  <http://d.hatena.ne.jp/nurse/20100204>

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26572 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
naruse 2010-02-04 07:17:03 +00:00
parent 669862a416
commit b323b86b6b
3 changed files with 32 additions and 24 deletions

View file

@ -12,9 +12,6 @@
#ifdef THREAD_SYSTEM_DEPENDENT_IMPLEMENTATION
#include "gc.h"
#if defined(__FreeBSD__) || defined(__DragonFly)
#include <pthread_np.h>
#endif
#ifdef HAVE_SYS_RESOURCE_H
#include <sys/resource.h>
@ -234,10 +231,10 @@ get_stack(void **addr, size_t *size)
CHECK_ERR(pthread_attr_getstacksize(&attr, size));
# endif
CHECK_ERR(pthread_attr_getguardsize(&attr, &guard));
*size -= guard;
# ifndef HAVE_PTHREAD_GETATTR_NP
pthread_attr_destroy(&attr);
# endif
size -= guard;
#elif defined HAVE_PTHREAD_GET_STACKADDR_NP && defined HAVE_PTHREAD_GET_STACKSIZE_NP
pthread_t th = pthread_self();
*addr = pthread_get_stackaddr_np(th);
@ -296,14 +293,11 @@ ruby_init_stack(volatile VALUE *addr
}
#endif
{
size_t size = 0, space = 0;
#if defined(__FreeBSD__) || defined(__DragonFly)
pthread_attr_t attr;
if (pthread_attr_init(&attr) == 0) {
if (pthread_attr_get_np(native_main_thread.id, &attr) == 0)
pthread_attr_getstacksize(&attr, &size);
pthread_attr_destroy(&attr);
}
size_t size = 0;
size_t space = 0;
#if defined(HAVE_PTHREAD_ATTR_GET_NP)
void* addr;
get_stack(&addr, &size);
#elif defined(HAVE_GETRLIMIT)
struct rlimit rlim;
if (getrlimit(RLIMIT_STACK, &rlim) == 0) {
@ -328,17 +322,14 @@ native_thread_init_stack(rb_thread_t *th)
th->machine_stack_maxsize = native_main_thread.stack_maxsize;
}
else {
#ifdef HAVE_PTHREAD_GETATTR_NP
pthread_attr_t attr;
#ifdef STACKADDR_AVAILABLE
void *start;
CHECK_ERR(pthread_getattr_np(curr, &attr));
# if defined HAVE_PTHREAD_ATTR_GETSTACK
CHECK_ERR(pthread_attr_getstack(&attr, &start, &th->machine_stack_maxsize));
# elif defined HAVE_PTHREAD_ATTR_GETSTACKSIZE && defined HAVE_PTHREAD_ATTR_GETSTACKADDR
CHECK_ERR(pthread_attr_getstackaddr(&attr, &start));
CHECK_ERR(pthread_attr_getstacksize(&attr, &th->machine_stack_maxsize));
# endif
th->machine_stack_start = start;
size_t size;
if (get_stack(&start, &size) == 0) {
th->machine_stack_start = start;
th->machine_stack_maxsize = size;
}
#else
rb_raise(rb_eNotImpError, "ruby engine can initialize only in the main thread");
#endif