X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fbootchart%2Fsvg.c;h=9fee810795b30afb471d4a6fc40a54cba622aed1;hp=414d7af9b98451584362f367c397c53e4ebe505c;hb=1f3523baf7418adf3b2738b3917ef956a8414ab7;hpb=e93450c6c053d7499971a2b1310e893978f67f74 diff --git a/src/bootchart/svg.c b/src/bootchart/svg.c index 414d7af9b..9fee81079 100644 --- a/src/bootchart/svg.c +++ b/src/bootchart/svg.c @@ -103,7 +103,7 @@ static void svg_header(void) svg("\n\n"); svg("\n", VERSION); - svg("\n", hz, len); + svg("\n", hz, samples_len); svg("\n", scale_x, scale_y); svg("\n", relative, filter); svg("\n", pss, entropy); @@ -165,18 +165,19 @@ static void svg_title(const char *build) } /* extract root fs so we can find disk model name in sysfs */ + /* FIXME: this works only in the simple case */ c = strstr(cmdline, "root=/dev/"); if (c) { strncpy(rootbdev, &c[10], 3); rootbdev[3] = '\0'; - } - sprintf(filename, "block/%s/device/model", rootbdev); - fd = openat(sysfd, filename, O_RDONLY); - f = fdopen(fd, "r"); - if (f) { - if (!fgets(model, 255, f)) - fprintf(stderr, "Error reading disk model for %s\n", rootbdev); - fclose(f); + sprintf(filename, "block/%s/device/model", rootbdev); + fd = openat(sysfd, filename, O_RDONLY); + f = fdopen(fd, "r"); + if (f) { + if (!fgets(model, 255, f)) + fprintf(stderr, "Error reading disk model for %s\n", rootbdev); + fclose(f); + } } /* various utsname parameters */ @@ -221,7 +222,7 @@ 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); + hz, samples_len, overrun, pscount, pfiltered); } @@ -266,6 +267,20 @@ static void svg_graph_box(int height) } } +/* xml comments must not contain "--" */ +static char* xml_comment_encode(const char* name) { + char *enc_name, *p; + + enc_name = strdup(name); + if (!enc_name) + return NULL; + + for (p = enc_name; *p; p++) + if (p[0] == '-' && p[1] == '-') + p[1] = '_'; + + return enc_name; +} static void svg_pss_graph(void) { @@ -368,7 +383,7 @@ static void svg_pss_graph(void) top = bottom + ps->sample[i].pss; /* draw a label with the process / PID */ if ((i == 1) || (ps->sample[i - 1].pss <= (100 * scale_y))) - svg(" %s [%i]\n", + svg(" [%i]\n", time_to_graph(sampletime[i] - graph_start), kb_to_graph(1000000.0 - bottom - ((top - bottom) / 2)), ps->name, @@ -382,10 +397,17 @@ static void svg_pss_graph(void) svg("\n\n\n"); ps = ps_first; while (ps->next_ps) { + char _cleanup_free_*enc_name; ps = ps->next_ps; if (!ps) continue; - svg("\n", ps->name, ps->pid, + svg("\n", enc_name, ps->pid, ps->ppid, ps->total); /* it would be nice if we could use exec_start from /proc/pid/sched, @@ -897,7 +925,7 @@ static void svg_ps_bars(void) w = ps->first; /* text label of process name */ - svg(" %s [%i] %.03fs\n", + svg(" [%i]%.03fs\n", time_to_graph(sampletime[w] - graph_start) + 5.0, ps_to_graph(j) + 14.0, ps->name, @@ -1001,7 +1029,7 @@ static void svg_top_ten_cpu(void) svg("Top CPU consumers:\n"); for (n = 0; n < 10; n++) - svg("%3.03fs - %s[%d]\n", + svg("%3.03fs - [%d]\n", 20 + (n * 13), top[n]->total, top[n]->name, @@ -1036,7 +1064,7 @@ static void svg_top_ten_pss(void) svg("Top PSS consumers:\n"); for (n = 0; n < 10; n++) - svg("%dK - %s[%d]\n", + svg("%dK - [%d]\n", 20 + (n * 13), top[n]->pss_max, top[n]->name,