1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* 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

@ -1,8 +1,22 @@
Thu Feb 4 15:47:27 2010 NARUSE, Yui <naruse@ruby-lang.org>
* 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>
Thu Feb 4 09:55:38 2010 NARUSE, Yui <naruse@ruby-lang.org>
* configure.in: FreeBSD, DragonFly BSD and Mac OS X needs
* configure.in: FreeBSD, DragonFly BSD and OpenBSD needs
pthread_np.h to use pthread_*_np functions.
Mac OS X's pthread_*_np also depend sys/signal.h,
OpenBSD's pthread_*_np also depend sys/signal.h,
but it is included at signal.h via vm_core.h via thread.c.
Thu Feb 4 08:15:53 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>

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

View file

@ -12,6 +12,9 @@
#define RUBY_THREAD_PTHREAD_H
#include <pthread.h>
#ifdef HAVE_PTHREAD_NP_H
#include <pthread_np.h>
#endif
typedef pthread_t rb_thread_id_t;
typedef pthread_mutex_t rb_thread_lock_t;
typedef pthread_cond_t rb_thread_cond_t;