diff options
author | Gary Bressler <garybressler@nc.rr.com> | 2010-03-19 12:55:12 -0400 |
---|---|---|
committer | Gary Bressler <garybressler@nc.rr.com> | 2010-03-19 12:55:12 -0400 |
commit | ee7ae82ae6df1378203957b7fa77066153e13c36 (patch) | |
tree | ceb3b420a5ce80b07e9a23bbef0ec9639dbb384f /unit_trace/viz/schedule.py | |
parent | e6dbe1605d8ae52ee65a08e929ed1810bd07d45c (diff) |
Fixed some graphical glitches, along with streamlining the access to the visualizer.
Diffstat (limited to 'unit_trace/viz/schedule.py')
-rw-r--r-- | unit_trace/viz/schedule.py | 89 |
1 files changed, 72 insertions, 17 deletions
diff --git a/unit_trace/viz/schedule.py b/unit_trace/viz/schedule.py index ce062a3..4277f1a 100644 --- a/unit_trace/viz/schedule.py +++ b/unit_trace/viz/schedule.py | |||
@@ -65,6 +65,7 @@ class TimeSlotArray(object): | |||
65 | for slot in range(start_slot + 1, end_slot): | 65 | for slot in range(start_slot + 1, end_slot): |
66 | dummy = span_events[span_event](task_no, cpu) | 66 | dummy = span_events[span_event](task_no, cpu) |
67 | dummy.corresp_start_event = event.corresp_start_event | 67 | dummy.corresp_start_event = event.corresp_start_event |
68 | dummy.corresp_end_event = event | ||
68 | 69 | ||
69 | self._put_event_in_slot(TimeSlotArray.TASK_LIST, task_no, dummy.__class__, slot, dummy) | 70 | self._put_event_in_slot(TimeSlotArray.TASK_LIST, task_no, dummy.__class__, slot, dummy) |
70 | self._put_event_in_slot(TimeSlotArray.CPU_LIST, cpu, dummy.__class__, slot, dummy) | 71 | self._put_event_in_slot(TimeSlotArray.CPU_LIST, cpu, dummy.__class__, slot, dummy) |
@@ -151,7 +152,7 @@ class Schedule(object): | |||
151 | for event_time in sorted(job.get_events().keys()): | 152 | for event_time in sorted(job.get_events().keys()): |
152 | # could have multiple events at the same time (unlikely but possible) | 153 | # could have multiple events at the same time (unlikely but possible) |
153 | for event in job.get_events()[event_time]: | 154 | for event in job.get_events()[event_time]: |
154 | print 'task, job, event:', task.name, job.job_no, event.__class__.__name__ | 155 | #print 'task, job, event:', task.name, job.job_no, event.__class__.__name__ |
155 | event.scan(cur_cpu, switches) | 156 | event.scan(cur_cpu, switches) |
156 | 157 | ||
157 | def add_task(self, task): | 158 | def add_task(self, task): |
@@ -395,7 +396,7 @@ class SwitchAwayEvent(Event): | |||
395 | def __str__(self): | 396 | def __str__(self): |
396 | if self.corresp_start_event is None: | 397 | if self.corresp_start_event is None: |
397 | return 'Switch Away (w/o Switch To)' + self._common_str() + 'TIME=' \ | 398 | return 'Switch Away (w/o Switch To)' + self._common_str() + 'TIME=' \ |
398 | + self.get_time() | 399 | + str(self.get_time()) |
399 | return str(self.corresp_start_event) | 400 | return str(self.corresp_start_event) |
400 | 401 | ||
401 | def scan(self, cur_cpu, switches): | 402 | def scan(self, cur_cpu, switches): |
@@ -422,9 +423,25 @@ class SwitchAwayEvent(Event): | |||
422 | super(SwitchAwayEvent, self).scan(cur_cpu, switches) | 423 | super(SwitchAwayEvent, self).scan(cur_cpu, switches) |
423 | 424 | ||
424 | def render(self, graph, layer, prev_events, selectable=False): | 425 | def render(self, graph, layer, prev_events, selectable=False): |
425 | if self.corresp_start_event is None or self.corresp_start_event in prev_events: | 426 | if self.corresp_start_event is None: |
426 | return # erroneous switch away or already rendered | 427 | # We never found a corresponding start event. In that case, we can assume it lies |
427 | self.corresp_start_event.render(graph, layer, prev_events, selectable) | 428 | # in some part of the trace that was never read in. So draw a bar starting from |
429 | # the very beginning. | ||
430 | if layer == self.layer: | ||
431 | prev_events[self] = None | ||
432 | cpu = self.get_cpu() | ||
433 | task_no = self.get_job().get_task().get_task_no() | ||
434 | if selectable: | ||
435 | start = self.get_job().get_task().get_schedule().start | ||
436 | graph.add_sel_bar_at_time(start, self.get_time(), | ||
437 | task_no, cpu, self) | ||
438 | else: | ||
439 | graph.draw_bar_at_time(start, self.get_time(), | ||
440 | task_no, cpu, self.get_job().get_job_no(), self.is_selected()) | ||
441 | else: | ||
442 | if self.corresp_start_event in prev_events: | ||
443 | return # already rendered the bar | ||
444 | self.corresp_start_event.render(graph, layer, prev_events, selectable) | ||
428 | 445 | ||
429 | class SwitchToEvent(Event): | 446 | class SwitchToEvent(Event): |
430 | def __init__(self, time, cpu): | 447 | def __init__(self, time, cpu): |
@@ -434,7 +451,7 @@ class SwitchToEvent(Event): | |||
434 | def __str__(self): | 451 | def __str__(self): |
435 | if self.corresp_end_event is None: | 452 | if self.corresp_end_event is None: |
436 | return 'Switch To (w/o Switch Away)' + self._common_str() + ', TIME=' \ | 453 | return 'Switch To (w/o Switch Away)' + self._common_str() + ', TIME=' \ |
437 | + self.get_time() | 454 | + str(self.get_time()) |
438 | return 'Scheduled' + self._common_str() + ', START=' \ | 455 | return 'Scheduled' + self._common_str() + ', START=' \ |
439 | + util.format_float(self.get_time(), Event.NUM_DEC_PLACES) \ | 456 | + util.format_float(self.get_time(), Event.NUM_DEC_PLACES) \ |
440 | + ', END=' + util.format_float(self.corresp_end_event.get_time(), Event.NUM_DEC_PLACES) | 457 | + ', END=' + util.format_float(self.corresp_end_event.get_time(), Event.NUM_DEC_PLACES) |
@@ -454,15 +471,21 @@ class SwitchToEvent(Event): | |||
454 | def render(self, graph, layer, prev_events, selectable=False): | 471 | def render(self, graph, layer, prev_events, selectable=False): |
455 | if self.corresp_end_event is None: | 472 | if self.corresp_end_event is None: |
456 | return # fatally erroneous switch to | 473 | return # fatally erroneous switch to |
457 | if layer == Canvas.BOTTOM_LAYER: | 474 | if layer == self.layer: |
475 | end_time = None | ||
476 | if self.corresp_end_event is None: | ||
477 | end_time = self.get_job().get_task().get_schedule().end | ||
478 | else: | ||
479 | end_time = self.corresp_end_event.get_time() | ||
480 | |||
458 | prev_events[self] = None | 481 | prev_events[self] = None |
459 | cpu = self.get_cpu() | 482 | cpu = self.get_cpu() |
460 | task_no = self.get_job().get_task().get_task_no() | 483 | task_no = self.get_job().get_task().get_task_no() |
461 | if selectable: | 484 | if selectable: |
462 | graph.add_sel_bar_at_time(self.get_time(), self.corresp_end_event.get_time(), | 485 | graph.add_sel_bar_at_time(self.get_time(), end_time, |
463 | task_no, cpu, self) | 486 | task_no, cpu, self) |
464 | else: | 487 | else: |
465 | graph.draw_bar_at_time(self.get_time(), self.corresp_end_event.get_time(), | 488 | graph.draw_bar_at_time(self.get_time(), end_time, |
466 | task_no, cpu, self.get_job().get_job_no(), self.is_selected()) | 489 | task_no, cpu, self.get_job().get_job_no(), self.is_selected()) |
467 | 490 | ||
468 | class ReleaseEvent(Event): | 491 | class ReleaseEvent(Event): |
@@ -530,15 +553,21 @@ class InversionStartEvent(ErrorEvent): | |||
530 | super(InversionStartEvent, self).scan(cur_cpu, switches) | 553 | super(InversionStartEvent, self).scan(cur_cpu, switches) |
531 | 554 | ||
532 | def render(self, graph, layer, prev_events, selectable=False): | 555 | def render(self, graph, layer, prev_events, selectable=False): |
533 | if layer == Canvas.BOTTOM_LAYER: | 556 | end_time = None |
557 | if self.corresp_end_event is None: | ||
558 | end_time = self.get_job().get_task().get_schedule().end | ||
559 | else: | ||
560 | end_time = self.corresp_end_event.get_time() | ||
561 | |||
562 | if layer == self.layer: | ||
534 | prev_events[self] = None | 563 | prev_events[self] = None |
535 | cpu = self.get_cpu() | 564 | cpu = self.get_cpu() |
536 | task_no = self.get_job().get_task().get_task_no() | 565 | task_no = self.get_job().get_task().get_task_no() |
537 | if selectable: | 566 | if selectable: |
538 | graph.add_sel_mini_bar_at_time(self.get_time(), self.corresp_end_event.get_time(), | 567 | graph.add_sel_mini_bar_at_time(self.get_time(), end_time, |
539 | task_no, cpu, self) | 568 | task_no, cpu, self) |
540 | else: | 569 | else: |
541 | graph.draw_mini_bar_at_time(self.get_time(), self.corresp_end_event.get_time(), | 570 | graph.draw_mini_bar_at_time(self.get_time(), end_time, |
542 | task_no, cpu, self.get_job().get_job_no(), self.is_selected()) | 571 | task_no, cpu, self.get_job().get_job_no(), self.is_selected()) |
543 | 572 | ||
544 | 573 | ||
@@ -570,19 +599,45 @@ class InversionEndEvent(ErrorEvent): | |||
570 | super(InversionEndEvent, self).scan(cur_cpu, switches) | 599 | super(InversionEndEvent, self).scan(cur_cpu, switches) |
571 | 600 | ||
572 | def render(self, graph, layer, prev_events, selectable=False): | 601 | def render(self, graph, layer, prev_events, selectable=False): |
573 | if self.corresp_start_event is None or self.corresp_start_event in prev_events: | 602 | if self.corresp_start_event is None: |
574 | return # erroneous inversion end or already rendered | 603 | # We never found a corresponding start event. In that case, we can assume it lies |
575 | self.corresp_start_event.render(graph, layer, prev_events, selectable) | 604 | # in some part of the trace that was never read in. So draw a bar starting from |
605 | # the very beginning. | ||
606 | if layer == self.layer: | ||
607 | prev_events[self] = None | ||
608 | cpu = self.get_cpu() | ||
609 | task_no = self.get_job().get_task().get_task_no() | ||
610 | if selectable: | ||
611 | start = self.get_job().get_task().get_schedule().start | ||
612 | graph.add_sel_mini_bar_at_time(start, self.get_time(), | ||
613 | task_no, cpu, self) | ||
614 | else: | ||
615 | graph.draw_mini_bar_at_time(start, self.get_time(), | ||
616 | task_no, cpu, self.get_job().get_job_no(), self.is_selected()) | ||
617 | else: | ||
618 | if self.corresp_start_event in prev_events: | ||
619 | return # already rendered the bar | ||
620 | self.corresp_start_event.render(graph, layer, prev_events, selectable) | ||
576 | 621 | ||
577 | class InversionDummy(DummyEvent): | 622 | class InversionDummy(DummyEvent): |
623 | def __init__(self, time, cpu): | ||
624 | super(InversionDummy, self).__init__(time, Event.NO_CPU) | ||
625 | self.layer = Canvas.BOTTOM_LAYER | ||
626 | |||
578 | def render(self, graph, layer, prev_events, selectable=False): | 627 | def render(self, graph, layer, prev_events, selectable=False): |
579 | if self.corresp_start_event in prev_events: | 628 | if self.corresp_start_event is not None and self.corresp_start_event in prev_events: |
580 | return # we have already been rendered | 629 | return # we have already been rendered |
630 | if self.corresp_end_event is not None and self.corresp_end_event in prev_events: | ||
631 | return | ||
581 | self.corresp_start_event.render(graph, layer, prev_events, selectable) | 632 | self.corresp_start_event.render(graph, layer, prev_events, selectable) |
582 | 633 | ||
583 | class IsRunningDummy(DummyEvent): | 634 | class IsRunningDummy(DummyEvent): |
635 | def __init__(self, time, cpu): | ||
636 | super(IsRunningDummy, self).__init__(time, Event.NO_CPU) | ||
637 | self.layer = Canvas.BOTTOM_LAYER | ||
638 | |||
584 | def render(self, graph, layer, prev_events, selectable=False): | 639 | def render(self, graph, layer, prev_events, selectable=False): |
585 | if self.corresp_start_event in prev_events: | 640 | if self.corresp_start_event is None or self.corresp_start_event in prev_events: |
586 | return # we have already been rendered | 641 | return # we have already been rendered |
587 | self.corresp_start_event.render(graph, layer, prev_events, selectable) | 642 | self.corresp_start_event.render(graph, layer, prev_events, selectable) |
588 | 643 | ||