summaryrefslogtreecommitdiff
path: root/src/systemc/core/process.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/systemc/core/process.cc')
-rw-r--r--src/systemc/core/process.cc36
1 files changed, 25 insertions, 11 deletions
diff --git a/src/systemc/core/process.cc b/src/systemc/core/process.cc
index a949c9dee..63d2ff94b 100644
--- a/src/systemc/core/process.cc
+++ b/src/systemc/core/process.cc
@@ -36,14 +36,6 @@
namespace sc_gem5
{
-void
-Sensitivity::satisfy()
-{
- warn_once("Ignoring suspended status for now.\n");
- process->setDynamic(nullptr);
- scheduler.ready(process);
-}
-
SensitivityTimeout::SensitivityTimeout(Process *p, ::sc_core::sc_time t) :
Sensitivity(p), timeoutEvent(this), timeout(t)
{
@@ -88,7 +80,7 @@ SensitivityEventAndList::notifyWork(Event *e)
e->delSensitivity(this);
count++;
if (count == list->events.size())
- satisfy();
+ process->satisfySensitivity(this);
}
SensitivityEventOrList::SensitivityEventOrList(
@@ -150,7 +142,7 @@ Process::suspend(bool inc_kids)
if (!_suspended) {
_suspended = true;
- //TODO Suspend this process.
+ _suspendedReady = false;
}
if (procKind() != ::sc_core::SC_METHOD_PROC_ &&
@@ -167,7 +159,9 @@ Process::resume(bool inc_kids)
if (_suspended) {
_suspended = false;
- //TODO Resume this process.
+ if (_suspendedReady)
+ ready();
+ _suspendedReady = false;
}
}
@@ -309,6 +303,26 @@ Process::setDynamic(Sensitivity *s)
dynamicSensitivity = s;
}
+void
+Process::satisfySensitivity(Sensitivity *s)
+{
+ // If there's a dynamic sensitivity and this wasn't it, ignore.
+ if (dynamicSensitivity && dynamicSensitivity != s)
+ return;
+
+ setDynamic(nullptr);
+ ready();
+}
+
+void
+Process::ready()
+{
+ if (suspended())
+ _suspendedReady = true;
+ else
+ scheduler.ready(this);
+}
+
Process::Process(const char *name, ProcessFuncWrapper *func, bool _dynamic) :
::sc_core::sc_object(name), excWrapper(nullptr), func(func),
_running(false), _dynamic(_dynamic), _isUnwinding(false),