summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkanemoto <kanemoto@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-06-29 17:32:30 +0000
committerkanemoto <kanemoto@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-06-29 17:32:30 +0000
commit586720f3113219206bf7b15f956683bdad794402 (patch)
tree346c639bfd9aca7afb457a8227df0ece6b0de4dd
parent921f484775ea2a83462f354b8fff7fc1d5fe1297 (diff)
* thread_pthread.c (get_stack): use pthread_getthrds_np() for AIX.
* configure.in: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_2@28487 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog6
-rw-r--r--configure.in2
-rw-r--r--thread_pthread.c12
3 files changed, 19 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 18f5ee828c..f144b22ccb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Wed Jun 30 02:37:30 2010 Yutaka Kanemoto <kanemoto@ruby-lang.org>
+
+ * thread_pthread.c (get_stack): use pthread_getthrds_np() for AIX.
+
+ * configure.in: ditto.
+
Wed Jun 23 21:17:32 2010 Tanaka Akira <akr@fsij.org>
* ext/socket/raddrinfo.c (ruby_getaddrinfo__darwin): new workaround for
diff --git a/configure.in b/configure.in
index ab5c6841a9..e2043617cf 100644
--- a/configure.in
+++ b/configure.in
@@ -1563,7 +1563,7 @@ if test x"$enable_pthread" = xyes; then
AC_CHECK_FUNCS(nanosleep sched_yield pthread_attr_setinheritsched \
pthread_getattr_np pthread_attr_get_np pthread_attr_getstack\
pthread_get_stackaddr_np pthread_get_stacksize_np \
- thr_stksegment pthread_stackseg_np)
+ thr_stksegment pthread_stackseg_np pthread_getthrds_np)
if test x"$ac_cv_func_nanosleep" = xno; then
AC_CHECK_LIB(rt, nanosleep)
if test x"$ac_cv_lib_rt_nanosleep" = xyes; then
diff --git a/thread_pthread.c b/thread_pthread.c
index ba90b67010..2136874bd3 100644
--- a/thread_pthread.c
+++ b/thread_pthread.c
@@ -199,6 +199,8 @@ native_thread_destroy(rb_thread_t *th)
#define STACKADDR_AVAILABLE 1
#elif defined HAVE_THR_STKSEGMENT || defined HAVE_PTHREAD_STACKSEG_NP
#define STACKADDR_AVAILABLE 1
+#elif defined HAVE_PTHREAD_GETTHRDS_NP
+#define STACKADDR_AVAILABLE 1
#endif
#ifdef STACKADDR_AVAILABLE
@@ -248,6 +250,16 @@ get_stack(void **addr, size_t *size)
# endif
*addr = stk.ss_sp;
*size = stk.ss_size;
+#elif defined HAVE_PTHREAD_GETTHRDS_NP
+ pthread_t th = pthread_self();
+ struct __pthrdsinfo thinfo;
+ char reg[256];
+ int regsiz=sizeof(reg);
+ CHECK_ERR(pthread_getthrds_np(&th, PTHRDSINFO_QUERY_ALL,
+ &thinfo, sizeof(thinfo),
+ &reg, &regsiz));
+ *addr = thinfo.__pi_stackaddr;
+ *size = thinfo.__pi_stacksize;
#endif
return 0;
#undef CHECK_ERR