aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan <hermanjl@hermanjl-Aspire-5553G.(none)>2012-03-08 13:00:37 -0500
committerJonathan <hermanjl@hermanjl-Aspire-5553G.(none)>2012-03-08 13:00:37 -0500
commit0164fce222ab4582bf9a61cdcb0ee5e87af018d6 (patch)
tree64ed94c6d17da3d21b85bc659d5f7f664d2f6e18
parente15cf27a6fb6f8498def2a4e036483fd7089a530 (diff)
rt-graph: added real-time shapes to graph
-rw-r--r--rt-plot-task.c51
-rw-r--r--trace-graph.c98
-rw-r--r--trace-plot.c8
3 files changed, 143 insertions, 14 deletions
diff --git a/rt-plot-task.c b/rt-plot-task.c
index 9e8ffe7..b6d794d 100644
--- a/rt-plot-task.c
+++ b/rt-plot-task.c
@@ -93,7 +93,7 @@ next_box_record(struct graph_info *ginfo, struct rt_task_info *rtt_info,
93static struct record* 93static struct record*
94__find_record(struct graph_info *ginfo, gint pid, guint64 time, int display) 94__find_record(struct graph_info *ginfo, gint pid, guint64 time, int display)
95{ 95{
96 int next_cpu, match, eid, is_sa = 0; 96 int next_cpu, match, eid, ignored= 0;
97 struct record *record = NULL; 97 struct record *record = NULL;
98 struct rt_graph_info *rtg_info = &ginfo->rtg_info; 98 struct rt_graph_info *rtg_info = &ginfo->rtg_info;
99 99
@@ -106,9 +106,15 @@ __find_record(struct graph_info *ginfo, gint pid, guint64 time, int display)
106 match = record_matches_pid(ginfo, record, pid); 106 match = record_matches_pid(ginfo, record, pid);
107 if (display) { 107 if (display) {
108 eid = pevent_data_type(ginfo->pevent, record); 108 eid = pevent_data_type(ginfo->pevent, record);
109 is_sa = (eid == rtg_info->switch_away_id); 109 ignored = (eid == rtg_info->switch_away_id ||
110 eid == rtg_info->switch_to_id ||
111 eid == rtg_info->task_completion_id ||
112 eid == rtg_info->task_block_id ||
113 eid == rtg_info->task_resume_id ||
114 eid == rtg_info->task_release_id);
110 } 115 }
111 } while (!(get_rts(ginfo, record) > time && match && !is_sa)); 116 ignored = ignored && eid == ginfo->event_sched_switch_id;
117 } while (!(get_rts(ginfo, record) > time && match && !ignored));
112 118
113 return record; 119 return record;
114} 120}
@@ -358,12 +364,12 @@ static int try_resume(struct graph_info *ginfo, struct rt_task_info *rtt_info,
358 match = rt_graph_check_task_resume(&ginfo->rtg_info, ginfo->pevent, 364 match = rt_graph_check_task_resume(&ginfo->rtg_info, ginfo->pevent,
359 record, &pid, &ts); 365 record, &pid, &ts);
360 if (match && pid == rtt_info->pid) { 366 if (match && pid == rtt_info->pid) {
361 /* info->box = TRUE; */ 367 info->box = TRUE;
362 /* info->bcolor = 0x0; */ 368 info->bcolor = 0x0;
363 /* info->bfill = TRUE; */ 369 info->bfill = TRUE;
364 /* info->bthin = TRUE; */ 370 info->bthin = TRUE;
365 /* info->bstart = rtt_info->block_time; */ 371 info->bstart = rtt_info->block_time;
366 /* info->bend = ts; */ 372 info->bend = ts;
367 rtt_info->fresh = FALSE; 373 rtt_info->fresh = FALSE;
368 374
369 rtt_info->block_time = 0ULL; 375 rtt_info->block_time = 0ULL;
@@ -442,7 +448,8 @@ static int try_other(struct graph_info *ginfo, struct rt_task_info *rtt_info,
442 my_pid = (pid == epid); 448 my_pid = (pid == epid);
443 my_cpu = (rtt_info->run_time && record->cpu == rtt_info->run_cpu); 449 my_cpu = (rtt_info->run_time && record->cpu == rtt_info->run_cpu);
444 not_sa = (eid != ginfo->rtg_info.switch_away_id); 450 not_sa = (eid != ginfo->rtg_info.switch_away_id);
445 if (not_sa && (my_pid || my_cpu)) { 451 if (not_sa && (my_pid || my_cpu) &&
452 eid != ginfo->event_sched_switch_id) {
446 info->line = TRUE; 453 info->line = TRUE;
447 info->lcolor = hash_pid(record->cpu); 454 info->lcolor = hash_pid(record->cpu);
448 info->ltime = ts; 455 info->ltime = ts;
@@ -469,6 +476,13 @@ static void do_plot_end(struct graph_info *ginfo, struct rt_task_info *rtt_info,
469 info->blabel = rtt_info->label; 476 info->blabel = rtt_info->label;
470 } else if (rtt_info->block_time && rtt_info->block_cpu != NO_CPU) { 477 } else if (rtt_info->block_time && rtt_info->block_cpu != NO_CPU) {
471 /* Blocking happened */ 478 /* Blocking happened */
479 info->box = TRUE;
480 info->bcolor = 0x0;
481 info->bfill = TRUE;
482 info->bthin = TRUE;
483 info->bstart = rtt_info->block_time;
484 info->bend = ginfo->view_end_time;
485 rtt_info->fresh = FALSE;
472 } else if (rtt_info->fresh) { 486 } else if (rtt_info->fresh) {
473 /* Nothing happened!*/ 487 /* Nothing happened!*/
474 record = next_box_record(ginfo, rtt_info, 488 record = next_box_record(ginfo, rtt_info,
@@ -484,6 +498,13 @@ static void do_plot_end(struct graph_info *ginfo, struct rt_task_info *rtt_info,
484 info->bend = ginfo->view_end_time; 498 info->bend = ginfo->view_end_time;
485 } else if (eid == rtg_info->task_resume_id) { 499 } else if (eid == rtg_info->task_resume_id) {
486 /* In a block */ 500 /* In a block */
501 info->box = TRUE;
502 info->bcolor = 0x0;
503 info->bfill = TRUE;
504 info->bthin = TRUE;
505 info->bstart = ginfo->view_start_time;
506 info->bend = ginfo->view_end_time;
507 rtt_info->fresh = FALSE;
487 } 508 }
488 free_record(record); 509 free_record(record);
489 } 510 }
@@ -614,6 +635,16 @@ static int rt_task_plot_display_info(struct graph_info *ginfo,
614 if (record) { 635 if (record) {
615 rts = get_rts(ginfo, record); 636 rts = get_rts(ginfo, record);
616 eid = pevent_data_type(ginfo->pevent, record); 637 eid = pevent_data_type(ginfo->pevent, record);
638
639 if (in_res(ginfo, deadline, time)) {
640 trace_seq_printf(s, "litmus_deadline for %d:%d at %llu\n",
641 pid, job, deadline);
642 }
643 if (in_res(ginfo, release, time)) {
644 trace_seq_printf(s, "litmus_release for %d:%d at %llu\n",
645 pid, job, release);
646 }
647
617 if (in_res(ginfo, rts, time)) { 648 if (in_res(ginfo, rts, time)) {
618 event = pevent_data_event_from_type(ginfo->pevent, eid); 649 event = pevent_data_event_from_type(ginfo->pevent, eid);
619 if (event) { 650 if (event) {
diff --git a/trace-graph.c b/trace-graph.c
index f3a5916..10e1d65 100644
--- a/trace-graph.c
+++ b/trace-graph.c
@@ -50,6 +50,8 @@
50 50
51#define PLOT_SIZE 10 51#define PLOT_SIZE 10
52#define PLOT_BOX_SIZE PLOT_SIZE 52#define PLOT_BOX_SIZE PLOT_SIZE
53#define PLOT_TRI_SIZE PLOT_BOX_SIZE / 2
54#define PLOT_BTRI_SIZE .75 * PLOT_BOX_SIZE
53#define PLOT_GIVE 2 55#define PLOT_GIVE 2
54#define PLOT_BEGIN 80 56#define PLOT_BEGIN 80
55#define PLOT_SEP 50 57#define PLOT_SEP 50
@@ -1639,18 +1641,78 @@ static gint draw_plot_line(struct graph_info *ginfo, int i,
1639static void draw_plot_box(struct graph_info *ginfo, int i, 1641static void draw_plot_box(struct graph_info *ginfo, int i,
1640 unsigned long long start, 1642 unsigned long long start,
1641 unsigned long long end, 1643 unsigned long long end,
1642 gboolean fill, GdkGC *gc) 1644 gboolean fill, gboolean thin,
1645 char *label, GdkGC *gc)
1643{ 1646{
1644 gint x1; 1647 gint x1;
1645 gint x2; 1648 gint x2;
1649 gint y;
1650 gint size;
1646 1651
1647 x1 = convert_time_to_x(ginfo, start); 1652 x1 = convert_time_to_x(ginfo, start);
1648 x2 = convert_time_to_x(ginfo, end); 1653 x2 = convert_time_to_x(ginfo, end);
1649 1654
1655 size = (thin) ? PLOT_BOX_SIZE/4 : PLOT_BOX_SIZE;
1656 y = PLOT_BOX_TOP(i) + (PLOT_BOX_SIZE - size)/2;
1657
1650 gdk_draw_rectangle(ginfo->curr_pixmap, gc, 1658 gdk_draw_rectangle(ginfo->curr_pixmap, gc,
1651 fill, 1659 fill,
1652 x1, PLOT_BOX_TOP(i), 1660 x1, y,
1653 x2 - x1, PLOT_BOX_SIZE); 1661 x2 - x1, size);
1662}
1663
1664static void draw_plot_release(struct graph_info *ginfo, int i,
1665 unsigned long long time, char *label, GdkGC *gc)
1666{
1667
1668 int tbase = PLOT_TOP(i) + PLOT_TRI_SIZE;
1669 int x = convert_time_to_x(ginfo, time);
1670 GdkPoint tpoints[3];
1671 tpoints[0].x = x;
1672 tpoints[0].y = PLOT_TOP(i);
1673 tpoints[1].x = x - PLOT_TRI_SIZE/2;
1674 tpoints[1].y = tbase;
1675 tpoints[2].x = x + PLOT_TRI_SIZE/2;
1676 tpoints[2].y = tbase;
1677
1678 gdk_draw_line(ginfo->curr_pixmap, gc,
1679 x, tbase, x, PLOT_BOX_BOTTOM(i));
1680 gdk_draw_polygon(ginfo->curr_pixmap, gc, FALSE, tpoints, 3);
1681}
1682
1683static void draw_plot_deadline(struct graph_info *ginfo, int i,
1684 unsigned long long time, char *label, GdkGC *gc)
1685{
1686 int tbase = PLOT_BOX_BOTTOM(i);
1687 int x = convert_time_to_x(ginfo, time);
1688 GdkPoint tpoints[3];
1689 tpoints[0].x = x;
1690 tpoints[0].y = tbase + PLOT_TRI_SIZE;
1691 tpoints[1].x = x - PLOT_TRI_SIZE/2;
1692 tpoints[1].y = tbase;
1693 tpoints[2].x = x + PLOT_TRI_SIZE/2;
1694 tpoints[2].y = tbase;
1695
1696 gdk_draw_line(ginfo->curr_pixmap, gc,
1697 x, PLOT_BOX_TOP(i), x, tbase);
1698 gdk_draw_polygon(ginfo->curr_pixmap, gc, FALSE, tpoints, 3);
1699}
1700
1701static void draw_plot_completion(struct graph_info *ginfo, int i,
1702 unsigned long long time, char *label,
1703 GdkGC *gc)
1704{
1705 int tbase = PLOT_BOX_BOTTOM(i) + PLOT_BTRI_SIZE;
1706 int x = convert_time_to_x(ginfo, time);
1707 GdkPoint tpoints[3];
1708 tpoints[0].x = x;
1709 tpoints[0].y = tbase - PLOT_BTRI_SIZE;
1710 tpoints[1].x = x - PLOT_BTRI_SIZE/2;
1711 tpoints[1].y = tbase;
1712 tpoints[2].x = x + PLOT_BTRI_SIZE/2;
1713 tpoints[2].y = tbase;
1714
1715 gdk_draw_polygon(ginfo->curr_pixmap, gc, TRUE, tpoints, 3);
1654} 1716}
1655 1717
1656static void draw_plot(struct graph_info *ginfo, struct graph_plot *plot, 1718static void draw_plot(struct graph_info *ginfo, struct graph_plot *plot,
@@ -1686,9 +1748,37 @@ static void draw_plot(struct graph_info *ginfo, struct graph_plot *plot,
1686 } 1748 }
1687 1749
1688 draw_plot_box(ginfo, plot->pos, info.bstart, info.bend, 1750 draw_plot_box(ginfo, plot->pos, info.bstart, info.bend,
1689 info.bfill, plot->gc); 1751 info.bfill, info.bthin, info.blabel, plot->gc);
1752 }
1753
1754 if (info.release) {
1755 if (plot->last_color != 0) {
1756 plot->last_color = 0;
1757 set_color(ginfo->draw, plot->gc, plot->last_color);
1758 }
1759 draw_plot_release(ginfo, plot->pos,
1760 info.rtime, info.rlabel, plot->gc);
1761 }
1762
1763 if (info.deadline) {
1764 if (plot->last_color != 0) {
1765 plot->last_color = 0;
1766 set_color(ginfo->draw, plot->gc, plot->last_color);
1767 }
1768 draw_plot_deadline(ginfo, plot->pos,
1769 info.dtime, info.dlabel, plot->gc);
1690 } 1770 }
1691 1771
1772 if (info.completion) {
1773 if (plot->last_color != 0) {
1774 plot->last_color = 0;
1775 set_color(ginfo->draw, plot->gc, plot->last_color);
1776 }
1777 draw_plot_completion(ginfo, plot->pos,
1778 info.ctime, info.dlabel, plot->gc);
1779 }
1780
1781
1692 if (info.line) { 1782 if (info.line) {
1693 if (info.lcolor != plot->last_color) { 1783 if (info.lcolor != plot->last_color) {
1694 plot->last_color = info.lcolor; 1784 plot->last_color = info.lcolor;
diff --git a/trace-plot.c b/trace-plot.c
index 2fcd92f..2621034 100644
--- a/trace-plot.c
+++ b/trace-plot.c
@@ -344,6 +344,14 @@ int trace_graph_plot_event(struct graph_info *ginfo,
344 info->box = FALSE; 344 info->box = FALSE;
345 info->bfill = TRUE; 345 info->bfill = TRUE;
346 346
347 info->blabel = NULL;
348 info->release = FALSE;
349 info->rlabel = NULL;
350 info->deadline = FALSE;
351 info->dlabel = NULL;
352 info->completion = FALSE;
353 info->clabel = NULL;
354
347 if (!plot->cb->plot_event) 355 if (!plot->cb->plot_event)
348 return 0; 356 return 0;
349 357