aboutsummaryrefslogtreecommitdiffstats
path: root/thread_pthread.c
diff options
context:
space:
mode:
authorkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-07-04 13:27:31 +0000
committerkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-07-04 13:27:31 +0000
commite6d42f34e2cbd2c6a9133d4e972ceda58af43bc0 (patch)
treee4c366e34501a8fbad7514ebf81916f052bacf07 /thread_pthread.c
parent1e8adda1fc192247a09c29c5806eb647e427028a (diff)
downloadruby-e6d42f34e2cbd2c6a9133d4e972ceda58af43bc0.tar.gz
* thread_pthread.c (get_stack): For NetBSD/FreeBSD, use
pthread_attr_getstack() if possible. and, remove an assumption of stack growing direction. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@32403 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'thread_pthread.c')
-rw-r--r--thread_pthread.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/thread_pthread.c b/thread_pthread.c
index abb547defb..41d6399c3c 100644
--- a/thread_pthread.c
+++ b/thread_pthread.c
@@ -479,9 +479,14 @@ get_stack(void **addr, size_t *size)
# elif defined HAVE_PTHREAD_ATTR_GET_NP /* FreeBSD, DragonFly BSD, NetBSD */
CHECK_ERR(pthread_attr_init(&attr));
CHECK_ERR(pthread_attr_get_np(pthread_self(), &attr));
+# ifdef HAVE_PTHREAD_ATTR_GETSTACK
+ CHECK_ERR(pthread_attr_getstack(&attr, addr, size));
+ STACK_DIR_UPPER((void)0, (void)(*addr = (char *)*addr + *size));
+# else
CHECK_ERR(pthread_attr_getstackaddr(&attr, addr));
CHECK_ERR(pthread_attr_getstacksize(&attr, size));
- *addr = (char *)*addr + *size;
+ STACK_DIR_UPPER((void)0, (void)(*addr = (char *)*addr + *size));
+# endif
# else /* MacOS X */
pthread_t th = pthread_self();
*addr = pthread_get_stackaddr_np(th);