summaryrefslogtreecommitdiffstats
path: root/unit_trace/viz/schedule.py
diff options
context:
space:
mode:
authorGary Bressler <garybressler@nc.rr.com>2010-03-19 12:55:12 -0400
committerGary Bressler <garybressler@nc.rr.com>2010-03-19 12:55:12 -0400
commitee7ae82ae6df1378203957b7fa77066153e13c36 (patch)
treeceb3b420a5ce80b07e9a23bbef0ec9639dbb384f /unit_trace/viz/schedule.py
parente6dbe1605d8ae52ee65a08e929ed1810bd07d45c (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.py89
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
429class SwitchToEvent(Event): 446class 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
468class ReleaseEvent(Event): 491class 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
577class InversionDummy(DummyEvent): 622class 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
583class IsRunningDummy(DummyEvent): 634class 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