dougm 00/04/17 00:10:36 Added: src/modules/perl modperl_gtop.c modperl_gtop.h Log: functions for tracing memory usage Revision Changes Path 1.1 modperl-2.0/src/modules/perl/modperl_gtop.c Index: modperl_gtop.c =================================================================== #ifdef MP_USE_GTOP #include "mod_perl.h" int modperl_gtop_size_string(size_t size, char *size_string) { if (size == (size_t)-1) { ap_snprintf(size_string, MP_GTOP_SSS, "-"); } else if (!size) { ap_snprintf(size_string, MP_GTOP_SSS, "0k"); } else if (size < 1024) { ap_snprintf(size_string, MP_GTOP_SSS, "1k"); } else if (size < 1048576) { ap_snprintf(size_string, MP_GTOP_SSS, "%dk", (size + 512) / 1024); } else if (size < 103809024) { ap_snprintf(size_string, MP_GTOP_SSS, "%.1fM", size / 1048576.0); } else { ap_snprintf(size_string, MP_GTOP_SSS, "%dM", (size + 524288) / 1048576); } return 1; } ap_status_t modperl_gtop_exit(void *data) { glibtop_close(); return APR_SUCCESS; } modperl_gtop_t *modperl_gtop_new(ap_pool_t *p) { modperl_gtop_t *gtop = (modperl_gtop_t *)ap_pcalloc(p, sizeof(*gtop)); gtop->pid = getpid(); glibtop_init(); ap_register_cleanup(p, NULL, modperl_gtop_exit, ap_null_cleanup); return gtop; } void modperl_gtop_get_proc_mem_before(modperl_gtop_t *gtop) { glibtop_get_proc_mem(>op->before.proc_mem, gtop->pid); } void modperl_gtop_get_proc_mem_after(modperl_gtop_t *gtop) { glibtop_get_proc_mem(>op->after.proc_mem, gtop->pid); } #define modperl_gtop_diff(item) \ (gtop->after.item - gtop->before.item) #define ss_fmt "size=%s, vsize=%s, resident=%s, share=%s, rss=%s" #define SS_TYPE_BEFORE 1 #define SS_TYPE_AFTER 2 #define SS_TYPE_DIFF 3 /* * XXX: this is pretty ugly, * but avoids allocating buffers for the size string */ void modperl_gtop_proc_mem_size_string(modperl_gtop_t *gtop, int type) { int is_diff = (type == SS_TYPE_DIFF); glibtop_proc_mem *pm; if (!is_diff) { pm = (type == SS_TYPE_BEFORE) ? >op->before.proc_mem : >op->after.proc_mem; } #define ss_call(item) \ modperl_gtop_size_string(is_diff ? \ modperl_gtop_diff(proc_mem.item) : pm->item, \ gtop->proc_mem_ss.item) ss_call(size); ss_call(vsize); ss_call(resident); ss_call(share); ss_call(rss); #undef ss_call } void modperl_gtop_report_proc_mem(modperl_gtop_t *gtop, char *when, char *msg) { #define ss_item(item) gtop->proc_mem_ss.item fprintf(stderr, "%s %s: " ss_fmt "\n", msg, when, ss_item(size), ss_item(vsize), ss_item(resident), ss_item(share), ss_item(rss)); #undef ss_item } void modperl_gtop_report_proc_mem_diff(modperl_gtop_t *gtop, char *msg) { modperl_gtop_proc_mem_size_string(gtop, SS_TYPE_DIFF); modperl_gtop_report_proc_mem(gtop, "diff", msg); } void modperl_gtop_report_proc_mem_before(modperl_gtop_t *gtop, char *msg) { modperl_gtop_proc_mem_size_string(gtop, SS_TYPE_BEFORE); modperl_gtop_report_proc_mem(gtop, "before", msg); } void modperl_gtop_report_proc_mem_after(modperl_gtop_t *gtop, char *msg) { modperl_gtop_proc_mem_size_string(gtop, SS_TYPE_AFTER); modperl_gtop_report_proc_mem(gtop, "after", msg); } #endif /* MP_USE_GTOP */ 1.1 modperl-2.0/src/modules/perl/modperl_gtop.h Index: modperl_gtop.h =================================================================== #ifndef MODPERL_GTOP_H #define MODPERL_GTOP_H #ifdef MP_USE_GTOP #include <glibtop.h> #include <glibtop/open.h> #include <glibtop/close.h> #include <glibtop/xmalloc.h> #include <glibtop/parameter.h> #include <glibtop/union.h> #include <glibtop/sysdeps.h> #define MP_GTOP_SSS 16 typedef struct { char size[MP_GTOP_SSS]; char vsize[MP_GTOP_SSS]; char resident[MP_GTOP_SSS]; char share[MP_GTOP_SSS]; char rss[MP_GTOP_SSS]; } modperl_gtop_proc_mem_ss; typedef struct { glibtop_union before; glibtop_union after; pid_t pid; modperl_gtop_proc_mem_ss proc_mem_ss; } modperl_gtop_t; modperl_gtop_t *modperl_gtop_new(ap_pool_t *p); void modperl_gtop_get_proc_mem_before(modperl_gtop_t *gtop); void modperl_gtop_get_proc_mem_after(modperl_gtop_t *gtop); void modperl_gtop_report_proc_mem(modperl_gtop_t *gtop, char *when, char *msg); void modperl_gtop_report_proc_mem_diff(modperl_gtop_t *gtop, char *msg); void modperl_gtop_report_proc_mem_before(modperl_gtop_t *gtop, char *msg); void modperl_gtop_report_proc_mem_after(modperl_gtop_t *gtop, char *msg); #define modperl_gtop_do_proc_mem_before(msg) \ modperl_gtop_get_proc_mem_before(scfg->gtop); \ modperl_gtop_report_proc_mem_before(scfg->gtop, msg) #define modperl_gtop_do_proc_mem_after(msg) \ modperl_gtop_get_proc_mem_after(scfg->gtop); \ modperl_gtop_report_proc_mem_after(scfg->gtop, msg); \ modperl_gtop_report_proc_mem_diff(scfg->gtop, msg) #endif /* MP_USE_GTOP */ #endif /* MODPERL_GTOP_H */