aboutsummaryrefslogtreecommitdiffstats
path: root/thread_pthread.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-08-28 08:20:13 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-08-28 08:20:13 +0000
commit806ddf671313be82a977d4afba9ff668d95bbb14 (patch)
treec2f0aa73a1cf95554ec3b86de3e131e71b357102 /thread_pthread.c
parentb7aa49b9a7dfe7572fab456ab4f5cde1377713b0 (diff)
downloadruby-806ddf671313be82a977d4afba9ff668d95bbb14.tar.gz
thread_pthread.c: get_stack on HP-UX
* thread_pthread.c (hpux_attr_getstackaddr): basic support for the get_stack() under HP-UX. based on the patch by michal@rokos.cz (Michal Rokos) at [ruby-core:56645]. [Feature #8793] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42716 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'thread_pthread.c')
-rw-r--r--thread_pthread.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/thread_pthread.c b/thread_pthread.c
index d915c10943..0cb5489f49 100644
--- a/thread_pthread.c
+++ b/thread_pthread.c
@@ -492,6 +492,48 @@ size_t pthread_get_stacksize_np(pthread_t);
#define STACKADDR_AVAILABLE 1
#elif defined HAVE_PTHREAD_GETTHRDS_NP
#define STACKADDR_AVAILABLE 1
+#elif defined __ia64 && defined _HPUX_SOURCE
+#define STACKADDR_AVAILABLE 1
+
+/*
+ * Do not lower the thread's stack to PTHREAD_STACK_MIN,
+ * otherwise one would receive a 'sendsig: useracc failed.'
+ * and a coredump.
+ */
+#undef PTHREAD_STACK_MIN
+
+#define HAVE_PTHREAD_ATTR_GET_NP 1
+#undef HAVE_PTHREAD_ATTR_GETSTACK
+
+/*
+ * As the PTHREAD_STACK_MIN is undefined and
+ * noone touches the default stacksize,
+ * it is just fine to use the default.
+ */
+#define pthread_attr_get_np(thid, attr) 0
+
+/*
+ * Using value of sp is very rough... To make it more real,
+ * addr would need to be aligned to vps_pagesize.
+ * The vps_pagesize is 'Default user page size (kBytes)'
+ * and could be retrieved by gettune().
+ */
+
+static int hpux_attr_getstackaddr(const pthread_attr_t *attr, void *addr)
+{
+ static uint64_t pagesize;
+ size_t size;
+
+ if (!pagesize) {
+ if (gettune("vps_pagesize", &pagesize)) {
+ pagesize = 1024;
+ }
+ }
+ pthread_attr_getstacksize(attr, &size);
+ *addr = (void *)((size_t)((char *)_Asm_get_sp() - size) & ~(pagesize - 1));
+ return 0;
+}
+#define pthread_attr_getstackaddr(attr, addr) hpux_attr_getstackaddr(attr, addr)
#endif
#ifndef MAINSTACKADDR_AVAILABLE