diff options
| author | Steven Rostedt <srostedt@redhat.com> | 2010-02-08 15:02:13 -0500 |
|---|---|---|
| committer | Steven Rostedt <rostedt@goodmis.org> | 2010-02-10 10:58:45 -0500 |
| commit | b391d4e5acbf1f243b316f6f024137fa614a0d2d (patch) | |
| tree | 8b6f777c9e8d87e8dde6fe41463b97624cd7a818 | |
| parent | 7d359f826170f08cc97a683cb48e4051c7a79117 (diff) | |
trace-graph: Add find_record to plots for popup windows
The popup needs a record to use to determin if a task should be
added to the filter or not. Add the method find_record to the
plot callback structure.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
| -rw-r--r-- | trace-graph.c | 12 | ||||
| -rw-r--r-- | trace-graph.h | 10 | ||||
| -rw-r--r-- | trace-plot-cpu.c | 39 | ||||
| -rw-r--r-- | trace-plot.c | 11 |
4 files changed, 66 insertions, 6 deletions
diff --git a/trace-graph.c b/trace-graph.c index 026d940..67cae96 100644 --- a/trace-graph.c +++ b/trace-graph.c | |||
| @@ -456,13 +456,14 @@ do_pop_up(GtkWidget *widget, GdkEventButton *event, gpointer data) | |||
| 456 | static GtkWidget *menu_filter_hide_task; | 456 | static GtkWidget *menu_filter_hide_task; |
| 457 | static GtkWidget *menu_filter_clear_tasks; | 457 | static GtkWidget *menu_filter_clear_tasks; |
| 458 | struct record *record = NULL; | 458 | struct record *record = NULL; |
| 459 | struct graph_plot *plot; | ||
| 459 | const char *comm; | 460 | const char *comm; |
| 460 | guint64 time; | 461 | guint64 time; |
| 461 | gchar *text; | 462 | gchar *text; |
| 462 | gint pid; | 463 | gint pid; |
| 463 | gint len; | 464 | gint len; |
| 464 | gint x, y; | 465 | gint x, y; |
| 465 | gint cpu; | 466 | gint i; |
| 466 | 467 | ||
| 467 | x = event->x; | 468 | x = event->x; |
| 468 | y = event->y; | 469 | y = event->y; |
| @@ -523,10 +524,11 @@ do_pop_up(GtkWidget *widget, GdkEventButton *event, gpointer data) | |||
| 523 | 524 | ||
| 524 | time = convert_x_to_time(ginfo, x); | 525 | time = convert_x_to_time(ginfo, x); |
| 525 | 526 | ||
| 526 | for (cpu = 0; cpu < ginfo->cpus; cpu++) { | 527 | for (i = 0; i < ginfo->plots; i++) { |
| 527 | if (y >= (PLOT_TOP(cpu) - PLOT_GIVE) && | 528 | if (y >= (PLOT_TOP(i) - PLOT_GIVE) && |
| 528 | y <= (PLOT_BOTTOM(cpu) + PLOT_GIVE)) { | 529 | y <= (PLOT_BOTTOM(i) + PLOT_GIVE)) { |
| 529 | record = find_record_on_cpu(ginfo, cpu, time); | 530 | plot = ginfo->plot_array[i]; |
| 531 | record = trace_graph_plot_find_record(ginfo, plot, time); | ||
| 530 | break; | 532 | break; |
| 531 | } | 533 | } |
| 532 | } | 534 | } |
diff --git a/trace-graph.h b/trace-graph.h index 343a769..7427785 100644 --- a/trace-graph.h +++ b/trace-graph.h | |||
| @@ -46,6 +46,9 @@ struct graph_plot; | |||
| 46 | * a event, the plot may ask to display that event. | 46 | * a event, the plot may ask to display that event. |
| 47 | * The time will be given to find the event, the time may be before | 47 | * The time will be given to find the event, the time may be before |
| 48 | * the given event. | 48 | * the given event. |
| 49 | * | ||
| 50 | * find_record: | ||
| 51 | * return a tracecmd record for a given time. | ||
| 49 | */ | 52 | */ |
| 50 | struct plot_callbacks { | 53 | struct plot_callbacks { |
| 51 | int (*match_time)(struct graph_info *, struct graph_plot *, | 54 | int (*match_time)(struct graph_info *, struct graph_plot *, |
| @@ -62,6 +65,8 @@ struct plot_callbacks { | |||
| 62 | void (*end)(struct graph_info *, struct graph_plot *); | 65 | void (*end)(struct graph_info *, struct graph_plot *); |
| 63 | int (*display_last_event)(struct graph_info *ginfo, struct graph_plot *plot, | 66 | int (*display_last_event)(struct graph_info *ginfo, struct graph_plot *plot, |
| 64 | struct trace_seq *s, unsigned long long time); | 67 | struct trace_seq *s, unsigned long long time); |
| 68 | struct record *(*find_record)(struct graph_info *, struct graph_plot *, | ||
| 69 | unsigned long long time); | ||
| 65 | }; | 70 | }; |
| 66 | 71 | ||
| 67 | struct graph_plot { | 72 | struct graph_plot { |
| @@ -239,6 +244,11 @@ int trace_graph_plot_event(struct graph_info *ginfo, | |||
| 239 | void trace_graph_plot_end(struct graph_info *ginfo, | 244 | void trace_graph_plot_end(struct graph_info *ginfo, |
| 240 | struct graph_plot *plot); | 245 | struct graph_plot *plot); |
| 241 | 246 | ||
| 247 | struct record * | ||
| 248 | trace_graph_plot_find_record(struct graph_info *ginfo, | ||
| 249 | struct graph_plot *plot, | ||
| 250 | unsigned long long time); | ||
| 251 | |||
| 242 | /* cpu plot */ | 252 | /* cpu plot */ |
| 243 | void graph_plot_init_cpus(struct graph_info *ginfo, int cpus); | 253 | void graph_plot_init_cpus(struct graph_info *ginfo, int cpus); |
| 244 | 254 | ||
diff --git a/trace-plot-cpu.c b/trace-plot-cpu.c index b1adb91..5d37950 100644 --- a/trace-plot-cpu.c +++ b/trace-plot-cpu.c | |||
| @@ -275,12 +275,49 @@ static int cpu_plot_event(struct graph_info *ginfo, | |||
| 275 | return ret; | 275 | return ret; |
| 276 | } | 276 | } |
| 277 | 277 | ||
| 278 | static struct record * | ||
| 279 | find_record_on_cpu(struct graph_info *ginfo, gint cpu, guint64 time) | ||
| 280 | { | ||
| 281 | struct record *record = NULL; | ||
| 282 | guint64 offset = 0; | ||
| 283 | |||
| 284 | tracecmd_set_cpu_to_timestamp(ginfo->handle, cpu, time); | ||
| 285 | do { | ||
| 286 | if (record) { | ||
| 287 | offset = record->offset; | ||
| 288 | free_record(record); | ||
| 289 | } | ||
| 290 | record = tracecmd_read_data(ginfo->handle, cpu); | ||
| 291 | } while (record && record->ts <= (time - 1 / ginfo->resolution)); | ||
| 292 | |||
| 293 | if (record) { | ||
| 294 | if (record->ts > (time + 1 / ginfo->resolution) && offset) { | ||
| 295 | free_record(record); | ||
| 296 | record = tracecmd_read_at(ginfo->handle, offset, NULL); | ||
| 297 | } | ||
| 298 | } | ||
| 299 | |||
| 300 | return record; | ||
| 301 | } | ||
| 302 | |||
| 303 | static struct record * | ||
| 304 | cpu_plot_find_record(struct graph_info *ginfo, struct graph_plot *plot, | ||
| 305 | unsigned long long time) | ||
| 306 | { | ||
| 307 | struct cpu_plot_info *cpu_info = plot->private; | ||
| 308 | int cpu; | ||
| 309 | |||
| 310 | cpu = cpu_info->cpu; | ||
| 311 | |||
| 312 | return find_record_on_cpu(ginfo, cpu, time); | ||
| 313 | } | ||
| 278 | 314 | ||
| 279 | static const struct plot_callbacks cpu_plot_cb = { | 315 | static const struct plot_callbacks cpu_plot_cb = { |
| 280 | .match_time = cpu_plot_match_time, | 316 | .match_time = cpu_plot_match_time, |
| 281 | .plot_event = cpu_plot_event, | 317 | .plot_event = cpu_plot_event, |
| 282 | .start = cpu_plot_start, | 318 | .start = cpu_plot_start, |
| 283 | .display_last_event = cpu_plot_display_last_event | 319 | .display_last_event = cpu_plot_display_last_event, |
| 320 | .find_record = cpu_plot_find_record, | ||
| 284 | }; | 321 | }; |
| 285 | 322 | ||
| 286 | void graph_plot_init_cpus(struct graph_info *ginfo, int cpus) | 323 | void graph_plot_init_cpus(struct graph_info *ginfo, int cpus) |
diff --git a/trace-plot.c b/trace-plot.c index 7a3e5dd..0cc8919 100644 --- a/trace-plot.c +++ b/trace-plot.c | |||
| @@ -121,3 +121,14 @@ int trace_graph_plot_display_last_event(struct graph_info *ginfo, | |||
| 121 | 121 | ||
| 122 | return plot->cb->display_last_event(ginfo, plot, s, time); | 122 | return plot->cb->display_last_event(ginfo, plot, s, time); |
| 123 | } | 123 | } |
| 124 | |||
| 125 | struct record * | ||
| 126 | trace_graph_plot_find_record(struct graph_info *ginfo, | ||
| 127 | struct graph_plot *plot, | ||
| 128 | unsigned long long time) | ||
| 129 | { | ||
| 130 | if (!plot->cb->find_record) | ||
| 131 | return 0; | ||
| 132 | |||
| 133 | return plot->cb->find_record(ginfo, plot, time); | ||
| 134 | } | ||
