#include <signal.h>
#include <unistd.h>
#include <sys/stat.h>
+#if defined(__hpux)
+#include <sys/param.h>
+#include <sys/pstat.h>
+#endif
#include "miscadmin.h"
#ifdef PROFILE_PID_DIR
before_shmem_exit_index;
+/* Report process's stack consumption to stderr */
+static void
+report_stack_size(void)
+{
+#if defined(__hpux)
+ /* HPUX: examine process's memory map with pstat_getprocvm() */
+ int targetpid = getpid();
+ struct pst_vm_status buf;
+ int res;
+ int ndx;
+
+ for (ndx = 0;; ndx++)
+ {
+ res = pstat_getprocvm(&buf, sizeof(buf), targetpid, ndx);
+ if (res < 0)
+ {
+ perror("getprocvm");
+ break;
+ }
+ if (res != 1)
+ break;
+ if (buf.pst_type != PS_STACK)
+ continue;
+ fprintf(stderr, "%d: stack addr 0x%lx, length %ld, physical pages %ld\n",
+ targetpid,
+ buf.pst_vaddr,
+ buf.pst_length,
+ buf.pst_phys_pages);
+ }
+#else /* non HPUX */
+ /* Otherwise: try to use pmap. No error if that doesn't work. */
+ char sysbuf[128];
+
+ snprintf(sysbuf, sizeof(sysbuf), "pmap -x %d | grep -i stack 1>&2",
+ (int) getpid());
+ (void) system(sysbuf);
+#endif
+}
+
+
/* ----------------------------------------------------------------
* proc_exit
*
/* Clean up everything that must be cleaned up */
proc_exit_prepare(code);
+ /* report stack size to stderr */
+ report_stack_size();
+
#ifdef PROFILE_PID_DIR
{
/*