X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fbootchart%2Fsvg.c;h=3472bc0ae88548a4587a2618f6b7075fd18cbbc4;hp=4c78abda63af2e3d80d2c7fb342e3188b67a6d1f;hb=1c6330456c5ae76085c63d2a7cf3d722596e545a;hpb=e90f9fa4d1cab6f73fc502fe9ef705c1bb2912a0 diff --git a/src/bootchart/svg.c b/src/bootchart/svg.c index 4c78abda6..3472bc0ae 100644 --- a/src/bootchart/svg.c +++ b/src/bootchart/svg.c @@ -1,5 +1,7 @@ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ + /*** - bootchart.c - This file is part of systemd-bootchart + This file is part of systemd. Copyright (C) 2009-2013 Intel Coproration @@ -31,24 +33,22 @@ #include #include -#include "bootchart.h" #include "util.h" #include "macro.h" +#include "store.h" +#include "svg.h" +#include "bootchart.h" - -#define time_to_graph(t) ((t) * scale_x) -#define ps_to_graph(n) ((n) * scale_y) -#define kb_to_graph(m) ((m) * scale_y * 0.0001) +#define time_to_graph(t) ((t) * arg_scale_x) +#define ps_to_graph(n) ((n) * arg_scale_y) +#define kb_to_graph(m) ((m) * arg_scale_y * 0.0001) #define to_color(n) (192.0 - ((n) * 192.0)) -#define max(x, y) (((x) > (y)) ? (x) : (y)) -#define min(x, y) (((x) < (y)) ? (x) : (y)) - static char str[8092]; #define svg(a...) do { snprintf(str, 8092, ## a); fputs(str, of); fflush(of); } while (0) -static const char *colorwheel[12] = { +static const char * const colorwheel[12] = { "rgb(255,32,32)", // red "rgb(32,192,192)", // cyan "rgb(255,128,32)", // orange @@ -71,9 +71,7 @@ static float psize = 0; static float ksize = 0; static float esize = 0; - -static void svg_header(void) -{ +static void svg_header(void) { float w; float h; @@ -82,8 +80,8 @@ static void svg_header(void) w = ((w < 1600.0) ? 1600.0 : w); /* height is variable based on pss, psize, ksize */ - h = 400.0 + (scale_y * 30.0) /* base graphs and title */ - + (pss ? (100.0 * scale_y) + (scale_y * 7.0) : 0.0) /* pss estimate */ + h = 400.0 + (arg_scale_y * 30.0) /* base graphs and title */ + + (arg_pss ? (100.0 * arg_scale_y) + (arg_scale_y * 7.0) : 0.0) /* pss estimate */ + psize + ksize + esize; svg("\n"); @@ -103,11 +101,11 @@ static void svg_header(void) svg("\n\n"); svg("\n", VERSION); - svg("\n", hz, len); - svg("\n", scale_x, scale_y); - svg("\n", relative, filter); - svg("\n", pss, entropy); - svg("\n\n", output_path, init_path); + svg("\n", arg_hz, arg_samples_len); + svg("\n", arg_scale_x, arg_scale_y); + svg("\n", arg_relative, arg_filter); + svg("\n", arg_pss, arg_entropy); + svg("\n\n", arg_output_path, arg_init_path); /* style sheet */ svg("\n \n\n\n"); - } - -static void svg_title(const char *build) -{ +static void svg_title(const char *build) { char cmdline[256] = ""; char filename[PATH_MAX]; char buf[256]; @@ -222,12 +217,10 @@ static void svg_title(const char *build) svg("Not detected"); svg("\n"); svg("Graph data: %.03f samples/sec, recorded %i total, dropped %i samples, %i processes, %i filtered\n", - hz, len, overrun, pscount, pfiltered); + arg_hz, arg_samples_len, overrun, pscount, pfiltered); } - -static void svg_graph_box(int height) -{ +static void svg_graph_box(int height) { double d = 0.0; int i = 0; @@ -238,7 +231,7 @@ static void svg_graph_box(int height) ps_to_graph(height)); for (d = graph_start; d <= sampletime[samples-1]; - d += (scale_x < 2.0 ? 60.0 : scale_x < 10.0 ? 1.0 : 0.1)) { + d += (arg_scale_x < 2.0 ? 60.0 : arg_scale_x < 10.0 ? 1.0 : 0.1)) { /* lines for each second */ if (i % 50 == 0) svg(" \n", @@ -282,8 +275,7 @@ static char* xml_comment_encode(const char* name) { return enc_name; } -static void svg_pss_graph(void) -{ +static void svg_pss_graph(void) { struct ps_struct *ps; int i; @@ -320,7 +312,7 @@ static void svg_pss_graph(void) ps = ps->next_ps; if (!ps) continue; - if (ps->sample[i].pss <= (100 * scale_y)) + if (ps->sample[i].pss <= (100 * arg_scale_y)) top += ps->sample[i].pss; }; svg(" \n", @@ -339,7 +331,7 @@ static void svg_pss_graph(void) if (!ps) continue; /* don't draw anything smaller than 2mb */ - if (ps->sample[i].pss > (100 * scale_y)) { + if (ps->sample[i].pss > (100 * arg_scale_y)) { top = bottom + ps->sample[i].pss; svg(" \n", colorwheel[ps->pid % 12], @@ -366,7 +358,7 @@ static void svg_pss_graph(void) ps = ps->next_ps; if (!ps) continue; - if (ps->sample[i].pss <= (100 * scale_y)) + if (ps->sample[i].pss <= (100 * arg_scale_y)) top += ps->sample[i].pss; }; @@ -379,10 +371,10 @@ static void svg_pss_graph(void) if (!ps) continue; /* don't draw anything smaller than 2mb */ - if (ps->sample[i].pss > (100 * scale_y)) { + if (ps->sample[i].pss > (100 * arg_scale_y)) { top = bottom + ps->sample[i].pss; /* draw a label with the process / PID */ - if ((i == 1) || (ps->sample[i - 1].pss <= (100 * scale_y))) + if ((i == 1) || (ps->sample[i - 1].pss <= (100 * arg_scale_y))) svg(" [%i]\n", time_to_graph(sampletime[i] - graph_start), kb_to_graph(1000000.0 - bottom - ((top - bottom) / 2)), @@ -397,7 +389,7 @@ static void svg_pss_graph(void) svg("\n\n\n"); ps = ps_first; while (ps->next_ps) { - char _cleanup_free_*enc_name; + char _cleanup_free_ *enc_name = NULL; ps = ps->next_ps; if (!ps) continue; @@ -416,8 +408,7 @@ static void svg_pss_graph(void) } -static void svg_io_bi_bar(void) -{ +static void svg_io_bi_bar(void) { double max = 0.0; double range; int max_here = 0; @@ -434,7 +425,7 @@ static void svg_io_bi_bar(void) * each poll. Applying a smoothing function loses some burst data, * so keep the smoothing range short. */ - range = 0.25 / (1.0 / hz); + range = 0.25 / (1.0 / arg_hz); if (range < 2.0) range = 2.0; /* no smoothing */ @@ -447,8 +438,8 @@ static void svg_io_bi_bar(void) int stop; double tot; - start = max(i - ((range / 2) - 1), 0); - stop = min(i + (range / 2), samples - 1); + start = MAX(i - ((range / 2) - 1), 0); + stop = MIN(i + (range / 2), samples - 1); tot = (double)(blockstat[stop].bi - blockstat[start].bi) / (stop - start); @@ -469,8 +460,8 @@ static void svg_io_bi_bar(void) double tot; double pbi; - start = max(i - ((range / 2) - 1), 0); - stop = min(i + (range / 2), samples); + start = MAX(i - ((range / 2) - 1), 0); + stop = MIN(i + (range / 2), samples); tot = (double)(blockstat[stop].bi - blockstat[start].bi) / (stop - start); @@ -479,22 +470,21 @@ static void svg_io_bi_bar(void) if (pbi > 0.001) svg("\n", time_to_graph(sampletime[i - 1] - graph_start), - (scale_y * 5) - (pbi * (scale_y * 5)), + (arg_scale_y * 5) - (pbi * (arg_scale_y * 5)), time_to_graph(sampletime[i] - sampletime[i - 1]), - pbi * (scale_y * 5)); + pbi * (arg_scale_y * 5)); /* labels around highest value */ if (i == max_here) { svg(" %0.2fmb/sec\n", time_to_graph(sampletime[i] - graph_start) + 5, - ((scale_y * 5) - (pbi * (scale_y * 5))) + 15, + ((arg_scale_y * 5) - (pbi * (arg_scale_y * 5))) + 15, max / 1024.0 / (interval / 1000000000.0)); } } } -static void svg_io_bo_bar(void) -{ +static void svg_io_bo_bar(void) { double max = 0.0; double range; int max_here = 0; @@ -511,7 +501,7 @@ static void svg_io_bo_bar(void) * each poll. Applying a smoothing function loses some burst data, * so keep the smoothing range short. */ - range = 0.25 / (1.0 / hz); + range = 0.25 / (1.0 / arg_hz); if (range < 2.0) range = 2.0; /* no smoothing */ @@ -524,8 +514,8 @@ static void svg_io_bo_bar(void) int stop; double tot; - start = max(i - ((range / 2) - 1), 0); - stop = min(i + (range / 2), samples - 1); + start = MAX(i - ((range / 2) - 1), 0); + stop = MIN(i + (range / 2), samples - 1); tot = (double)(blockstat[stop].bi - blockstat[start].bi) / (stop - start); @@ -546,8 +536,8 @@ static void svg_io_bo_bar(void) double tot; double pbo; - start = max(i - ((range / 2) - 1), 0); - stop = min(i + (range / 2), samples); + start = MAX(i - ((range / 2) - 1), 0); + stop = MIN(i + (range / 2), samples); tot = (double)(blockstat[stop].bo - blockstat[start].bo) / (stop - start); @@ -556,23 +546,21 @@ static void svg_io_bo_bar(void) if (pbo > 0.001) svg("\n", time_to_graph(sampletime[i - 1] - graph_start), - (scale_y * 5) - (pbo * (scale_y * 5)), + (arg_scale_y * 5) - (pbo * (arg_scale_y * 5)), time_to_graph(sampletime[i] - sampletime[i - 1]), - pbo * (scale_y * 5)); + pbo * (arg_scale_y * 5)); /* labels around highest bo value */ if (i == max_here) { svg(" %0.2fmb/sec\n", time_to_graph(sampletime[i] - graph_start) + 5, - ((scale_y * 5) - (pbo * (scale_y * 5))), + ((arg_scale_y * 5) - (pbo * (arg_scale_y * 5))), max / 1024.0 / (interval / 1000000000.0)); } } } - -static void svg_cpu_bar(void) -{ +static void svg_cpu_bar(void) { int i; svg("\n"); @@ -605,15 +593,14 @@ static void svg_cpu_bar(void) if (ptrt > 0.001) { svg("\n", time_to_graph(sampletime[i - 1] - graph_start), - (scale_y * 5) - (ptrt * (scale_y * 5)), + (arg_scale_y * 5) - (ptrt * (arg_scale_y * 5)), time_to_graph(sampletime[i] - sampletime[i - 1]), - ptrt * (scale_y * 5)); + ptrt * (arg_scale_y * 5)); } } } -static void svg_wait_bar(void) -{ +static void svg_wait_bar(void) { int i; svg("\n"); @@ -647,16 +634,15 @@ static void svg_wait_bar(void) if (ptwt > 0.001) { svg("\n", time_to_graph(sampletime[i - 1] - graph_start), - ((scale_y * 5) - (ptwt * (scale_y * 5))), + ((arg_scale_y * 5) - (ptwt * (arg_scale_y * 5))), time_to_graph(sampletime[i] - sampletime[i - 1]), - ptwt * (scale_y * 5)); + ptwt * (arg_scale_y * 5)); } } } -static void svg_entropy_bar(void) -{ +static void svg_entropy_bar(void) { int i; svg("\n"); @@ -670,15 +656,13 @@ static void svg_entropy_bar(void) /* svg("\n", sampletime[i], entropy_avail[i]); */ svg("\n", time_to_graph(sampletime[i - 1] - graph_start), - ((scale_y * 5) - ((entropy_avail[i] / 4096.) * (scale_y * 5))), + ((arg_scale_y * 5) - ((entropy_avail[i] / 4096.) * (arg_scale_y * 5))), time_to_graph(sampletime[i] - sampletime[i - 1]), - (entropy_avail[i] / 4096.) * (scale_y * 5)); + (entropy_avail[i] / 4096.) * (arg_scale_y * 5)); } } - -static struct ps_struct *get_next_ps(struct ps_struct *ps) -{ +static struct ps_struct *get_next_ps(struct ps_struct *ps) { /* * walk the list of processes and return the next one to be * painted @@ -707,10 +691,8 @@ static struct ps_struct *get_next_ps(struct ps_struct *ps) return NULL; } - -static int ps_filter(struct ps_struct *ps) -{ - if (!filter) +static int ps_filter(struct ps_struct *ps) { + if (!arg_filter) return 0; /* can't draw data when there is only 1 sample (need start + stop) */ @@ -728,9 +710,7 @@ static int ps_filter(struct ps_struct *ps) return 0; } - -static void svg_do_initcall(int count_only) -{ +static void svg_do_initcall(int count_only) { FILE _cleanup_pclose_ *f = NULL; double t; char func[256]; @@ -738,7 +718,7 @@ static void svg_do_initcall(int count_only) int usecs; /* can't plot initcall when disabled or in relative mode */ - if (!initcall || relative) { + if (!initcall || arg_relative) { kcount = 0; return; } @@ -818,9 +798,7 @@ static void svg_do_initcall(int count_only) } } - -static void svg_ps_bars(void) -{ +static void svg_ps_bars(void) { struct ps_struct *ps; int i = 0; int j = 0; @@ -837,14 +815,11 @@ static void svg_ps_bars(void) /* pass 2 - ps boxes */ ps = ps_first; while ((ps = get_next_ps(ps))) { - char _cleanup_free_*enc_name; + char _cleanup_free_ *enc_name = NULL; double starttime; int t; - if (!ps) - continue; - enc_name = xml_comment_encode(ps->name); if(!enc_name) continue; @@ -966,7 +941,7 @@ static void svg_ps_bars(void) break; } - for (i = ps->first; i < samples - (hz / 2); i++) { + for (i = ps->first; i < samples - (arg_hz / 2); i++) { double crt; double brt; int c; @@ -974,8 +949,8 @@ static void svg_ps_bars(void) /* subtract bootchart cpu utilization from total */ crt = 0.0; for (c = 0; c < cpus; c++) - crt += cpustat[c].sample[i + ((int)hz / 2)].runtime - cpustat[c].sample[i].runtime; - brt = ps->sample[i + ((int)hz / 2)].runtime - ps->sample[i].runtime; + crt += cpustat[c].sample[i + ((int)arg_hz / 2)].runtime - cpustat[c].sample[i].runtime; + brt = ps->sample[i + ((int)arg_hz / 2)].runtime - ps->sample[i].runtime; /* * our definition of "idle": @@ -989,28 +964,25 @@ static void svg_ps_bars(void) idletime); svg("\n", time_to_graph(idletime), - -scale_y, + -arg_scale_y, time_to_graph(idletime), - ps_to_graph(pcount) + scale_y); + ps_to_graph(pcount) + arg_scale_y); svg("%.01fs\n", time_to_graph(idletime) + 5.0, - ps_to_graph(pcount) + scale_y, + ps_to_graph(pcount) + arg_scale_y, idletime); break; } } } - -static void svg_top_ten_cpu(void) -{ +static void svg_top_ten_cpu(void) { struct ps_struct *top[10]; - struct ps_struct emptyps; + struct ps_struct emptyps = {}; struct ps_struct *ps; int n, m; - memset(&emptyps, 0, sizeof(struct ps_struct)); - for (n=0; n < 10; n++) + for (n = 0; n < (int) ELEMENTSOF(top); n++) top[n] = &emptyps; /* walk all ps's and setup ptrs */ @@ -1036,16 +1008,13 @@ static void svg_top_ten_cpu(void) top[n]->pid); } - -static void svg_top_ten_pss(void) -{ +static void svg_top_ten_pss(void) { struct ps_struct *top[10]; - struct ps_struct emptyps; + struct ps_struct emptyps = {}; struct ps_struct *ps; int n, m; - memset(&emptyps, 0, sizeof(struct ps_struct)); - for (n=0; n < 10; n++) + for (n = 0; n < (int) ELEMENTSOF(top); n++) top[n] = &emptyps; /* walk all ps's and setup ptrs */ @@ -1071,9 +1040,7 @@ static void svg_top_ten_pss(void) top[n]->pid); } - -void svg_do(const char *build) -{ +void svg_do(const char *build) { struct ps_struct *ps; memset(&str, 0, sizeof(str)); @@ -1082,7 +1049,7 @@ void svg_do(const char *build) /* count initcall thread count first */ svg_do_initcall(1); - ksize = (kcount ? ps_to_graph(kcount) + (scale_y * 2) : 0); + ksize = (kcount ? ps_to_graph(kcount) + (arg_scale_y * 2) : 0); /* then count processes */ while ((ps = get_next_ps(ps))) { @@ -1091,9 +1058,9 @@ void svg_do(const char *build) else pfiltered++; } - psize = ps_to_graph(pcount) + (scale_y * 2); + psize = ps_to_graph(pcount) + (arg_scale_y * 2); - esize = (entropy ? scale_y * 7 : 0); + esize = (arg_entropy ? arg_scale_y * 7 : 0); /* after this, we can draw the header with proper sizing */ svg_header(); @@ -1102,25 +1069,25 @@ void svg_do(const char *build) svg_io_bi_bar(); svg("\n\n"); - svg("\n", 400.0 + (scale_y * 7.0)); + svg("\n", 400.0 + (arg_scale_y * 7.0)); svg_io_bo_bar(); svg("\n\n"); - svg("\n", 400.0 + (scale_y * 14.0)); + svg("\n", 400.0 + (arg_scale_y * 14.0)); svg_cpu_bar(); svg("\n\n"); - svg("\n", 400.0 + (scale_y * 21.0)); + svg("\n", 400.0 + (arg_scale_y * 21.0)); svg_wait_bar(); svg("\n\n"); if (kcount) { - svg("\n", 400.0 + (scale_y * 28.0)); + svg("\n", 400.0 + (arg_scale_y * 28.0)); svg_do_initcall(0); svg("\n\n"); } - svg("\n", 400.0 + (scale_y * 28.0) + ksize); + svg("\n", 400.0 + (arg_scale_y * 28.0) + ksize); svg_ps_bars(); svg("\n\n"); @@ -1132,14 +1099,14 @@ void svg_do(const char *build) svg_top_ten_cpu(); svg("\n\n"); - if (entropy) { - svg("\n", 400.0 + (scale_y * 28.0) + ksize + psize); + if (arg_entropy) { + svg("\n", 400.0 + (arg_scale_y * 28.0) + ksize + psize); svg_entropy_bar(); svg("\n\n"); } - if (pss) { - svg("\n", 400.0 + (scale_y * 28.0) + ksize + psize + esize); + if (arg_pss) { + svg("\n", 400.0 + (arg_scale_y * 28.0) + ksize + psize + esize); svg_pss_graph(); svg("\n\n");