aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2009-12-15 21:13:00 -0500
committerSteven Rostedt <rostedt@goodmis.org>2009-12-15 21:13:00 -0500
commit861ba2a81310fd290101d04547c0a13c423b22cd (patch)
treebbb5b5cd7fb1ecce74d17c1bc1420fe7abb3bc98
parent9b961aa74b44b0952232626c5e819161d3517035 (diff)
trace-cmd: Add negating of events
Add the '-v' option to disable events. This is advantageous with: trace-cmd record -e all -v -e lock -e syscalls This will enable all events and then disable lock and syscall events before executing the command. Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r--trace-cmd.c37
1 files changed, 34 insertions, 3 deletions
diff --git a/trace-cmd.c b/trace-cmd.c
index 879d9ad..ac14a61 100644
--- a/trace-cmd.c
+++ b/trace-cmd.c
@@ -58,6 +58,7 @@ static int *pids;
58struct event_list { 58struct event_list {
59 struct event_list *next; 59 struct event_list *next;
60 const char *event; 60 const char *event;
61 int neg;
61}; 62};
62 63
63static struct event_list *event_selection; 64static struct event_list *event_selection;
@@ -424,7 +425,24 @@ static void disable_event(const char *name)
424 put_tracing_file(path); 425 put_tracing_file(path);
425 fwrite("0", 1, 1, fp); 426 fwrite("0", 1, 1, fp);
426 fclose(fp); 427 fclose(fp);
428 return;
427 } 429 }
430
431 path = get_tracing_file("set_event");
432 fp = fopen(path, "a");
433 if (!fp)
434 die("writing to '%s'", path);
435 put_tracing_file(path);
436 ret = fwrite("!", 1, 1, fp);
437 if (ret < 0)
438 die("can't write negative");
439 ret = fwrite(name, 1, strlen(name), fp);
440 if (ret < 0)
441 die("bad event '%s'", name);
442 ret = fwrite("\n", 1, 1, fp);
443 if (ret < 0)
444 die("bad event '%s'", name);
445 fclose(fp);
428} 446}
429 447
430static void enable_tracing(void) 448static void enable_tracing(void)
@@ -497,7 +515,14 @@ static void enable_events(void)
497 struct event_list *event; 515 struct event_list *event;
498 516
499 for (event = event_selection; event; event = event->next) { 517 for (event = event_selection; event; event = event->next) {
500 enable_event(event->event); 518 if (!event->neg)
519 enable_event(event->event);
520 }
521
522 /* Now disable any events */
523 for (event = event_selection; event; event = event->next) {
524 if (event->neg)
525 disable_event(event->event);
501 } 526 }
502} 527}
503 528
@@ -631,9 +656,10 @@ void usage(char **argv)
631 printf("\n" 656 printf("\n"
632 "%s version %s\n\n" 657 "%s version %s\n\n"
633 "usage:\n" 658 "usage:\n"
634 " %s record [-e event][-p plugin][-d][-o file][-s usecs][-O option ] [command ...]\n" 659 " %s record [-v][-e event][-p plugin][-d][-o file][-s usecs][-O option ] [command ...]\n"
635 " -e run command with event enabled\n" 660 " -e run command with event enabled\n"
636 " -p run command with plugin enabled\n" 661 " -p run command with plugin enabled\n"
662 " -v will negate all -e after it (disable those events)\n"
637 " -d disable function tracer when running\n" 663 " -d disable function tracer when running\n"
638 " -o data output file [default trace.dat]\n" 664 " -o data output file [default trace.dat]\n"
639 " -O option to enable (or disable)\n" 665 " -O option to enable (or disable)\n"
@@ -680,6 +706,7 @@ int main (int argc, char **argv)
680 int options = 0; 706 int options = 0;
681 int record = 0; 707 int record = 0;
682 int run_command = 0; 708 int run_command = 0;
709 int neg_event = 0;
683 int fset; 710 int fset;
684 int cpu; 711 int cpu;
685 712
@@ -696,7 +723,7 @@ int main (int argc, char **argv)
696 } else if ((record = (strcmp(argv[1], "record") == 0)) || 723 } else if ((record = (strcmp(argv[1], "record") == 0)) ||
697 (strcmp(argv[1], "start") == 0)) { 724 (strcmp(argv[1], "start") == 0)) {
698 725
699 while ((c = getopt(argc-1, argv+1, "+he:p:do:O:")) >= 0) { 726 while ((c = getopt(argc-1, argv+1, "+he:p:do:O:s:v")) >= 0) {
700 switch (c) { 727 switch (c) {
701 case 'h': 728 case 'h':
702 usage(argv); 729 usage(argv);
@@ -706,8 +733,12 @@ int main (int argc, char **argv)
706 event = malloc_or_die(sizeof(*event)); 733 event = malloc_or_die(sizeof(*event));
707 event->event = optarg; 734 event->event = optarg;
708 event->next = event_selection; 735 event->next = event_selection;
736 event->neg = neg_event;
709 event_selection = event; 737 event_selection = event;
710 break; 738 break;
739 case 'v':
740 neg_event = 1;
741 break;
711 case 'p': 742 case 'p':
712 if (plugin) 743 if (plugin)
713 die("only one plugin allowed"); 744 die("only one plugin allowed");