systemc: If an event is a delta notification, checked if it's timed.
authorGabe Black <gabeblack@google.com>
Thu, 23 Aug 2018 01:40:32 +0000 (18:40 -0700)
committerGabe Black <gabeblack@google.com>
Tue, 25 Sep 2018 23:56:47 +0000 (23:56 +0000)
If we're descheduling an event which is at the current time, it may
have been scheduled as a delta notification, but it could have also
been scheduled as a timed notification and we just got to that point
in time. If an event is for the current time but isn't in the delta
notifications, this change detects that and then treats it as a timed
notification.

Change-Id: I1d8f4c40325cc7f355b7f2e6f08611483ce11858
Reviewed-on: https://gem5-review.googlesource.com/12250
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>

src/systemc/core/scheduler.hh

index 697aa11ad389bba81d9285086f00b724d72d7430..3068a0aaacddeb5e65898e55c7577396d3c8b97a 100644 (file)
@@ -238,10 +238,11 @@ class Scheduler
     deschedule(ScEvent *event)
     {
         if (event->when() == getCurTick()) {
-            // Remove from delta notifications.
-            deltas.erase(event);
-            event->deschedule();
-            return;
+            // Attempt to remove from delta notifications.
+            if (deltas.erase(event) == 1) {
+                event->deschedule();
+                return;
+            }
         }
 
         // Timed notification/timeout.
@@ -250,7 +251,7 @@ class Scheduler
                 "Descheduling event at time with no events.");
         TimeSlot *ts = tsit->second;
         ScEvents &events = ts->events;
-        events.erase(event);
+        assert(events.erase(event));
         event->deschedule();
 
         // If no more events are happening at this time slot, get rid of it.