Skip to content
Browse files

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
  • Loading branch information...
1 parent b7aa49b commit 806ddf671313be82a977d4afba9ff668d95bbb14 @nobu nobu committed
Showing with 48 additions and 0 deletions.
  1. +6 −0 ChangeLog
  2. +42 −0 thread_pthread.c
View
6 ChangeLog
@@ -1,3 +1,9 @@
+Wed Aug 28 17:20:07 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * 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]
+
Wed Aug 28 11:24:20 2013 Michal Rokos <michal@rokos.cz>
* configure.in (sys/pstat.h): fix missing header check for
View
42 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

0 comments on commit 806ddf6

Please sign in to comment.
Something went wrong with that request. Please try again.