about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2022-12-15 20:52:42 +0000
committerEric Wong <mwrap-perl@80x24.org>2022-12-16 09:27:41 +0000
commit2a8ca1bb5085e16a8c23ee50e4182c855e757f88 (patch)
tree96332fcdf421482b1380ffae77c2552d4e537ba1
parent695bd5b9876ab31a063228390b7bf8acb32f3a1a (diff)
downloadmwrap-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.h10
-rw-r--r--mwrap_httpd.h25
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 &gt;%lu"
                 "</title></head><body><p>mwrap each &gt;%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 &gt;"
-                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 &gt;"
+                default_min " bytes</a>"
+                "<p><a\nhref=\"" URL "\">" URL "</a></body></html>", fp);
         return h1_200(h1, &html);
 #undef default_min
 }