systemc: Handle suspended processes and handle sensitivity overload.

This change keeps track of whether a process would have become ready
but was suspended so that it can become ready when the process is
resumed.

Also, this makes a process ignore its static sensitivity while a
dynamic sensitivity is in place.

Change-Id: If3f6c62f370051e574f81bf227746db8c43527e2
Reviewed-on: https://gem5-review.googlesource.com/11715
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>
This commit is contained in:
Gabe Black
2018-07-16 16:44:07 -07:00
parent eb3b52b56c
commit e02b2a3d3b
3 changed files with 39 additions and 15 deletions

View File

@@ -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),