aboutsummaryrefslogtreecommitdiffstats
path: root/rt-plot.c
diff options
context:
space:
mode:
Diffstat (limited to 'rt-plot.c')
-rw-r--r--rt-plot.c53
1 files changed, 38 insertions, 15 deletions
diff --git a/rt-plot.c b/rt-plot.c
index c45ee0e..10f8b2d 100644
--- a/rt-plot.c
+++ b/rt-plot.c
@@ -7,13 +7,20 @@
7 */ 7 */
8struct record* 8struct record*
9__find_rt_record(struct graph_info *ginfo, struct rt_plot_common *rt_info, 9__find_rt_record(struct graph_info *ginfo, struct rt_plot_common *rt_info,
10 guint64 time, int display) 10 guint64 time, int display, unsigned long long range)
11{ 11{
12 int next_cpu, match, eid, ignored; 12 int next_cpu, match, eid, ignored;
13 struct record *record; 13 struct record *record;
14 14
15 set_cpus_to_rts(ginfo, time); 15 set_cpus_to_rts(ginfo, time);
16 while ((record = tracecmd_read_next_data(ginfo->handle, &next_cpu))) { 16 while ((record = tracecmd_read_next_data(ginfo->handle, &next_cpu))) {
17
18 if (range && get_rts(ginfo, record) >= time + range) {
19 free_record(record);
20 record = NULL;
21 break;
22 }
23
17 eid = pevent_data_type(ginfo->pevent, record); 24 eid = pevent_data_type(ginfo->pevent, record);
18 ignored = (eid == ginfo->event_sched_switch_id); 25 ignored = (eid == ginfo->event_sched_switch_id);
19 if (!ignored && display) { 26 if (!ignored && display) {
@@ -65,14 +72,17 @@ rt_plot_display_last_event(struct graph_info *ginfo, struct graph_plot *plot,
65} 72}
66 73
67static struct record* 74static struct record*
68find_prev_record(struct graph_info *ginfo, struct rt_plot_common *rt_info, 75find_prev_display_record(struct graph_info *ginfo, struct rt_plot_common *rt_info,
69 unsigned long long time) 76 unsigned long long time, unsigned long long range)
70{ 77{
71 int eid, ignored, match, cpu; 78 int eid, ignored, match, cpu;
72 struct record *prev, *res = NULL; 79 struct record *prev, *res = NULL;
73 unsigned long long min_ts; 80 unsigned long long min_ts;
74 81
75 min_ts = time - max_rt_search(ginfo); 82 if (range)
83 min_ts = time - range;
84 else
85 min_ts = time - max_rt_search(ginfo);
76 86
77 set_cpus_to_rts(ginfo, time); 87 set_cpus_to_rts(ginfo, time);
78 88
@@ -111,17 +121,25 @@ rt_plot_display_info(struct graph_info *ginfo, struct graph_plot *plot,
111 struct rt_plot_common *rt_info = plot->private; 121 struct rt_plot_common *rt_info = plot->private;
112 struct event_format *event; 122 struct event_format *event;
113 struct record *record, *prev_record; 123 struct record *record, *prev_record;
114 unsigned long long msec, nsec, rts; 124 unsigned long long msec, nsec, rts, ptime, rtime, range;
125 long long pdiff, rdiff;
115 int eid; 126 int eid;
116 127
117 record = rt_info->write_header(rt_info, ginfo, s, time); 128 rt_info->write_header(rt_info, ginfo, s, time);
118 prev_record = find_prev_record(ginfo, rt_info, time); 129
119 130 /* Stupid, fix to use resolution */
120 if (!record || (prev_record && prev_record != record && 131 range = 2 / ginfo->resolution;
121 (time - get_rts(ginfo, prev_record)) < 132 record = __find_rt_record(ginfo, rt_info, time, 1, range);
122 (get_rts(ginfo, record) - time))) { 133 prev_record = find_prev_display_record(ginfo, rt_info, time, range);
123 free_record(record); 134
124 record = prev_record; 135 if (!record) {
136 record = prev_record;
137 } else if (prev_record) {
138 ptime = get_rts(ginfo, prev_record);
139 rtime = get_rts(ginfo, record);
140 pdiff = (ptime < time) ? time - ptime : ptime - time;
141 rdiff = (rtime < time) ? time - rtime : rtime - time;
142 record = (pdiff < rdiff) ? prev_record : record;
125 } 143 }
126 144
127 if (record) { 145 if (record) {
@@ -137,6 +155,8 @@ rt_plot_display_info(struct graph_info *ginfo, struct graph_plot *plot,
137 pevent_event_info(s, event, record); 155 pevent_event_info(s, event, record);
138 } else 156 } else
139 trace_seq_printf(s, "\nUNKNOWN EVENT %d\n", eid); 157 trace_seq_printf(s, "\nUNKNOWN EVENT %d\n", eid);
158 } else {
159 trace_seq_printf(s, "Failsauce\n");
140 } 160 }
141 trace_seq_putc(s, '\n'); 161 trace_seq_putc(s, '\n');
142 nano_to_milli(time, &msec, &nsec); 162 nano_to_milli(time, &msec, &nsec);
@@ -349,15 +369,19 @@ struct record* get_previous_release(struct graph_info *ginfo, int match_tid,
349 unsigned long long release, deadline, min_ts; 369 unsigned long long release, deadline, min_ts;
350 struct record *last_rec = NULL, *rec, *ret = NULL; 370 struct record *last_rec = NULL, *rec, *ret = NULL;
351 371
372 *out_job = -2;
373
352 min_ts = time - max_rt_search(ginfo); 374 min_ts = time - max_rt_search(ginfo);
353 375
354 /* The release record could have occurred on any CPU. Search all */ 376 /* The release record could have occurred on any CPU. Search all */
355 for (cpu = 0; cpu < ginfo->cpus; cpu++) { 377 for (cpu = 0; cpu < ginfo->cpus; cpu++) {
378 set_cpu_to_rts(ginfo, time, cpu);
356 last_rec = tracecmd_peek_data(ginfo->handle, cpu); 379 last_rec = tracecmd_peek_data(ginfo->handle, cpu);
357 380
358 /* Require a record to start with */ 381 /* Require a record to start with */
359 if (!last_rec) 382 if (!last_rec) {
360 goto loop_end; 383 goto loop_end;
384 }
361 last_rec->ref_count++; 385 last_rec->ref_count++;
362 386
363 while ((rec = tracecmd_read_prev(ginfo->handle, last_rec))) { 387 while ((rec = tracecmd_read_prev(ginfo->handle, last_rec))) {
@@ -384,7 +408,6 @@ struct record* get_previous_release(struct graph_info *ginfo, int match_tid,
384 *out_release = release; 408 *out_release = release;
385 *out_deadline = deadline; 409 *out_deadline = deadline;
386 } 410 }
387
388 last_rec = NULL; 411 last_rec = NULL;
389 goto loop_end; 412 goto loop_end;
390 } 413 }