diff options
| author | Jonathan Herman <hermanjl@cs.unc.edu> | 2012-03-30 16:48:55 -0400 |
|---|---|---|
| committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2012-03-30 16:48:55 -0400 |
| commit | 7c67b2cdcd779525a88a9f7173c6d628a98c01c5 (patch) | |
| tree | 92bce220cbe32ec657aee09f19647e18a33a52d5 | |
| parent | f340ebe290d85f6aae234b44ca43aecb106c1e75 (diff) | |
rt-graph: blockign with ids
| -rw-r--r-- | rt-graph.c | 30 | ||||
| -rw-r--r-- | rt-graph.h | 12 | ||||
| -rw-r--r-- | rt-plot-cpu.c | 7 | ||||
| -rw-r--r-- | rt-plot-task.c | 79 | ||||
| -rw-r--r-- | rt-plot-task.h | 3 | ||||
| -rw-r--r-- | rt-plot-vcpu.c | 113 | ||||
| -rw-r--r-- | rt-plot-vtask.c | 7 | ||||
| -rw-r--r-- | trace-graph.c | 16 | ||||
| -rw-r--r-- | trace-graph.h | 8 |
9 files changed, 177 insertions, 98 deletions
| @@ -448,7 +448,8 @@ int rt_graph_check_task_completion(struct graph_info *ginfo, | |||
| 448 | */ | 448 | */ |
| 449 | int rt_graph_check_task_block(struct graph_info *ginfo, | 449 | int rt_graph_check_task_block(struct graph_info *ginfo, |
| 450 | struct record *record, | 450 | struct record *record, |
| 451 | gint *pid, unsigned long long *ts) | 451 | gint *pid, gint *lid, |
| 452 | unsigned long long *ts) | ||
| 452 | { | 453 | { |
| 453 | struct rt_graph_info *rtg_info = &ginfo->rtg_info; | 454 | struct rt_graph_info *rtg_info = &ginfo->rtg_info; |
| 454 | struct pevent *pevent = ginfo->pevent; | 455 | struct pevent *pevent = ginfo->pevent; |
| @@ -464,16 +465,18 @@ int rt_graph_check_task_block(struct graph_info *ginfo, | |||
| 464 | dprintf(2, "Found task_block id %d\n", event->id); | 465 | dprintf(2, "Found task_block id %d\n", event->id); |
| 465 | rtg_info->task_block_id = event->id; | 466 | rtg_info->task_block_id = event->id; |
| 466 | STORE_FIELD(rtg_info, event, block, pid); | 467 | STORE_FIELD(rtg_info, event, block, pid); |
| 468 | STORE_FIELD(rtg_info, event, block, lid); | ||
| 467 | } | 469 | } |
| 468 | 470 | ||
| 469 | id = pevent_data_type(pevent, record); | 471 | id = pevent_data_type(pevent, record); |
| 470 | if (id == rtg_info->task_block_id) { | 472 | if (id == rtg_info->task_block_id) { |
| 471 | LOAD_INT(rtg_info, record, block, pid, pid); | 473 | LOAD_INT(rtg_info, record, block, pid, pid); |
| 474 | LOAD_INT(rtg_info, record, block, lid, lid); | ||
| 472 | *ts = get_rts(ginfo, record); | 475 | *ts = get_rts(ginfo, record); |
| 473 | 476 | ||
| 474 | ret = 1; | 477 | ret = 1; |
| 475 | dprintf(3, "Read task_block (%d) record for task %d\n", | 478 | dprintf(3, "Read task_block (%d) record on %d for task %d\n", |
| 476 | id, *pid); | 479 | id, *lid, *pid); |
| 477 | } | 480 | } |
| 478 | out: | 481 | out: |
| 479 | return ret; | 482 | return ret; |
| @@ -485,7 +488,8 @@ int rt_graph_check_task_block(struct graph_info *ginfo, | |||
| 485 | */ | 488 | */ |
| 486 | int rt_graph_check_task_resume(struct graph_info *ginfo, | 489 | int rt_graph_check_task_resume(struct graph_info *ginfo, |
| 487 | struct record *record, | 490 | struct record *record, |
| 488 | gint *pid, unsigned long long *ts) | 491 | gint *pid, gint *lid, |
| 492 | unsigned long long *ts) | ||
| 489 | { | 493 | { |
| 490 | struct rt_graph_info *rtg_info = &ginfo->rtg_info; | 494 | struct rt_graph_info *rtg_info = &ginfo->rtg_info; |
| 491 | struct pevent *pevent = ginfo->pevent; | 495 | struct pevent *pevent = ginfo->pevent; |
| @@ -501,16 +505,18 @@ int rt_graph_check_task_resume(struct graph_info *ginfo, | |||
| 501 | dprintf(2, "Found task_resume id %d\n", event->id); | 505 | dprintf(2, "Found task_resume id %d\n", event->id); |
| 502 | rtg_info->task_resume_id = event->id; | 506 | rtg_info->task_resume_id = event->id; |
| 503 | STORE_FIELD(rtg_info, event, resume, pid); | 507 | STORE_FIELD(rtg_info, event, resume, pid); |
| 508 | STORE_FIELD(rtg_info, event, resume, lid); | ||
| 504 | } | 509 | } |
| 505 | 510 | ||
| 506 | id = pevent_data_type(pevent, record); | 511 | id = pevent_data_type(pevent, record); |
| 507 | if (id == rtg_info->task_resume_id) { | 512 | if (id == rtg_info->task_resume_id) { |
| 508 | LOAD_INT(rtg_info, record, resume, pid, pid); | 513 | LOAD_INT(rtg_info, record, resume, pid, pid); |
| 514 | LOAD_INT(rtg_info, record, resume, lid, lid); | ||
| 509 | *ts = get_rts(ginfo, record); | 515 | *ts = get_rts(ginfo, record); |
| 510 | 516 | ||
| 511 | ret = 1; | 517 | ret = 1; |
| 512 | dprintf(3, "Read task_resume (%d) record for task %d\n", | 518 | dprintf(3, "Read task_resume (%d) record on %d for task %d\n", |
| 513 | id, *pid); | 519 | id, *lid, *pid); |
| 514 | } | 520 | } |
| 515 | out: | 521 | out: |
| 516 | return ret; | 522 | return ret; |
| @@ -781,7 +787,8 @@ int rt_graph_check_server_completion(struct graph_info *ginfo, | |||
| 781 | */ | 787 | */ |
| 782 | int rt_graph_check_server_block(struct graph_info *ginfo, | 788 | int rt_graph_check_server_block(struct graph_info *ginfo, |
| 783 | struct record *record, | 789 | struct record *record, |
| 784 | gint *sid, unsigned long long *ts) | 790 | gint *sid, gint *lid, |
| 791 | unsigned long long *ts) | ||
| 785 | { | 792 | { |
| 786 | struct rt_graph_info *rtg_info = &ginfo->rtg_info; | 793 | struct rt_graph_info *rtg_info = &ginfo->rtg_info; |
| 787 | struct pevent *pevent = ginfo->pevent; | 794 | struct pevent *pevent = ginfo->pevent; |
| @@ -795,12 +802,15 @@ int rt_graph_check_server_block(struct graph_info *ginfo, | |||
| 795 | if (!event) | 802 | if (!event) |
| 796 | goto out; | 803 | goto out; |
| 797 | dprintf(2, "Found server_block id %d\n", event->id); | 804 | dprintf(2, "Found server_block id %d\n", event->id); |
| 805 | rtg_info->server_block_id = event->id; | ||
| 798 | STORE_FIELD(rtg_info, event, sblock, sid); | 806 | STORE_FIELD(rtg_info, event, sblock, sid); |
| 807 | STORE_FIELD(rtg_info, event, sblock, lid); | ||
| 799 | } | 808 | } |
| 800 | 809 | ||
| 801 | id = pevent_data_type(pevent, record); | 810 | id = pevent_data_type(pevent, record); |
| 802 | if (id == rtg_info->server_block_id) { | 811 | if (id == rtg_info->server_block_id) { |
| 803 | LOAD_INT(rtg_info, record, sblock, sid, sid); | 812 | LOAD_INT(rtg_info, record, sblock, sid, sid); |
| 813 | LOAD_INT(rtg_info, record, sblock, lid, lid); | ||
| 804 | *ts = get_rts(ginfo, record); | 814 | *ts = get_rts(ginfo, record); |
| 805 | 815 | ||
| 806 | ret = 1; | 816 | ret = 1; |
| @@ -816,7 +826,8 @@ int rt_graph_check_server_block(struct graph_info *ginfo, | |||
| 816 | */ | 826 | */ |
| 817 | int rt_graph_check_server_resume(struct graph_info *ginfo, | 827 | int rt_graph_check_server_resume(struct graph_info *ginfo, |
| 818 | struct record *record, | 828 | struct record *record, |
| 819 | gint *sid, unsigned long long *ts) | 829 | gint *sid, gint *lid, |
| 830 | unsigned long long *ts) | ||
| 820 | { | 831 | { |
| 821 | struct rt_graph_info *rtg_info = &ginfo->rtg_info; | 832 | struct rt_graph_info *rtg_info = &ginfo->rtg_info; |
| 822 | struct pevent *pevent = ginfo->pevent; | 833 | struct pevent *pevent = ginfo->pevent; |
| @@ -830,12 +841,15 @@ int rt_graph_check_server_resume(struct graph_info *ginfo, | |||
| 830 | if (!event) | 841 | if (!event) |
| 831 | goto out; | 842 | goto out; |
| 832 | dprintf(2, "Found server_resume id %d\n", event->id); | 843 | dprintf(2, "Found server_resume id %d\n", event->id); |
| 844 | rtg_info->server_resume_id = event->id; | ||
| 833 | STORE_FIELD(rtg_info, event, sresume, sid); | 845 | STORE_FIELD(rtg_info, event, sresume, sid); |
| 846 | STORE_FIELD(rtg_info, event, sresume, lid); | ||
| 834 | } | 847 | } |
| 835 | 848 | ||
| 836 | id = pevent_data_type(pevent, record); | 849 | id = pevent_data_type(pevent, record); |
| 837 | if (id == rtg_info->server_resume_id) { | 850 | if (id == rtg_info->server_resume_id) { |
| 838 | LOAD_INT(rtg_info, record, sresume, sid, sid); | 851 | LOAD_INT(rtg_info, record, sresume, sid, sid); |
| 852 | LOAD_INT(rtg_info, record, sresume, lid, lid); | ||
| 839 | *ts = get_rts(ginfo, record); | 853 | *ts = get_rts(ginfo, record); |
| 840 | 854 | ||
| 841 | ret = 1; | 855 | ret = 1; |
| @@ -56,9 +56,11 @@ struct rt_graph_info { | |||
| 56 | 56 | ||
| 57 | gint task_block_id; | 57 | gint task_block_id; |
| 58 | struct format_field *block_pid_field; | 58 | struct format_field *block_pid_field; |
| 59 | struct format_field *block_lid_field; | ||
| 59 | 60 | ||
| 60 | gint task_resume_id; | 61 | gint task_resume_id; |
| 61 | struct format_field *resume_pid_field; | 62 | struct format_field *resume_pid_field; |
| 63 | struct format_field *resume_lid_field; | ||
| 62 | 64 | ||
| 63 | gint container_param_id; | 65 | gint container_param_id; |
| 64 | struct format_field *cparam_cid_field; | 66 | struct format_field *cparam_cid_field; |
| @@ -92,9 +94,11 @@ struct rt_graph_info { | |||
| 92 | 94 | ||
| 93 | gint server_block_id; | 95 | gint server_block_id; |
| 94 | struct format_field *sblock_sid_field; | 96 | struct format_field *sblock_sid_field; |
| 97 | struct format_field *sblock_lid_field; | ||
| 95 | 98 | ||
| 96 | gint server_resume_id; | 99 | gint server_resume_id; |
| 97 | struct format_field *sresume_sid_field; | 100 | struct format_field *sresume_sid_field; |
| 101 | struct format_field *sresume_lid_field; | ||
| 98 | 102 | ||
| 99 | 103 | ||
| 100 | /* Cache of ts fields for non-litmus events */ | 104 | /* Cache of ts fields for non-litmus events */ |
| @@ -163,10 +167,10 @@ int rt_graph_check_task_completion(struct graph_info *ginfo, | |||
| 163 | struct record *record, gint *pid, gint *job, | 167 | struct record *record, gint *pid, gint *job, |
| 164 | unsigned long long *when); | 168 | unsigned long long *when); |
| 165 | int rt_graph_check_task_block(struct graph_info *ginfo, | 169 | int rt_graph_check_task_block(struct graph_info *ginfo, |
| 166 | struct record *record, gint *pid, | 170 | struct record *record, gint *pid, gint *lid, |
| 167 | unsigned long long *when); | 171 | unsigned long long *when); |
| 168 | int rt_graph_check_task_resume(struct graph_info *ginfo, struct record *record, | 172 | int rt_graph_check_task_resume(struct graph_info *ginfo, struct record *record, |
| 169 | gint *pid, unsigned long long *when); | 173 | gint *pid, gint *lid, unsigned long long *when); |
| 170 | int rt_graph_check_container_param(struct graph_info *ginfo, | 174 | int rt_graph_check_container_param(struct graph_info *ginfo, |
| 171 | struct record *record, | 175 | struct record *record, |
| 172 | gint *cid, char **name); | 176 | gint *cid, char **name); |
| @@ -192,10 +196,10 @@ int rt_graph_check_server_completion(struct graph_info *ginfo, | |||
| 192 | gint *sid, gint *job, | 196 | gint *sid, gint *job, |
| 193 | unsigned long long *when); | 197 | unsigned long long *when); |
| 194 | int rt_graph_check_server_block(struct graph_info *ginfo, | 198 | int rt_graph_check_server_block(struct graph_info *ginfo, |
| 195 | struct record *record, gint *pid, | 199 | struct record *record, gint *pid, gint *lid, |
| 196 | unsigned long long *when); | 200 | unsigned long long *when); |
| 197 | int rt_graph_check_server_resume(struct graph_info *ginfo, struct record *record, | 201 | int rt_graph_check_server_resume(struct graph_info *ginfo, struct record *record, |
| 198 | gint *pid, unsigned long long *when); | 202 | gint *pid, gint *lid, unsigned long long *when); |
| 199 | void init_rt_event_cache(struct rt_graph_info *rtinfo); | 203 | void init_rt_event_cache(struct rt_graph_info *rtinfo); |
| 200 | 204 | ||
| 201 | unsigned long long get_rts(struct graph_info *ginfo, | 205 | unsigned long long get_rts(struct graph_info *ginfo, |
diff --git a/rt-plot-cpu.c b/rt-plot-cpu.c index 28ae26b..ba380fb 100644 --- a/rt-plot-cpu.c +++ b/rt-plot-cpu.c | |||
| @@ -276,6 +276,9 @@ static void do_plot_end(struct graph_info *ginfo, struct rt_cpu_info *rtc_info, | |||
| 276 | int pid; | 276 | int pid; |
| 277 | struct record *record; | 277 | struct record *record; |
| 278 | 278 | ||
| 279 | if (ginfo->view_end_time == ginfo->end_time) | ||
| 280 | return; | ||
| 281 | |||
| 279 | if (rtc_info->rt_run_time && rtc_info->run_pid) { | 282 | if (rtc_info->rt_run_time && rtc_info->run_pid) { |
| 280 | info->box = TRUE; | 283 | info->box = TRUE; |
| 281 | info->bcolor = hash_pid(rtc_info->run_pid); | 284 | info->bcolor = hash_pid(rtc_info->run_pid); |
| @@ -359,8 +362,8 @@ static int rt_cpu_plot_event(struct graph_info *ginfo, struct graph_plot *plot, | |||
| 359 | rt_graph_check_container_param(ARG, &dchar); | 362 | rt_graph_check_container_param(ARG, &dchar); |
| 360 | rt_graph_check_server_param(ARG, &dint, &dull, &dull); | 363 | rt_graph_check_server_param(ARG, &dint, &dull, &dull); |
| 361 | rt_graph_check_task_release(ARG, &dint, &dull, &dull); | 364 | rt_graph_check_task_release(ARG, &dint, &dull, &dull); |
| 362 | rt_graph_check_task_block(ARG, &dull); | 365 | rt_graph_check_task_block(ARG, &dint, &dull); |
| 363 | rt_graph_check_task_resume(ARG, &dull); | 366 | rt_graph_check_task_resume(ARG, &dint, &dull); |
| 364 | rt_graph_check_any(ARG, &eid, &ts); | 367 | rt_graph_check_any(ARG, &eid, &ts); |
| 365 | #undef ARG | 368 | #undef ARG |
| 366 | 369 | ||
diff --git a/rt-plot-task.c b/rt-plot-task.c index de5d2a7..94c60f1 100644 --- a/rt-plot-task.c +++ b/rt-plot-task.c | |||
| @@ -42,8 +42,8 @@ next_box_record(struct graph_info *ginfo, struct rt_task_info *rtt_info, | |||
| 42 | #define ARG ginfo, record, &pid | 42 | #define ARG ginfo, record, &pid |
| 43 | match = rt_graph_check_switch_to(ARG, &dint, &dull) || | 43 | match = rt_graph_check_switch_to(ARG, &dint, &dull) || |
| 44 | rt_graph_check_switch_away(ARG, &dint, &dull) || | 44 | rt_graph_check_switch_away(ARG, &dint, &dull) || |
| 45 | rt_graph_check_task_block(ARG, &dull) || | 45 | rt_graph_check_task_block(ARG, &dint, &dull) || |
| 46 | rt_graph_check_task_resume(ARG, &dull); | 46 | rt_graph_check_task_resume(ARG, &dint, &dull); |
| 47 | #undef ARG | 47 | #undef ARG |
| 48 | eid = (match) ? pevent_data_type(pevent, record) : 0; | 48 | eid = (match) ? pevent_data_type(pevent, record) : 0; |
| 49 | 49 | ||
| @@ -75,6 +75,19 @@ static int update_job(struct rt_task_info *rtt_info, int job) | |||
| 75 | return 1; | 75 | return 1; |
| 76 | } | 76 | } |
| 77 | 77 | ||
| 78 | static void update_lid(struct rt_task_info *rtt_info, int lid) | ||
| 79 | { | ||
| 80 | if (rtt_info->block_lid != lid) { | ||
| 81 | rtt_info->block_lid = lid; | ||
| 82 | |||
| 83 | if (lid) | ||
| 84 | snprintf(rtt_info->block_label, LLABEL, | ||
| 85 | "%d", rtt_info->block_lid); | ||
| 86 | else | ||
| 87 | snprintf(rtt_info->block_label, LLABEL, " "); | ||
| 88 | } | ||
| 89 | } | ||
| 90 | |||
| 78 | static int rt_task_plot_is_drawn(struct graph_info *ginfo, int eid) | 91 | static int rt_task_plot_is_drawn(struct graph_info *ginfo, int eid) |
| 79 | { | 92 | { |
| 80 | struct rt_graph_info *rtg_info = &ginfo->rtg_info; | 93 | struct rt_graph_info *rtg_info = &ginfo->rtg_info; |
| @@ -82,8 +95,8 @@ static int rt_task_plot_is_drawn(struct graph_info *ginfo, int eid) | |||
| 82 | return (eid == rtg_info->switch_away_id || | 95 | return (eid == rtg_info->switch_away_id || |
| 83 | eid == rtg_info->switch_to_id || | 96 | eid == rtg_info->switch_to_id || |
| 84 | eid == rtg_info->task_completion_id || | 97 | eid == rtg_info->task_completion_id || |
| 85 | /* eid == rtg_info->task_block_id || */ | 98 | eid == rtg_info->task_block_id || |
| 86 | /* eid == rtg_info->task_resume_id || */ | 99 | eid == rtg_info->task_resume_id || |
| 87 | eid == rtg_info->task_release_id); | 100 | eid == rtg_info->task_release_id); |
| 88 | } | 101 | } |
| 89 | 102 | ||
| @@ -208,14 +221,19 @@ static int try_completion(struct graph_info *ginfo, | |||
| 208 | static int try_block(struct graph_info *ginfo, struct rt_task_info *rtt_info, | 221 | static int try_block(struct graph_info *ginfo, struct rt_task_info *rtt_info, |
| 209 | struct record *record, struct plot_info *info) | 222 | struct record *record, struct plot_info *info) |
| 210 | { | 223 | { |
| 211 | int pid, match, ret = 0; | 224 | int pid, match, lid, ret = 0; |
| 212 | unsigned long long ts; | 225 | unsigned long long ts; |
| 213 | 226 | ||
| 214 | match = rt_graph_check_task_block(ginfo, record, &pid, &ts); | 227 | match = rt_graph_check_task_block(ginfo, record, &pid, &lid, &ts); |
| 215 | if (match && pid == rtt_info->pid) { | 228 | if (match && pid == rtt_info->pid) { |
| 216 | rtt_info->fresh = FALSE; | 229 | if (lid || !rtt_info->block_lid) { |
| 217 | rtt_info->block_time = ts; | 230 | update_lid(rtt_info, lid); |
| 218 | rtt_info->block_cpu = record->cpu; | 231 | rtt_info->fresh = FALSE; |
| 232 | rtt_info->block_time = ts; | ||
| 233 | rtt_info->block_cpu = record->cpu; | ||
| 234 | rtt_info->block_lid = lid; | ||
| 235 | } | ||
| 236 | |||
| 219 | dprintf(3, "Block for %d on %d at %llu\n", | 237 | dprintf(3, "Block for %d on %d at %llu\n", |
| 220 | pid, record->cpu, ts); | 238 | pid, record->cpu, ts); |
| 221 | ret = 1; | 239 | ret = 1; |
| @@ -228,24 +246,34 @@ static int try_block(struct graph_info *ginfo, struct rt_task_info *rtt_info, | |||
| 228 | static int try_resume(struct graph_info *ginfo, struct rt_task_info *rtt_info, | 246 | static int try_resume(struct graph_info *ginfo, struct rt_task_info *rtt_info, |
| 229 | struct record *record, struct plot_info *info) | 247 | struct record *record, struct plot_info *info) |
| 230 | { | 248 | { |
| 231 | int pid, match, ret = 0; | 249 | int pid, match, lid, ret = 0; |
| 232 | unsigned long long ts; | 250 | unsigned long long ts; |
| 233 | 251 | ||
| 234 | match = rt_graph_check_task_resume(ginfo, record, &pid, &ts); | 252 | match = rt_graph_check_task_resume(ginfo, record, &pid, &lid, &ts); |
| 235 | if (match && pid == rtt_info->pid) { | 253 | if (match && pid == rtt_info->pid) { |
| 236 | info->box = TRUE; | 254 | if (lid == rtt_info->block_lid) { |
| 237 | info->bcolor = 0x0; | 255 | info->box = TRUE; |
| 238 | info->bfill = TRUE; | 256 | info->bcolor = 0x0; |
| 239 | info->bthin = TRUE; | 257 | info->bfill = TRUE; |
| 240 | info->bstart = rtt_info->block_time; | 258 | info->bthin = TRUE; |
| 241 | info->bend = ts; | 259 | info->bstart = rtt_info->block_time; |
| 242 | rtt_info->fresh = FALSE; | 260 | info->bend = ts; |
| 261 | |||
| 262 | printf("drawing block\n"); | ||
| 263 | if (lid) { | ||
| 264 | printf("Adding label %s\n", rtt_info->block_label); | ||
| 265 | info->blabel = rtt_info->block_label; | ||
| 266 | } | ||
| 267 | |||
| 268 | rtt_info->block_lid = 0; | ||
| 269 | rtt_info->fresh = FALSE; | ||
| 270 | rtt_info->block_time = 0ULL; | ||
| 271 | rtt_info->block_cpu = NO_CPU; | ||
| 272 | |||
| 273 | } | ||
| 243 | 274 | ||
| 244 | rtt_info->block_time = 0ULL; | ||
| 245 | rtt_info->block_cpu = NO_CPU; | ||
| 246 | dprintf(3, "Resume for %d on %d at %llu\n", | 275 | dprintf(3, "Resume for %d on %d at %llu\n", |
| 247 | pid, record->cpu, ts); | 276 | pid, record->cpu, ts); |
| 248 | |||
| 249 | ret = 1; | 277 | ret = 1; |
| 250 | } | 278 | } |
| 251 | return ret; | 279 | return ret; |
| @@ -335,6 +363,9 @@ static void do_plot_end(struct graph_info *ginfo, struct rt_task_info *rtt_info, | |||
| 335 | struct rt_graph_info *rtg_info = &ginfo->rtg_info; | 363 | struct rt_graph_info *rtg_info = &ginfo->rtg_info; |
| 336 | int eid; | 364 | int eid; |
| 337 | 365 | ||
| 366 | if (ginfo->view_end_time == ginfo->end_time) | ||
| 367 | return; | ||
| 368 | |||
| 338 | if (rtt_info->run_time && rtt_info->run_cpu != NO_CPU) { | 369 | if (rtt_info->run_time && rtt_info->run_cpu != NO_CPU) { |
| 339 | /* A box was started, finish it */ | 370 | /* A box was started, finish it */ |
| 340 | info->box = TRUE; | 371 | info->box = TRUE; |
| @@ -424,6 +455,7 @@ static void rt_task_plot_start(struct graph_info *ginfo, struct graph_plot *plot | |||
| 424 | rtt_info->first_rels[i] = 0ULL; | 455 | rtt_info->first_rels[i] = 0ULL; |
| 425 | rtt_info->last_job = -1; | 456 | rtt_info->last_job = -1; |
| 426 | update_job(rtt_info, 0); | 457 | update_job(rtt_info, 0); |
| 458 | update_lid(rtt_info, 0); | ||
| 427 | } | 459 | } |
| 428 | 460 | ||
| 429 | static void rt_task_plot_destroy(struct graph_info *ginfo, struct graph_plot *plot) | 461 | static void rt_task_plot_destroy(struct graph_info *ginfo, struct graph_plot *plot) |
| @@ -455,8 +487,8 @@ rt_task_plot_record_matches(struct rt_plot_common *rt, | |||
| 455 | rt_graph_check_switch_away(ARG, &dint, &dull) || | 487 | rt_graph_check_switch_away(ARG, &dint, &dull) || |
| 456 | rt_graph_check_task_release(ARG, &dint, &dull, &dull) || | 488 | rt_graph_check_task_release(ARG, &dint, &dull, &dull) || |
| 457 | rt_graph_check_task_completion(ARG, &dint, &dull) || | 489 | rt_graph_check_task_completion(ARG, &dint, &dull) || |
| 458 | rt_graph_check_task_block(ARG, &dull) || | 490 | rt_graph_check_task_block(ARG, &dint, &dull) || |
| 459 | rt_graph_check_task_resume(ARG, &dull) || | 491 | rt_graph_check_task_resume(ARG, &dint, &dull) || |
| 460 | rt_graph_check_any(ARG, &dint, &dull); | 492 | rt_graph_check_any(ARG, &dint, &dull); |
| 461 | #undef ARG | 493 | #undef ARG |
| 462 | return pid == match_pid; | 494 | return pid == match_pid; |
| @@ -617,6 +649,7 @@ void rt_plot_task(struct graph_info *ginfo, int pid, int pos) | |||
| 617 | rtt_info = malloc_or_die(sizeof(*rtt_info)); | 649 | rtt_info = malloc_or_die(sizeof(*rtt_info)); |
| 618 | rtt_info->pid = pid; | 650 | rtt_info->pid = pid; |
| 619 | rtt_info->label = malloc_or_die(LLABEL); | 651 | rtt_info->label = malloc_or_die(LLABEL); |
| 652 | rtt_info->block_label = malloc_or_die(LLABEL); | ||
| 620 | rtt_info->wcet = params->wcet; | 653 | rtt_info->wcet = params->wcet; |
| 621 | rtt_info->period = params->period; | 654 | rtt_info->period = params->period; |
| 622 | 655 | ||
diff --git a/rt-plot-task.h b/rt-plot-task.h index ddbfb1c..0056434 100644 --- a/rt-plot-task.h +++ b/rt-plot-task.h | |||
| @@ -13,8 +13,10 @@ struct rt_task_info { | |||
| 13 | /* For drawing squares */ | 13 | /* For drawing squares */ |
| 14 | unsigned long long run_time; | 14 | unsigned long long run_time; |
| 15 | int run_cpu; | 15 | int run_cpu; |
| 16 | |||
| 16 | unsigned long long block_time; | 17 | unsigned long long block_time; |
| 17 | int block_cpu; | 18 | int block_cpu; |
| 19 | int block_lid; | ||
| 18 | 20 | ||
| 19 | /* For managing state */ | 21 | /* For managing state */ |
| 20 | int last_job; | 22 | int last_job; |
| @@ -25,6 +27,7 @@ struct rt_task_info { | |||
| 25 | gboolean params_found; | 27 | gboolean params_found; |
| 26 | gboolean fresh; | 28 | gboolean fresh; |
| 27 | char *label; | 29 | char *label; |
| 30 | char *block_label; | ||
| 28 | }; | 31 | }; |
| 29 | 32 | ||
| 30 | const struct plot_callbacks rt_task_cb; | 33 | const struct plot_callbacks rt_task_cb; |
diff --git a/rt-plot-vcpu.c b/rt-plot-vcpu.c index 54dc05f..f327f57 100644 --- a/rt-plot-vcpu.c +++ b/rt-plot-vcpu.c | |||
| @@ -131,6 +131,9 @@ static void do_plot_end(struct graph_info *ginfo, struct vcpu_info *vcpu_info, | |||
| 131 | unsigned long long deadline, release; | 131 | unsigned long long deadline, release; |
| 132 | struct record *record; | 132 | struct record *record; |
| 133 | 133 | ||
| 134 | if (ginfo->view_end_time == ginfo->end_time) | ||
| 135 | return; | ||
| 136 | |||
| 134 | if (vcpu_info->run_time && vcpu_info->run_cpu != NO_CPU) { | 137 | if (vcpu_info->run_time && vcpu_info->run_cpu != NO_CPU) { |
| 135 | info->box = TRUE; | 138 | info->box = TRUE; |
| 136 | info->bcolor = hash_pid(vcpu_info->run_tid); | 139 | info->bcolor = hash_pid(vcpu_info->run_tid); |
| @@ -170,8 +173,8 @@ static int rt_vcpu_plot_event(struct graph_info *ginfo, struct graph_plot *plot, | |||
| 170 | 173 | ||
| 171 | match = try_server_switch_away(ginfo, vcpu_info, record, info) || | 174 | match = try_server_switch_away(ginfo, vcpu_info, record, info) || |
| 172 | try_server_switch_to(ginfo, vcpu_info, record, info) || | 175 | try_server_switch_to(ginfo, vcpu_info, record, info) || |
| 173 | vcpu_try_block(ginfo, vcpu_info, record, info) || | 176 | /* vcpu_try_block(ginfo, vcpu_info, record, info) || */ |
| 174 | vcpu_try_resume(ginfo, vcpu_info, record, info) || | 177 | /* vcpu_try_resume(ginfo, vcpu_info, record, info) || */ |
| 175 | vcpu_try_release(ginfo, vcpu_info, record, info) || | 178 | vcpu_try_release(ginfo, vcpu_info, record, info) || |
| 176 | vcpu_try_completion(ginfo, vcpu_info, record, info) || | 179 | vcpu_try_completion(ginfo, vcpu_info, record, info) || |
| 177 | try_switch_to(ginfo, vcpu_info, record, info) || | 180 | try_switch_to(ginfo, vcpu_info, record, info) || |
| @@ -265,9 +268,9 @@ int rt_vcpu_plot_record_matches(struct rt_plot_common *rt, | |||
| 265 | match = rt_graph_check_server_switch_to(ARG, &dint, &dint, &dull) || | 268 | match = rt_graph_check_server_switch_to(ARG, &dint, &dint, &dull) || |
| 266 | rt_graph_check_server_switch_away(ARG, &dint, &dint, &dull) || | 269 | rt_graph_check_server_switch_away(ARG, &dint, &dint, &dull) || |
| 267 | rt_graph_check_server_completion(ARG, &dint, &dull) || | 270 | rt_graph_check_server_completion(ARG, &dint, &dull) || |
| 268 | rt_graph_check_server_release(ARG, &dint, &dull, &dull) || | 271 | rt_graph_check_server_release(ARG, &dint, &dull, &dull); |
| 269 | rt_graph_check_server_block(ARG, &dull) || | 272 | /* rt_graph_check_server_block(ARG, &dull) || */ |
| 270 | rt_graph_check_server_resume(ARG, &dull); | 273 | /* rt_graph_check_server_resume(ARG, &dull); */ |
| 271 | #undef ARG | 274 | #undef ARG |
| 272 | return (sid == vcpu_info->sid); | 275 | return (sid == vcpu_info->sid); |
| 273 | } | 276 | } |
| @@ -364,55 +367,55 @@ int vcpu_try_completion(struct graph_info *ginfo, | |||
| 364 | return ret; | 367 | return ret; |
| 365 | } | 368 | } |
| 366 | 369 | ||
| 367 | /** | 370 | /* /\** */ |
| 368 | * vcpu_try_block - start block box if record matches | 371 | /* * vcpu_try_block - start block box if record matches */ |
| 369 | */ | 372 | /* *\/ */ |
| 370 | int vcpu_try_block(struct graph_info *ginfo, struct vcpu_info *vcpu_info, | 373 | /* int vcpu_try_block(struct graph_info *ginfo, struct vcpu_info *vcpu_info, */ |
| 371 | struct record *record, struct plot_info *info) | 374 | /* struct record *record, struct plot_info *info) */ |
| 372 | { | 375 | /* { */ |
| 373 | int sid, match, ret = 0; | 376 | /* int sid, match, ret = 0; */ |
| 374 | unsigned long long ts; | 377 | /* unsigned long long ts; */ |
| 375 | 378 | ||
| 376 | match = rt_graph_check_server_block(ginfo, record, &sid, &ts); | 379 | /* match = rt_graph_check_server_block(ginfo, record, &sid, &ts); */ |
| 377 | if (match && sid == vcpu_info->sid) { | 380 | /* if (match && sid == vcpu_info->sid) { */ |
| 378 | vcpu_info->fresh = FALSE; | 381 | /* vcpu_info->fresh = FALSE; */ |
| 379 | vcpu_info->block_time = ts; | 382 | /* vcpu_info->block_time = ts; */ |
| 380 | vcpu_info->block_cpu = NO_CPU; | 383 | /* vcpu_info->block_cpu = NO_CPU; */ |
| 381 | dprintf(3, "VCPU resume for %d on %d at %llu\n", | 384 | /* dprintf(3, "VCPU resume for %d on %d at %llu\n", */ |
| 382 | sid, record->cpu, ts); | 385 | /* sid, record->cpu, ts); */ |
| 383 | ret = 1; | 386 | /* ret = 1; */ |
| 384 | } | 387 | /* } */ |
| 385 | return ret; | 388 | /* return ret; */ |
| 386 | } | 389 | /* } */ |
| 387 | 390 | ||
| 388 | /** | 391 | /* /\** */ |
| 389 | * vcpu_try_resume - end block box if record matches | 392 | /* * vcpu_try_resume - end block box if record matches */ |
| 390 | */ | 393 | /* *\/ */ |
| 391 | int vcpu_try_resume(struct graph_info *ginfo, struct vcpu_info *vcpu_info, | 394 | /* int vcpu_try_resume(struct graph_info *ginfo, struct vcpu_info *vcpu_info, */ |
| 392 | struct record *record, struct plot_info *info) | 395 | /* struct record *record, struct plot_info *info) */ |
| 393 | { | 396 | /* { */ |
| 394 | int sid, match, ret = 0; | 397 | /* int sid, match, ret = 0; */ |
| 395 | unsigned long long ts; | 398 | /* unsigned long long ts; */ |
| 396 | 399 | ||
| 397 | match = rt_graph_check_server_resume(ginfo, record, &sid, &ts); | 400 | /* match = rt_graph_check_server_resume(ginfo, record, &sid, &ts); */ |
| 398 | 401 | ||
| 399 | if (match && sid == vcpu_info->sid) { | 402 | /* if (match && sid == vcpu_info->sid) { */ |
| 400 | info->box = TRUE; | 403 | /* info->box = TRUE; */ |
| 401 | info->bcolor = 0x0; | 404 | /* info->bcolor = 0x0; */ |
| 402 | info->bfill = TRUE; | 405 | /* info->bfill = TRUE; */ |
| 403 | info->bthin = TRUE; | 406 | /* info->bthin = TRUE; */ |
| 404 | info->bstart = vcpu_info->block_time; | 407 | /* info->bstart = vcpu_info->block_time; */ |
| 405 | info->bend = ts; | 408 | /* info->bend = ts; */ |
| 406 | vcpu_info->fresh = FALSE; | 409 | /* vcpu_info->fresh = FALSE; */ |
| 407 | 410 | ||
| 408 | vcpu_info->block_time = 0ULL; | 411 | /* vcpu_info->block_time = 0ULL; */ |
| 409 | vcpu_info->block_cpu = NO_CPU; | 412 | /* vcpu_info->block_cpu = NO_CPU; */ |
| 410 | dprintf(3, "VCPU resume for %d on %d at %llu\n", | 413 | /* dprintf(3, "VCPU resume for %d on %d at %llu\n", */ |
| 411 | sid, record->cpu, ts); | 414 | /* sid, record->cpu, ts); */ |
| 412 | 415 | ||
| 413 | ret = 1; | 416 | /* ret = 1; */ |
| 414 | } | 417 | /* } */ |
| 415 | return ret; | 418 | /* return ret; */ |
| 416 | } | 419 | /* } */ |
| 417 | 420 | ||
| 418 | 421 | ||
diff --git a/rt-plot-vtask.c b/rt-plot-vtask.c index 5b54343..5000873 100644 --- a/rt-plot-vtask.c +++ b/rt-plot-vtask.c | |||
| @@ -119,6 +119,9 @@ static void do_plot_end(struct graph_info *ginfo, struct vcpu_info *vcpu_info, | |||
| 119 | unsigned long long deadline, release; | 119 | unsigned long long deadline, release; |
| 120 | struct record *record; | 120 | struct record *record; |
| 121 | 121 | ||
| 122 | if (ginfo->view_end_time == ginfo->end_time) | ||
| 123 | return; | ||
| 124 | |||
| 122 | if (vcpu_info->run_time && vcpu_info->run_cpu != NO_CPU) { | 125 | if (vcpu_info->run_time && vcpu_info->run_cpu != NO_CPU) { |
| 123 | info->box = TRUE; | 126 | info->box = TRUE; |
| 124 | info->bcolor = hash_pid(vcpu_info->sid); | 127 | info->bcolor = hash_pid(vcpu_info->sid); |
| @@ -158,8 +161,8 @@ static int rt_vtask_plot_event(struct graph_info *ginfo, struct graph_plot *plot | |||
| 158 | 161 | ||
| 159 | match = try_server_switch_away(ginfo, vcpu_info, record, info) || | 162 | match = try_server_switch_away(ginfo, vcpu_info, record, info) || |
| 160 | try_server_switch_to(ginfo, vcpu_info, record, info) || | 163 | try_server_switch_to(ginfo, vcpu_info, record, info) || |
| 161 | vcpu_try_block(ginfo, vcpu_info, record, info) || | 164 | /* vcpu_try_block(ginfo, vcpu_info, record, info) || */ |
| 162 | vcpu_try_resume(ginfo, vcpu_info, record, info) || | 165 | /* vcpu_try_resume(ginfo, vcpu_info, record, info) || */ |
| 163 | vcpu_try_release(ginfo, vcpu_info, record, info) || | 166 | vcpu_try_release(ginfo, vcpu_info, record, info) || |
| 164 | vcpu_try_completion(ginfo, vcpu_info, record, info) || | 167 | vcpu_try_completion(ginfo, vcpu_info, record, info) || |
| 165 | try_switch_to(ginfo, vcpu_info, record, info) || | 168 | try_switch_to(ginfo, vcpu_info, record, info) || |
diff --git a/trace-graph.c b/trace-graph.c index d8367ae..b20aabe 100644 --- a/trace-graph.c +++ b/trace-graph.c | |||
| @@ -55,7 +55,7 @@ | |||
| 55 | #define PLOT_GIVE 2 | 55 | #define PLOT_GIVE 2 |
| 56 | #define PLOT_BEGIN 80 | 56 | #define PLOT_BEGIN 80 |
| 57 | #define PLOT_SEP 50 | 57 | #define PLOT_SEP 50 |
| 58 | #define MAX_TRI_TIME 10000000 | 58 | #define MAX_TRI_TIME 1000000 |
| 59 | #define PLOT_LINE(plot) (PLOT_SEP * (plot) + PLOT_BEGIN + PLOT_SIZE) | 59 | #define PLOT_LINE(plot) (PLOT_SEP * (plot) + PLOT_BEGIN + PLOT_SIZE) |
| 60 | #define PLOT_TOP(plot) (PLOT_LINE(plot) - PLOT_SIZE * 2) | 60 | #define PLOT_TOP(plot) (PLOT_LINE(plot) - PLOT_SIZE * 2) |
| 61 | #define PLOT_BOX_TOP(plot) (PLOT_LINE(plot) - PLOT_SIZE) | 61 | #define PLOT_BOX_TOP(plot) (PLOT_LINE(plot) - PLOT_SIZE) |
| @@ -1695,7 +1695,7 @@ static void draw_plot_box(struct graph_info *ginfo, int i, | |||
| 1695 | fill, | 1695 | fill, |
| 1696 | x1, y, | 1696 | x1, y, |
| 1697 | x2 - x1, size); | 1697 | x2 - x1, size); |
| 1698 | if (!thin && fill && is_high_res(ginfo)) { | 1698 | if (!thin && fill && (x2 - x1 > 1)) { |
| 1699 | gdk_draw_rectangle(ginfo->curr_pixmap, | 1699 | gdk_draw_rectangle(ginfo->curr_pixmap, |
| 1700 | ginfo->draw->style->black_gc, | 1700 | ginfo->draw->style->black_gc, |
| 1701 | FALSE, | 1701 | FALSE, |
| @@ -1703,8 +1703,16 @@ static void draw_plot_box(struct graph_info *ginfo, int i, | |||
| 1703 | x2 - x1, size); | 1703 | x2 - x1, size); |
| 1704 | } | 1704 | } |
| 1705 | 1705 | ||
| 1706 | if (label) | 1706 | if (label) { |
| 1707 | draw_plot_label(ginfo, label, x1 + 1, y + 1, x2 - x1 - 2); | 1707 | if (!thin) |
| 1708 | draw_plot_label(ginfo, label, x1 + 1, | ||
| 1709 | y + 1, x2 - x1 - 2); | ||
| 1710 | else | ||
| 1711 | draw_plot_label(ginfo, label, (x1 + x2) / 2, | ||
| 1712 | y - PLOT_BOX_SIZE, | ||
| 1713 | x2 - x1 - 2); | ||
| 1714 | } | ||
| 1715 | |||
| 1708 | } | 1716 | } |
| 1709 | 1717 | ||
| 1710 | static void draw_plot_release(struct graph_info *ginfo, int i, | 1718 | static void draw_plot_release(struct graph_info *ginfo, int i, |
diff --git a/trace-graph.h b/trace-graph.h index d56438d..67a8f35 100644 --- a/trace-graph.h +++ b/trace-graph.h | |||
| @@ -80,6 +80,14 @@ struct plot_info { | |||
| 80 | 80 | ||
| 81 | gboolean completion; | 81 | gboolean completion; |
| 82 | unsigned long long ctime; | 82 | unsigned long long ctime; |
| 83 | |||
| 84 | gboolean ubox; | ||
| 85 | unsigned long long ubtime; | ||
| 86 | char *ublabel; | ||
| 87 | |||
| 88 | gboolean dbox; | ||
| 89 | unsigned long long dbtime; | ||
| 90 | char *dblabel; | ||
| 83 | }; | 91 | }; |
| 84 | 92 | ||
| 85 | /* | 93 | /* |
