systemc: Handle event notifications scheduled before sc_start.
authorGabe Black <gabeblack@google.com>
Fri, 20 Jul 2018 00:32:34 +0000 (17:32 -0700)
committerGabe Black <gabeblack@google.com>
Tue, 11 Sep 2018 21:41:55 +0000 (21:41 +0000)
After sc_start is called, gem5 has run far enough to have an event
queue to schedule the notification events on. Before then, it's still
legal to request a timed notification. The scheduler should keep track
of those requests, and once an event queue is available it should
add them to it.

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

src/systemc/core/scheduler.cc
src/systemc/core/scheduler.hh

index 6bb67d136b9faf9dea8ee7e7867c8f1855ef72dd..5174627d0854c9f16688bb7686d8953bb7ea314b 100644 (file)
@@ -60,6 +60,10 @@ Scheduler::prepareForInit()
         p->ready();
     }
 
+    for (auto ets: eventsToSchedule)
+        eq->schedule(ets.first, ets.second);
+    eventsToSchedule.clear();
+
     if (_started)
         eq->schedule(&maxTickEvent, maxTick);
 
index 3ac7f419f7d293e1267aaf6d09df8151c38c935b..73d660e9e800e9319de13a1c5cf6edc2b9f7f3ec 100644 (file)
@@ -187,7 +187,11 @@ class Scheduler
     schedule(::Event *event, Tick tick)
     {
         pendingTicks[tick]++;
-        eq->schedule(event, tick);
+
+        if (initReady)
+            eq->schedule(event, tick);
+        else
+            eventsToSchedule[event] = tick;
     }
 
     // For descheduling delayed/timed notifications/timeouts.
@@ -197,7 +201,11 @@ class Scheduler
         auto it = pendingTicks.find(event->when());
         if (--it->second == 0)
             pendingTicks.erase(it);
-        eq->deschedule(event);
+
+        if (initReady)
+            eq->deschedule(event);
+        else
+            eventsToSchedule.erase(event);
     }
 
     // Tell the scheduler than an event fired for bookkeeping purposes.
@@ -302,6 +310,8 @@ class Scheduler
     ProcessList readyList;
 
     ChannelList updateList;
+
+    std::map<::Event *, Tick> eventsToSchedule;
 };
 
 extern Scheduler scheduler;