about summary refs log tree commit homepage
path: root/mwrap_core.h
diff options
context:
space:
mode:
Diffstat (limited to 'mwrap_core.h')
-rw-r--r--mwrap_core.h35
1 files changed, 29 insertions, 6 deletions
diff --git a/mwrap_core.h b/mwrap_core.h
index deb3bb3..fff0538 100644
--- a/mwrap_core.h
+++ b/mwrap_core.h
@@ -732,6 +732,7 @@ enomem:
 struct dump_arg {
         FILE *fp;
         size_t min;
+        bool dump_csv;
 };
 
 char **bt_syms(void * const *addrlist, uint32_t size)
@@ -754,12 +755,16 @@ static void cleanup_free(void *any)
         free(*p);
 }
 
+static void *write_csv(FILE *, size_t min, const char *sort, size_t sort_len);
 static void *dump_to_file(struct dump_arg *a)
 {
         struct cds_lfht_iter iter;
         struct src_loc *l;
         struct cds_lfht *t;
 
+        if (a->dump_csv)
+                return write_csv(a->fp, a->min, NULL, 0);
+
         ++locating;
         rcu_read_lock();
         t = CMM_LOAD_SHARED(totals);
@@ -857,7 +862,7 @@ __attribute__ ((destructor)) static void mwrap_dtor(void)
 {
         const char *opt = getenv("MWRAP");
         const char *modes[] = { "a", "a+", "w", "w+", "r+" };
-        struct dump_arg a = { .min = 0 };
+        struct dump_arg a = { .min = 0, .dump_csv = false };
         size_t i;
         int dump_fd;
         char *dump_path;
@@ -870,9 +875,24 @@ __attribute__ ((destructor)) static void mwrap_dtor(void)
                 return;
 
         ++locating;
-        if ((dump_path = strstr(opt, "dump_path:")) &&
-                        (dump_path += sizeof("dump_path")) &&
-                        *dump_path) {
+
+        /* parse dump_csv:$PATHNAME */
+        if ((dump_path = strstr(opt, "dump_csv:"))) {
+                dump_path += sizeof("dump_csv");
+                if (!*dump_path)
+                        dump_path = NULL;
+                else
+                        a.dump_csv = true;
+        }
+        if (!dump_path) {
+                /* parse dump_path:$PATHNAME */
+                if ((dump_path = strstr(opt, "dump_path:"))) {
+                        dump_path += sizeof("dump_path");
+                        if (!*dump_path)
+                                dump_path = NULL;
+                }
+        }
+        if (dump_path) {
                 char *end = strchr(dump_path, ',');
                 char buf[PATH_MAX];
                 if (end) {
@@ -887,10 +907,13 @@ __attribute__ ((destructor)) static void mwrap_dtor(void)
                         fprintf(stderr, "open %s failed: %m\n", dump_path);
                         goto out;
                 }
-        }
-        else if (!sscanf(opt, "dump_fd:%d", &dump_fd))
+        } else if ((s = strstr(opt, "dump_fd:")) &&
+                        !sscanf(s, "dump_fd:%d", &dump_fd))
                 goto out;
 
+        /* allow dump_csv standalone for dump_fd */
+        if (!a.dump_csv && strstr(opt, "dump_csv"))
+                a.dump_csv = true;
         if ((s = strstr(opt, "dump_min:")))
                 sscanf(s, "dump_min:%zu", &a.min);