diff options
author | Eric Wong <e@80x24.org> | 2022-12-15 20:52:42 +0000 |
---|---|---|
committer | Eric Wong <mwrap-perl@80x24.org> | 2022-12-16 09:27:41 +0000 |
commit | 2a8ca1bb5085e16a8c23ee50e4182c855e757f88 (patch) | |
tree | 96332fcdf421482b1380ffae77c2552d4e537ba1 | |
parent | 695bd5b9876ab31a063228390b7bf8acb32f3a1a (diff) | |
download | mwrap-2a8ca1bb5085e16a8c23ee50e4182c855e757f88.tar.gz |
This can give users some quick info about their application. We'll also show the MWRAP=bt: parameter to hint users about the backtrace depth they expect.
-rw-r--r-- | mwrap_core.h | 10 | ||||
-rw-r--r-- | mwrap_httpd.h | 25 |
2 files changed, 22 insertions, 13 deletions
diff --git a/mwrap_core.h b/mwrap_core.h index 2ef550a..4dc28d4 100644 --- a/mwrap_core.h +++ b/mwrap_core.h @@ -66,7 +66,7 @@ typedef void COP; * allocated (and we don't care about overflow on 32-bit since * hardly anybody still uses it). */ -static size_t total_bytes_inc, total_bytes_dec; +static size_t total_bytes_inc, total_bytes_dec, nr_file, nr_src_loc; static uint32_t bt_req_depth; #if MWRAP_PERL @@ -297,7 +297,9 @@ again: l->allocations = 1; CDS_INIT_LIST_HEAD(&l->allocs); cur = cds_lfht_add_unique(t, l->loc_hash, loc_eq, l, &l->hnode); - if (cur != &l->hnode) { /* lost race */ + if (cur == &l->hnode) { + uatomic_inc(&nr_src_loc); + } else { /* lost race */ rcu_read_unlock(); real_free(l); rcu_read_lock(); @@ -394,7 +396,9 @@ again: if (!f) return NULL; memcpy(f, &sf.sf, sizeof(*f) + len + 1); cur = cds_lfht_add_unique(t, f->fn_hash, fn_eq, f, &f->nd); - if (cur != &f->nd) { /* lost race */ + if (cur == &f->nd) { + uatomic_inc(&nr_file); + } else { /* lost race */ rcu_read_unlock(); real_free(f); rcu_read_lock(); diff --git a/mwrap_httpd.h b/mwrap_httpd.h index f5c3e1b..e5790aa 100644 --- a/mwrap_httpd.h +++ b/mwrap_httpd.h @@ -505,11 +505,14 @@ static struct h1_src_loc *accumulate(unsigned long min, size_t *hslc, FILE *lp) return hslv; } -static void show_age(FILE *fp) +static void show_stats(FILE *fp) { size_t dec = uatomic_read(&total_bytes_dec); size_t inc = uatomic_read(&total_bytes_inc); - fprintf(fp, "<p>Current age: %zu (live: %zu)", inc , inc - dec); + fprintf(fp, "<p>Current age: %zu (live: %zu) " + "/ files: %zu / locations: %zu", + inc , inc - dec, + uatomic_read(&nr_file), uatomic_read(&nr_src_loc)); } /* /$PID/at/$LOCATION endpoint */ @@ -542,7 +545,7 @@ static enum mw_qev each_at(struct mw_h1 *h1, struct mw_h1req *h1r) else fputc(' ', fp); write_html(fp, lb.ptr, lb.len); - show_age(fp); + show_stats(fp); FPUTS("<table><tr><th>size</th><th>generation</th>" "<th>address</th></tr>", fp); @@ -595,9 +598,10 @@ static enum mw_qev each_gt(struct mw_h1 *h1, struct mw_h1req *h1r, if (!fp) return h1_close(h1); fprintf(fp, "<html><head><title>mwrap each >%lu" "</title></head><body><p>mwrap each >%lu " - "(change `%lu' in URL to adjust filtering)", min, min, min); + "(change `%lu' in URL to adjust filtering) - MWRAP=bt:%u", + min, min, min, (unsigned)bt_req_depth); - show_age(fp); + show_stats(fp); if (bt_req_depth) /* need borders to distinguish multi-level traces */ FPUTS("<table\nborder=1><tr>", fp); else /* save screen space if only tracing one line */ @@ -651,11 +655,12 @@ static enum mw_qev pid_root(struct mw_h1 *h1, struct mw_h1req *h1r) if (!fp) return h1_close(h1); #define default_min "2000" - FPUTS("<html><head><title>mwrap demo" - "</title></head><body><p><a\n" - "href=\"each/" default_min "\">allocations >" - default_min " bytes</a><p><a\nhref=\"" - URL "\">" URL "</a></body></html>", fp); + FPUTS("<html><head><title>mwrap demo</title></head><body>" + "<p>mwrap demo", fp); + show_stats(fp); + FPUTS("<p><a\nhref=\"each/" default_min "\">allocations >" + default_min " bytes</a>" + "<p><a\nhref=\"" URL "\">" URL "</a></body></html>", fp); return h1_200(h1, &html); #undef default_min } |