diff --git a/server/include/hist.h b/server/include/hist.h index 157ce2482..59a16e131 100644 --- a/server/include/hist.h +++ b/server/include/hist.h @@ -7,6 +7,8 @@ #ifndef _HIST_H_ #define _HIST_H_ +#include + #define HIST_HEIGHT 50 #define HIST_SEQ 17 @@ -68,7 +70,10 @@ void hist_print(struct hist *h); /** Print ASCII style plot of histogram */ void hist_plot(struct hist *h); -/** Dump histogram data in Matlab format to stdout */ -void hist_dump(struct hist *h); +/** Dump histogram data in Matlab format to buf */ +void hist_dump(struct hist *h, char *buf, int len); + +/** Prints Matlab struct containing all infos to file. */ +void hist_matlab(struct hist *h, FILE *f); #endif /* _HIST_H_ */ \ No newline at end of file diff --git a/server/src/hist.c b/server/src/hist.c index ef2d937c9..742e11be2 100644 --- a/server/src/hist.c +++ b/server/src/hist.c @@ -9,6 +9,7 @@ #include #include #include +#include #include "utils.h" #include "hist.h" @@ -102,7 +103,11 @@ void hist_print(struct hist *h) info("Standard derivation: %f", hist_stddev(h)); hist_plot(h); - hist_dump(h); + + char buf[h->length * 8]; + hist_dump(h, buf, sizeof(buf)); + + info("hist = %s", buf); } void hist_plot(struct hist *h) @@ -122,27 +127,43 @@ void hist_plot(struct hist *h) memset(buf, '#', HIST_HEIGHT); /* Print plot */ - info("%5s | %5s | %s", "Value", "Occur", "Histogram Plot:"); + info("%9s | %5s | %s", "Value", "Occur", "Histogram Plot:"); for (int i = 0; i < h->length; i++) { int bar = HIST_HEIGHT * ((double) h->data[i] / max); - if (h->data[i] == min) info("%5.2e | " GRN("%5u") " | %.*s", VAL(h, i), h->data[i], bar, buf); - else if (h->data[i] == max) info("%5.2e | " RED("%5u") " | %.*s", VAL(h, i), h->data[i], bar, buf); - else info("%5.2e | " "%5u" " | %.*s", VAL(h, i), h->data[i], bar, buf); + if (h->data[i] == min) info("%+5.2e | " GRN("%5u") " | %.*s", VAL(h, i), h->data[i], bar, buf); + else if (h->data[i] == max) info("%+5.2e | " RED("%5u") " | %.*s", VAL(h, i), h->data[i], bar, buf); + else info("%+5.2e | " "%5u" " | %.*s", VAL(h, i), h->data[i], bar, buf); } } -void hist_dump(struct hist *h) +void hist_dump(struct hist *h, char *buf, int len) { char tok[8]; - char buf[h->length * sizeof(tok)]; - memset(buf, 0, sizeof(buf)); + memset(buf, 0, len); + + strncat(buf, "[ ", len); - /* Print in Matlab vector format */ for (int i = 0; i < h->length; i++) { snprintf(tok, sizeof(tok), "%u ", h->data[i]); - strncat(buf, tok, sizeof(buf) - strlen(buf)); + strncat(buf, tok, len - strlen(buf)); } - - info("hist = [ %s]", buf); + + strncat(buf, "]", len - strlen(buf)); +} + +void hist_matlab(struct hist *h, FILE *f) +{ + char buf[h->length * 8]; + hist_dump(h, buf, sizeof(buf)); + + fprintf(f, "%lu = struct( ", time(NULL)); + fprintf(f, "'min', %f, 'max', %f, ", h->low, h->high); + fprintf(f, "'ok', %u, too_high', %u, 'too_low', %u, ", h->total, h->higher, h->lower); + fprintf(f, "'highest', %f, 'lowest', %f, ", h->highest, h->lowest); + fprintf(f, "'mean', %f, ", hist_mean(h)); + fprintf(f, "'var', %f, ", hist_var(h)); + fprintf(f, "'stddev', %f, ", hist_stddev(h)); + fprintf(f, "'hist', %s ", buf); + fprintf(f, "),\n"); } diff --git a/server/src/node.c b/server/src/node.c index afd02ea41..003ebf66f 100644 --- a/server/src/node.c +++ b/server/src/node.c @@ -58,7 +58,8 @@ struct node_vtable const * node_lookup_vtable(const char *str) int node_start(struct node *n) { - int ret; + if (!n->refcnt) + return -1; char str[256]; node_print(n, str, sizeof(str)); @@ -66,13 +67,8 @@ int node_start(struct node *n) debug(1, "Starting node '%s' of type '%s' (%s)", n->name, n->vt->name, str); { INDENT - if (!n->refcnt) - warn("Node '%s' is not used by an active path", n->name); - - ret = n->vt->open(n); + return n->vt->open(n); } - - return ret; } int node_start_defer(struct node *n) diff --git a/server/src/test.c b/server/src/test.c index 107290d70..fa31b122a 100644 --- a/server/src/test.c +++ b/server/src/test.c @@ -13,6 +13,9 @@ #include #include #include +#include +#include +#include #include "config.h" #include "cfg.h" @@ -189,5 +192,13 @@ void test_rtt() { hist_print(&histogram); + struct stat st; + if (!fstat(fd, &st)) { + FILE *f = fdopen(fd, "w"); + hist_matlab(&histogram, f); + } + else + error("Invalid file descriptor: %u", fd); + hist_free(&histogram); }