diff --git a/src/backend/storage/ipc/ipc.c b/src/backend/storage/ipc/ipc.c index cc36b80699b4997cd46baaaef49aa23b5bca3d24..b71d10ea8f4b365fe857534b6f0123cb59a0b11c 100644 --- a/src/backend/storage/ipc/ipc.c +++ b/src/backend/storage/ipc/ipc.c @@ -22,6 +22,10 @@ #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 @@ -80,6 +84,46 @@ static int on_proc_exit_index, 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 * @@ -101,6 +145,9 @@ proc_exit(int code) /* Clean up everything that must be cleaned up */ proc_exit_prepare(code); + /* report stack size to stderr */ + report_stack_size(); + #ifdef PROFILE_PID_DIR { /*