diff options
author | Steven Rostedt <srostedt@redhat.com> | 2010-02-01 21:59:36 -0500 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2010-02-01 22:39:32 -0500 |
commit | 352e27b81bc706811e733dc77db29f77d3d45633 (patch) | |
tree | cbc427c9ec9311f00011eb85fdfff0e75c1afbc7 | |
parent | 4a694d0f1f680a836835ac2294f95e075af7f1d7 (diff) |
trace-cmd: Only enable filtering on the second call to enable_events
The enable_events is also used to update the filtering for the
-F option. But it should not be doing the work of enabling events again.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r-- | trace-cmd.c | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/trace-cmd.c b/trace-cmd.c index f4b493d..4416995 100644 --- a/trace-cmd.c +++ b/trace-cmd.c | |||
@@ -492,7 +492,7 @@ static void write_filter(const char *file, const char *filter) | |||
492 | } | 492 | } |
493 | } | 493 | } |
494 | 494 | ||
495 | static int enable_glob(const char *name, const char *filter) | 495 | static int enable_glob(const char *name, const char *filter, int filter_only) |
496 | { | 496 | { |
497 | glob_t globbuf; | 497 | glob_t globbuf; |
498 | FILE *fp; | 498 | FILE *fp; |
@@ -532,6 +532,10 @@ static int enable_glob(const char *name, const char *filter) | |||
532 | else | 532 | else |
533 | write_filter(filter_file, "0"); | 533 | write_filter(filter_file, "0"); |
534 | free(filter_file); | 534 | free(filter_file); |
535 | count++; | ||
536 | |||
537 | if (filter_only) | ||
538 | continue; | ||
535 | 539 | ||
536 | fp = fopen(path, "w"); | 540 | fp = fopen(path, "w"); |
537 | if (!fp) | 541 | if (!fp) |
@@ -540,8 +544,6 @@ static int enable_glob(const char *name, const char *filter) | |||
540 | fclose(fp); | 544 | fclose(fp); |
541 | if (ret < 0) | 545 | if (ret < 0) |
542 | die("writing to '%s'", path); | 546 | die("writing to '%s'", path); |
543 | |||
544 | count++; | ||
545 | } | 547 | } |
546 | globfree(&globbuf); | 548 | globfree(&globbuf); |
547 | return count; | 549 | return count; |
@@ -570,7 +572,8 @@ static void filter_all_systems(const char *filter) | |||
570 | globfree(&globbuf); | 572 | globfree(&globbuf); |
571 | } | 573 | } |
572 | 574 | ||
573 | static void enable_event(const char *name, const char *filter) | 575 | static void enable_event(const char *name, const char *filter, |
576 | int filter_only) | ||
574 | { | 577 | { |
575 | struct stat st; | 578 | struct stat st; |
576 | FILE *fp; | 579 | FILE *fp; |
@@ -585,13 +588,16 @@ static void enable_event(const char *name, const char *filter) | |||
585 | path = get_tracing_file("events/enable"); | 588 | path = get_tracing_file("events/enable"); |
586 | ret = stat(path, &st); | 589 | ret = stat(path, &st); |
587 | if (ret < 0) { | 590 | if (ret < 0) { |
591 | if (filter_only) | ||
592 | return; | ||
588 | put_tracing_file(path); | 593 | put_tracing_file(path); |
589 | /* old kernel */ | 594 | /* old kernel */ |
590 | old_enable_events(name); | 595 | old_enable_events(name); |
591 | return; | 596 | return; |
592 | } | 597 | } |
593 | 598 | ||
594 | fprintf(stderr, "enable %s\n", name); | 599 | if (!filter_only) |
600 | fprintf(stderr, "enable %s\n", name); | ||
595 | 601 | ||
596 | /* We allow the user to use "all" to enable all events */ | 602 | /* We allow the user to use "all" to enable all events */ |
597 | 603 | ||
@@ -601,6 +607,11 @@ static void enable_event(const char *name, const char *filter) | |||
601 | else | 607 | else |
602 | filter_all_systems("0"); | 608 | filter_all_systems("0"); |
603 | 609 | ||
610 | if (filter_only) { | ||
611 | put_tracing_file(path); | ||
612 | return; | ||
613 | } | ||
614 | |||
604 | fp = fopen(path, "w"); | 615 | fp = fopen(path, "w"); |
605 | if (!fp) | 616 | if (!fp) |
606 | die("writing to '%s'", path); | 617 | die("writing to '%s'", path); |
@@ -622,7 +633,7 @@ static void enable_event(const char *name, const char *filter) | |||
622 | str[len] = 0; | 633 | str[len] = 0; |
623 | ptr++; | 634 | ptr++; |
624 | if (!strlen(ptr) || strcmp(ptr, "*") == 0) { | 635 | if (!strlen(ptr) || strcmp(ptr, "*") == 0) { |
625 | ret = enable_glob(str, filter); | 636 | ret = enable_glob(str, filter, filter_only); |
626 | free(str); | 637 | free(str); |
627 | put_tracing_file(path); | 638 | put_tracing_file(path); |
628 | if (!ret) | 639 | if (!ret) |
@@ -632,7 +643,7 @@ static void enable_event(const char *name, const char *filter) | |||
632 | 643 | ||
633 | str[len] = '/'; | 644 | str[len] = '/'; |
634 | 645 | ||
635 | ret = enable_glob(str, filter); | 646 | ret = enable_glob(str, filter, filter_only); |
636 | free(str); | 647 | free(str); |
637 | if (!ret) | 648 | if (!ret) |
638 | die("No events enabled with %s", name); | 649 | die("No events enabled with %s", name); |
@@ -640,12 +651,12 @@ static void enable_event(const char *name, const char *filter) | |||
640 | } | 651 | } |
641 | 652 | ||
642 | /* No ':' so enable all matching systems and events */ | 653 | /* No ':' so enable all matching systems and events */ |
643 | ret = enable_glob(name, filter); | 654 | ret = enable_glob(name, filter, filter_only); |
644 | 655 | ||
645 | len = strlen(name) + strlen("*/") + 1; | 656 | len = strlen(name) + strlen("*/") + 1; |
646 | str = malloc_or_die(len); | 657 | str = malloc_or_die(len); |
647 | snprintf(str, len, "*/%s", name); | 658 | snprintf(str, len, "*/%s", name); |
648 | ret2 = enable_glob(str, filter); | 659 | ret2 = enable_glob(str, filter, filter_only); |
649 | free(str); | 660 | free(str); |
650 | 661 | ||
651 | if (!ret && !ret2) | 662 | if (!ret && !ret2) |
@@ -773,7 +784,7 @@ static void update_pid_event_filters(char *pid) | |||
773 | strcat(event->filter, filter); | 784 | strcat(event->filter, filter); |
774 | } else | 785 | } else |
775 | event->filter = strdup(filter); | 786 | event->filter = strdup(filter); |
776 | enable_event(event->event, event->filter); | 787 | enable_event(event->event, event->filter, 1); |
777 | } | 788 | } |
778 | } | 789 | } |
779 | 790 | ||
@@ -786,7 +797,7 @@ static void enable_events(void) | |||
786 | 797 | ||
787 | for (event = event_selection; event; event = event->next) { | 798 | for (event = event_selection; event; event = event->next) { |
788 | if (!event->neg) | 799 | if (!event->neg) |
789 | enable_event(event->event, event->filter); | 800 | enable_event(event->event, event->filter, 0); |
790 | } | 801 | } |
791 | 802 | ||
792 | /* Now disable any events */ | 803 | /* Now disable any events */ |