I'm adding support for HP-UX to the 'vma-iter' module.
It's useful for GNU clisp.


>From c1a21de2148bbc6cb3401e82ae1b75f0be077200 Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Wed, 15 Mar 2017 22:07:56 +0100
Subject: [PATCH 1/2] vma-iter: Add support for HP-UX.

* modules/vma-iter (configure.ac): Check for 'pstat_getprocvm'.
* lib/vma-iter.c (vma_iterate): On HP-UX, use pstat_getprocvm().
* lib/vma-iter.h (VMA_ITERATE_SUPPORTED): Define also on HP-UX.
* lib/get-rusage-as.c: Update comment about HP-UX.
* lib/get-rusage-data.c: Likewise.
(get_rusage_data): Use get_rusage_data_via_setrlimit.
---
 ChangeLog             | 10 ++++++++++
 lib/get-rusage-as.c   |  6 +++++-
 lib/get-rusage-data.c |  7 +++++--
 lib/vma-iter.c        | 33 +++++++++++++++++++++++++++++++++
 lib/vma-iter.h        |  2 +-
 modules/vma-iter      |  2 +-
 6 files changed, 55 insertions(+), 5 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 6c3e1b1..2e3d0ed 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 2017-03-14  Bruno Haible  <br...@clisp.org>
 
+	vma-iter: Add support for HP-UX.
+	* modules/vma-iter (configure.ac): Check for 'pstat_getprocvm'.
+	* lib/vma-iter.c (vma_iterate): On HP-UX, use pstat_getprocvm().
+	* lib/vma-iter.h (VMA_ITERATE_SUPPORTED): Define also on HP-UX.
+	* lib/get-rusage-as.c: Update comment about HP-UX.
+	* lib/get-rusage-data.c: Likewise.
+	(get_rusage_data): Use get_rusage_data_via_setrlimit.
+
+2017-03-14  Bruno Haible  <br...@clisp.org>
+
 	limits-h: Make it work with HP-UX cc.
 	* lib/limits.in.h (LLONG_MIN, LLONG_MAX, ULLONG_MAX): Define if not
 	defined.
diff --git a/lib/get-rusage-as.c b/lib/get-rusage-as.c
index abc6882..fb9d218 100644
--- a/lib/get-rusage-as.c
+++ b/lib/get-rusage-as.c
@@ -76,7 +76,11 @@
 
    HP-UX:
      a) setrlimit with RLIMIT_AS works.
-     b) No VMA iteration API exists.
+     b) pstat_getprocvm() can be used to find out about the virtual memory
+        areas.
+     Both methods agree, except that the value of get_rusage_as_via_iterator()
+     is slighly larger higher than get_rusage_as_via_setrlimit(), by 4 KB in
+     32-bit mode and by 40 KB in 64-bit mode.
 
    IRIX:
      a) setrlimit with RLIMIT_AS works.
diff --git a/lib/get-rusage-data.c b/lib/get-rusage-data.c
index 761eb5a..4745ad6 100644
--- a/lib/get-rusage-data.c
+++ b/lib/get-rusage-data.c
@@ -83,7 +83,10 @@
      a) setrlimit with RLIMIT_DATA works, except on HP-UX 11.00, where it
         cannot restore the previous limits, and except on HP-UX 11.11, where
         it sometimes has no effect.
-     b) No VMA iteration API exists.
+     b) pstat_getprocvm() can be used to find out about the virtual memory
+        areas.
+     Both methods agree, except that the value of get_rusage_data_via_iterator()
+     is sometimes 4 KB larger than get_rusage_data_via_setrlimit().
 
    IRIX:
      a) setrlimit with RLIMIT_DATA works.
@@ -389,7 +392,7 @@ get_rusage_data (void)
      Prefer get_rusage_data_via_iterator().  */
   return get_rusage_data_via_iterator ();
 #elif HAVE_SETRLIMIT && defined RLIMIT_DATA
-# if defined __linux__ || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ || defined _AIX || defined __sgi || defined __osf__ || defined __sun /* Linux, FreeBSD, NetBSD, OpenBSD, AIX, IRIX, OSF/1, Solaris */
+# if defined __linux__ || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ || defined _AIX || defined __hpux || defined __sgi || defined __osf__ || defined __sun /* Linux, FreeBSD, NetBSD, OpenBSD, AIX, HP-UX, IRIX, OSF/1, Solaris */
   /* get_rusage_data_via_setrlimit() works.  */
   return get_rusage_data_via_setrlimit ();
 # else
diff --git a/lib/vma-iter.c b/lib/vma-iter.c
index 07244d3..b9036ae 100644
--- a/lib/vma-iter.c
+++ b/lib/vma-iter.c
@@ -49,6 +49,10 @@
 # include <sys/mman.h> /* mquery */
 #endif
 
+#if HAVE_PSTAT_GETPROCVM /* HP-UX */
+# include <sys/pstat.h> /* pstat_getprocvm */
+#endif
+
 /* Note: On AIX, there is a /proc/$pic/map file, that contains records of type
    prmap_t, defined in <sys/procfs.h>.  But it lists only the virtual memory
    areas that are connected to a file, not the anonymous ones.  */
@@ -598,6 +602,35 @@ vma_iterate (vma_iterate_callback_fn callback, void *data)
     }
   return 0;
 
+#elif HAVE_PSTAT_GETPROCVM /* HP-UX */
+
+  unsigned long pagesize = getpagesize ();
+  int i;
+
+  for (i = 0; ; i++)
+    {
+      struct pst_vm_status info;
+      int ret = pstat_getprocvm (&info, sizeof (info), 0, i);
+      if (ret < 0)
+        return -1;
+      if (ret == 0)
+        break;
+      {
+        unsigned long start = info.pst_vaddr;
+        unsigned long end = start + info.pst_length * pagesize;
+        unsigned int flags = 0;
+        if (info.pst_permission & PS_PROT_READ)
+          flags |= VMA_PROT_READ;
+        if (info.pst_permission & PS_PROT_WRITE)
+          flags |= VMA_PROT_WRITE;
+        if (info.pst_permission & PS_PROT_EXECUTE)
+          flags |= VMA_PROT_EXECUTE;
+
+        if (callback (data, start, end, flags))
+          break;
+      }
+    }
+
 #else
 
   /* Not implemented.  */
diff --git a/lib/vma-iter.h b/lib/vma-iter.h
index 36c8d66..c989e7f 100644
--- a/lib/vma-iter.h
+++ b/lib/vma-iter.h
@@ -52,7 +52,7 @@ extern int vma_iterate (vma_iterate_callback_fn callback, void *data);
    this platform.
    Note that even when this macro is defined, vma_iterate() may still fail to
    find any virtual memory area, for example if /proc is not mounted.  */
-#if defined __linux__ || defined __FreeBSD__ || defined __NetBSD__ || defined __sgi || defined __osf__ || (defined __APPLE__ && defined __MACH__) || (defined _WIN32 || defined __WIN32__) || defined __CYGWIN__ || defined __BEOS__ || defined __HAIKU__ || HAVE_MQUERY
+#if defined __linux__ || defined __FreeBSD__ || defined __NetBSD__ || defined __sgi || defined __osf__ || (defined __APPLE__ && defined __MACH__) || (defined _WIN32 || defined __WIN32__) || defined __CYGWIN__ || defined __BEOS__ || defined __HAIKU__ || HAVE_MQUERY || HAVE_PSTAT_GETPROCVM
 # define VMA_ITERATE_SUPPORTED 1
 #endif
 
diff --git a/modules/vma-iter b/modules/vma-iter
index 1544ad5..df9e7b8 100644
--- a/modules/vma-iter
+++ b/modules/vma-iter
@@ -14,7 +14,7 @@ getpagesize
 
 configure.ac:
 gl_FUNC_MMAP_ANON
-AC_CHECK_FUNCS_ONCE([mquery])
+AC_CHECK_FUNCS_ONCE([mquery pstat_getprocvm])
 
 Makefile.am:
 lib_SOURCES += vma-iter.c
-- 
2.7.4

Reply via email to