>From c1a21de2148bbc6cb3401e82ae1b75f0be077200 Mon Sep 17 00:00:00 2001 From: Bruno Haible 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 + 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 + 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 /* mquery */ #endif +#if HAVE_PSTAT_GETPROCVM /* HP-UX */ +# include /* pstat_getprocvm */ +#endif + /* Note: On AIX, there is a /proc/$pic/map file, that contains records of type prmap_t, defined in . 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