aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/builtin-timechart.c
diff options
context:
space:
mode:
authorFrederic Weisbecker <fweisbec@gmail.com>2010-04-23 19:18:48 -0400
committerFrederic Weisbecker <fweisbec@gmail.com>2010-04-23 21:50:46 -0400
commit9df9bbba9f7e2e4ffdc51bbbfa524b67691321d2 (patch)
tree7bdecf74c8895e69cfb550071801a548ac6567c9 /tools/perf/builtin-timechart.c
parente0a808c65c23f88e48a5fff48775b90e7919c64f (diff)
perf: Use generic sample reordering in perf timechart
Use the new generic sample events reordering from perf timechart, this drops the ad hoc sample reordering it was using before. Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Hitoshi Mitake <mitake@dcl.info.waseda.ac.jp> Cc: Ingo Molnar <mingo@elte.hu> Cc: Masami Hiramatsu <mhiramat@redhat.com> Cc: Tom Zanussi <tzanussi@gmail.com> Cc: Arjan van de Ven <arjan@linux.intel.com>
Diffstat (limited to 'tools/perf/builtin-timechart.c')
-rw-r--r--tools/perf/builtin-timechart.c112
1 files changed, 5 insertions, 107 deletions
diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c
index 96f4a092df37..c35aa44f82ba 100644
--- a/tools/perf/builtin-timechart.c
+++ b/tools/perf/builtin-timechart.c
@@ -143,9 +143,6 @@ struct wake_event {
143static struct power_event *power_events; 143static struct power_event *power_events;
144static struct wake_event *wake_events; 144static struct wake_event *wake_events;
145 145
146struct sample_wrapper *all_samples;
147
148
149struct process_filter; 146struct process_filter;
150struct process_filter { 147struct process_filter {
151 char *name; 148 char *name;
@@ -566,88 +563,6 @@ static void end_sample_processing(void)
566 } 563 }
567} 564}
568 565
569static u64 sample_time(event_t *event, const struct perf_session *session)
570{
571 int cursor;
572
573 cursor = 0;
574 if (session->sample_type & PERF_SAMPLE_IP)
575 cursor++;
576 if (session->sample_type & PERF_SAMPLE_TID)
577 cursor++;
578 if (session->sample_type & PERF_SAMPLE_TIME)
579 return event->sample.array[cursor];
580 return 0;
581}
582
583
584/*
585 * We first queue all events, sorted backwards by insertion.
586 * The order will get flipped later.
587 */
588static int queue_sample_event(event_t *event, struct perf_session *session)
589{
590 struct sample_wrapper *copy, *prev;
591 int size;
592
593 size = event->sample.header.size + sizeof(struct sample_wrapper) + 8;
594
595 copy = malloc(size);
596 if (!copy)
597 return 1;
598
599 memset(copy, 0, size);
600
601 copy->next = NULL;
602 copy->timestamp = sample_time(event, session);
603
604 memcpy(&copy->data, event, event->sample.header.size);
605
606 /* insert in the right place in the list */
607
608 if (!all_samples) {
609 /* first sample ever */
610 all_samples = copy;
611 return 0;
612 }
613
614 if (all_samples->timestamp < copy->timestamp) {
615 /* insert at the head of the list */
616 copy->next = all_samples;
617 all_samples = copy;
618 return 0;
619 }
620
621 prev = all_samples;
622 while (prev->next) {
623 if (prev->next->timestamp < copy->timestamp) {
624 copy->next = prev->next;
625 prev->next = copy;
626 return 0;
627 }
628 prev = prev->next;
629 }
630 /* insert at the end of the list */
631 prev->next = copy;
632
633 return 0;
634}
635
636static void sort_queued_samples(void)
637{
638 struct sample_wrapper *cursor, *next;
639
640 cursor = all_samples;
641 all_samples = NULL;
642
643 while (cursor) {
644 next = cursor->next;
645 cursor->next = all_samples;
646 all_samples = cursor;
647 cursor = next;
648 }
649}
650
651/* 566/*
652 * Sort the pid datastructure 567 * Sort the pid datastructure
653 */ 568 */
@@ -1011,26 +926,12 @@ static void write_svg_file(const char *filename)
1011 svg_close(); 926 svg_close();
1012} 927}
1013 928
1014static void process_samples(struct perf_session *session)
1015{
1016 struct sample_wrapper *cursor;
1017 event_t *event;
1018
1019 sort_queued_samples();
1020
1021 cursor = all_samples;
1022 while (cursor) {
1023 event = (void *)&cursor->data;
1024 cursor = cursor->next;
1025 process_sample_event(event, session);
1026 }
1027}
1028
1029static struct perf_event_ops event_ops = { 929static struct perf_event_ops event_ops = {
1030 .comm = process_comm_event, 930 .comm = process_comm_event,
1031 .fork = process_fork_event, 931 .fork = process_fork_event,
1032 .exit = process_exit_event, 932 .exit = process_exit_event,
1033 .sample = queue_sample_event, 933 .sample = process_sample_event,
934 .ordered_samples = true,
1034}; 935};
1035 936
1036static int __cmd_timechart(void) 937static int __cmd_timechart(void)
@@ -1048,8 +949,6 @@ static int __cmd_timechart(void)
1048 if (ret) 949 if (ret)
1049 goto out_delete; 950 goto out_delete;
1050 951
1051 process_samples(session);
1052
1053 end_sample_processing(); 952 end_sample_processing();
1054 953
1055 sort_pids(); 954 sort_pids();
@@ -1072,7 +971,6 @@ static const char *record_args[] = {
1072 "record", 971 "record",
1073 "-a", 972 "-a",
1074 "-R", 973 "-R",
1075 "-M",
1076 "-f", 974 "-f",
1077 "-c", "1", 975 "-c", "1",
1078 "-e", "power:power_start", 976 "-e", "power:power_start",