X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fbootchart%2Fbootchart.c;h=543037dae1486692e876729ddd8c465b04e11fe3;hp=0c4d3e3432eb29d6b9b9b164008086054cc19934;hb=e90f9fa4d1cab6f73fc502fe9ef705c1bb2912a0;hpb=0e4ffbff01cb6b8ca1dd9f0afe61c4e4918872e7 diff --git a/src/bootchart/bootchart.c b/src/bootchart/bootchart.c index 0c4d3e343..543037dae 100644 --- a/src/bootchart/bootchart.c +++ b/src/bootchart/bootchart.c @@ -20,6 +20,17 @@ along with systemd; If not, see . ***/ +/*** + + Many thanks to those who contributed ideas and code: + - Ziga Mahkovec - Original bootchart author + - Anders Norgaard - PyBootchartgui + - Michael Meeks - bootchart2 + - Scott James Remnant - Ubuntu C-based logger + - Arjan van der Ven - for the idea to merge bootgraph.pl functionality + + ***/ + #include #include #include @@ -65,6 +76,7 @@ bool entropy = false; bool initcall = true; bool relative = false; bool filter = true; +bool show_cmdline = false; bool pss = false; int samples; int len = 500; /* we record len+1 (1 start sample) */ @@ -132,23 +144,24 @@ int main(int argc, char *argv[]) while (1) { static struct option opts[] = { - {"rel", no_argument, NULL, 'r'}, - {"freq", required_argument, NULL, 'f'}, - {"samples", required_argument, NULL, 'n'}, - {"pss", no_argument, NULL, 'p'}, - {"output", required_argument, NULL, 'o'}, - {"init", required_argument, NULL, 'i'}, - {"filter", no_argument, NULL, 'F'}, - {"help", no_argument, NULL, 'h'}, - {"scale-x", required_argument, NULL, 'x'}, - {"scale-y", required_argument, NULL, 'y'}, - {"entropy", no_argument, NULL, 'e'}, + {"rel", no_argument, NULL, 'r'}, + {"freq", required_argument, NULL, 'f'}, + {"samples", required_argument, NULL, 'n'}, + {"pss", no_argument, NULL, 'p'}, + {"output", required_argument, NULL, 'o'}, + {"init", required_argument, NULL, 'i'}, + {"no-filter", no_argument, NULL, 'F'}, + {"cmdline", no_argument, NULL, 'C'}, + {"help", no_argument, NULL, 'h'}, + {"scale-x", required_argument, NULL, 'x'}, + {"scale-y", required_argument, NULL, 'y'}, + {"entropy", no_argument, NULL, 'e'}, {NULL, 0, NULL, 0} }; gind = 0; - i = getopt_long(argc, argv, "erpf:n:o:i:Fhx:y:", opts, &gind); + i = getopt_long(argc, argv, "erpf:n:o:i:FChx:y:", opts, &gind); if (i == -1) break; switch (i) { @@ -156,13 +169,22 @@ int main(int argc, char *argv[]) relative = true; break; case 'f': - safe_atod(optarg, &hz); + r = safe_atod(optarg, &hz); + if (r < 0) + log_warning("failed to parse --freq/-f argument '%s': %s", + optarg, strerror(-r)); break; case 'F': filter = false; break; + case 'C': + show_cmdline = true; + break; case 'n': - safe_atoi(optarg, &len); + r = safe_atoi(optarg, &len); + if (r < 0) + log_warning("failed to parse --samples/-n argument '%s': %s", + optarg, strerror(-r)); break; case 'o': path_kill_slashes(optarg); @@ -176,29 +198,35 @@ int main(int argc, char *argv[]) pss = true; break; case 'x': - safe_atod(optarg, &scale_x); + r = safe_atod(optarg, &scale_x); + if (r < 0) + log_warning("failed to parse --scale-x/-x argument '%s': %s", + optarg, strerror(-r)); break; case 'y': - safe_atod(optarg, &scale_y); + r = safe_atod(optarg, &scale_y); + if (r < 0) + log_warning("failed to parse --scale-y/-y argument '%s': %s", + optarg, strerror(-r)); break; case 'e': entropy = true; break; case 'h': fprintf(stderr, "Usage: %s [OPTIONS]\n", argv[0]); - fprintf(stderr, " --rel, -r Record time relative to recording\n"); - fprintf(stderr, " --freq, -f N Sample frequency [%f]\n", hz); - fprintf(stderr, " --samples, -n N Stop sampling at [%d] samples\n", len); - fprintf(stderr, " --scale-x, -x N Scale the graph horizontally [%f] \n", scale_x); - fprintf(stderr, " --scale-y, -y N Scale the graph vertically [%f] \n", scale_y); - fprintf(stderr, " --pss, -p Enable PSS graph (CPU intensive)\n"); - fprintf(stderr, " --entropy, -e Enable the entropy_avail graph\n"); - fprintf(stderr, " --output, -o [PATH] Path to output files [%s]\n", output_path); - fprintf(stderr, " --init, -i [PATH] Path to init executable [%s]\n", init_path); - fprintf(stderr, " --filter, -F Disable filtering of processes from the graph\n"); + fprintf(stderr, " --rel, -r Record time relative to recording\n"); + fprintf(stderr, " --freq, -f f Sample frequency [%f]\n", hz); + fprintf(stderr, " --samples, -n N Stop sampling at [%d] samples\n", len); + fprintf(stderr, " --scale-x, -x N Scale the graph horizontally [%f] \n", scale_x); + fprintf(stderr, " --scale-y, -y N Scale the graph vertically [%f] \n", scale_y); + fprintf(stderr, " --pss, -p Enable PSS graph (CPU intensive)\n"); + fprintf(stderr, " --entropy, -e Enable the entropy_avail graph\n"); + fprintf(stderr, " --output, -o [PATH] Path to output files [%s]\n", output_path); + fprintf(stderr, " --init, -i [PATH] Path to init executable [%s]\n", init_path); + fprintf(stderr, " --no-filter, -F Disable filtering of processes from the graph\n"); fprintf(stderr, " that are of less importance or short-lived\n"); - fprintf(stderr, " --help, -h Display this message\n"); - fprintf(stderr, "See the installed README and bootchartd.conf.example for more information.\n"); + fprintf(stderr, " --help, -h Display this message\n"); + fprintf(stderr, "See bootchart.conf for more information.\n"); exit (EXIT_SUCCESS); break; default: @@ -217,7 +245,7 @@ int main(int argc, char *argv[]) } /* - * If the kernel executed us through init=/sbin/bootchartd, then + * If the kernel executed us through init=/usr/lib/systemd/systemd-bootchart, then * fork: * - parent execs executable specified via init_path[] (/sbin/init by default) as pid=1 * - child logs data @@ -341,13 +369,13 @@ int main(int argc, char *argv[]) } if (!of) { - perror("open output_file"); + fprintf(stderr, "opening output file '%s': %m\n", output_file); exit (EXIT_FAILURE); } svg_do(build); - fprintf(stderr, "bootchartd: Wrote %s\n", output_file); + fprintf(stderr, "systemd-bootchart wrote %s\n", output_file); fclose(of); closedir(proc); @@ -366,7 +394,7 @@ int main(int argc, char *argv[]) /* don't complain when overrun once, happens most commonly on 1st sample */ if (overrun > 1) - fprintf(stderr, "bootchartd: Warning: sample time overrun %i times\n", overrun); + fprintf(stderr, "systemd-boochart: Warning: sample time overrun %i times\n", overrun); return 0; }