systemc: Make Process track whether it's dynamic on its own.
authorGabe Black <gabeblack@google.com>
Wed, 29 Aug 2018 07:18:23 +0000 (00:18 -0700)
committerGabe Black <gabeblack@google.com>
Wed, 3 Oct 2018 00:15:14 +0000 (00:15 +0000)
Processes which are created in end_of_elaboration aren't created with
sc_spawn but still need to figure out if they're dynamic. Rather than
duplicate the check in sc_spawn, this change centralizes it in the
Process class itself.

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

src/systemc/core/process.cc
src/systemc/core/process.hh
src/systemc/core/process_types.hh
src/systemc/core/sc_spawn.cc

index 0784ab49f557b1480af71ed0abfb4d177446c7f4..830b8c729889d22e8f6b299a1b9da17f8d021773 100644 (file)
@@ -390,13 +390,15 @@ Process::lastReport(::sc_core::sc_report *report)
 
 ::sc_core::sc_report *Process::lastReport() const { return _lastReport.get(); }
 
-Process::Process(const char *name, ProcessFuncWrapper *func, bool _dynamic) :
+Process::Process(const char *name, ProcessFuncWrapper *func) :
     ::sc_core::sc_process_b(name), excWrapper(nullptr), func(func),
-    _needsStart(true), _dynamic(_dynamic), _isUnwinding(false),
-    _terminated(false), _suspended(false), _disabled(false),
-    _syncReset(false), refCount(0), stackSize(::Fiber::DefaultStackSize),
-    dynamicSensitivity(nullptr)
+    _needsStart(true), _isUnwinding(false), _terminated(false),
+    _suspended(false), _disabled(false), _syncReset(false), refCount(0),
+    stackSize(::Fiber::DefaultStackSize), dynamicSensitivity(nullptr)
 {
+    _dynamic =
+            (::sc_core::sc_get_status() >
+             ::sc_core::SC_BEFORE_END_OF_ELABORATION);
     _newest = this;
 }
 
index 0cb3e3c01c3e06fe7afd5f6b54286d8da7dbd4db..0d852afdb2e57d221ab5f83a53be44256745cd12 100644 (file)
@@ -327,7 +327,7 @@ class Process : public ::sc_core::sc_process_b, public ListNode
     ::sc_core::sc_report *lastReport() const;
 
   protected:
-    Process(const char *name, ProcessFuncWrapper *func, bool _dynamic);
+    Process(const char *name, ProcessFuncWrapper *func);
 
     static Process *_newest;
 
index 2dde4672a5eab6b6aadd50292aab34cb925bfa56..5fbab8038b293979e3347c7541ac97eb2e348455 100644 (file)
@@ -39,9 +39,7 @@ namespace sc_gem5
 class Method : public Process
 {
   public:
-    Method(const char *name, ProcessFuncWrapper *func, bool _dynamic=false) :
-        Process(name, func, _dynamic)
-    {}
+    Method(const char *name, ProcessFuncWrapper *func) : Process(name, func) {}
 
     const char *kind() const override { return "sc_method_process"; }
 
@@ -55,8 +53,8 @@ class Method : public Process
 class Thread : public Process
 {
   public:
-    Thread(const char *name, ProcessFuncWrapper *func, bool _dynamic=false) :
-        Process(name, func, _dynamic), ctx(nullptr)
+    Thread(const char *name, ProcessFuncWrapper *func) :
+        Process(name, func), ctx(nullptr)
     {}
 
     ~Thread() { delete ctx; }
@@ -105,8 +103,7 @@ class Thread : public Process
 class CThread : public Thread
 {
   public:
-    CThread(const char *name, ProcessFuncWrapper *func, bool _dynamic=false) :
-        Thread(name, func, _dynamic)
+    CThread(const char *name, ProcessFuncWrapper *func) : Thread(name, func)
     {
         // We'll be in the initialization list now, but we shouldn't be.
         popListNode();
index 054feb8da0f8e998e83d2a91c42f208bb0dedafc..b0570a663eb33b80a0d18b4c3b9690af8b1496be 100644 (file)
@@ -60,15 +60,11 @@ spawnWork(ProcessFuncWrapper *func, const char *name,
             name = ::sc_core::sc_gen_unique_name("thread_p");
     }
 
-    bool dynamic =
-        (::sc_core::sc_get_status() >
-         ::sc_core::SC_BEFORE_END_OF_ELABORATION);
-
     Process *proc;
     if (method)
-        proc = new Method(name, func, dynamic);
+        proc = new Method(name, func);
     else
-        proc = new Thread(name, func, dynamic);
+        proc = new Thread(name, func);
 
     if (opts) {
         for (auto e: opts->_events)