aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-02-04 07:17:03 +0000
committernaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-02-04 07:17:03 +0000
commitb323b86b6b3a7283617b72b45521c554dba930c9 (patch)
tree8a245b8c30c894a66cb5ef29fb2237a93aa15c0c
parent669862a416ce92dfee6b677e35144e7b8db1cb19 (diff)
downloadruby-b323b86b6b3a7283617b72b45521c554dba930c9.tar.gz
* 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
-rw-r--r--ChangeLog18
-rw-r--r--thread_pthread.c35
-rw-r--r--thread_pthread.h3
3 files changed, 32 insertions, 24 deletions
diff --git a/ChangeLog b/ChangeLog
index 478a0b49c3..072b5cd281 100644
--- a/ChangeLog
+++ b/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>
diff --git a/thread_pthread.c b/thread_pthread.c
index d2d8b04df1..8cfc637735 100644
--- a/thread_pthread.c
+++ b/thread_pthread.c
@@ -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
diff --git a/thread_pthread.h b/thread_pthread.h
index 04254d7312..94658d4e0c 100644
--- a/thread_pthread.h
+++ b/thread_pthread.h
@@ -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;