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:
parent
669862a416
commit
b323b86b6b
3 changed files with 32 additions and 24 deletions
18
ChangeLog
18
ChangeLog
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue