systemc: Handle sc_stop called from sc_main correctly.
authorGabe Black <gabeblack@google.com>
Sun, 26 Aug 2018 22:53:31 +0000 (15:53 -0700)
committerGabe Black <gabeblack@google.com>
Wed, 26 Sep 2018 00:03:12 +0000 (00:03 +0000)
When in sc_main, sc_is_running will return true but we're not going
to run any gem5 events since we're currently in the sc_main Fiber. In
that case, we need to do the sc_stop work inline.

If we're actually running and not just paused, then we do still want to
schedule the work of sc_stop to happen as its own event since that will
happen before returning to sc_main, and actually will likely be the
mechanism by which sc_main starts executing again.

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

src/systemc/core/sc_main.cc

index ea243bf61d40b4d1ac5f8b55825fdbd6ea7f8f20..2637cef0e6b2fca406ac6fa63c1e1a5791df3e42 100644 (file)
@@ -225,7 +225,7 @@ sc_stop()
     if (::sc_gem5::Kernel::status() == SC_STOPPED)
         return;
 
-    if (sc_is_running()) {
+    if ((sc_get_status() & SC_RUNNING)) {
         bool finish_delta = (_stop_mode == SC_STOP_FINISH_DELTA);
         ::sc_gem5::scheduler.scheduleStop(finish_delta);
     } else {