systemc: Don't re-schedule a process which is already scheduled.
Change-Id: I8e12713c49aad03d0bfb779883adcbfa8fd4b42e Reviewed-on: https://gem5-review.googlesource.com/c/13334 Reviewed-by: Gabe Black <gabeblack@google.com> Maintainer: Gabe Black <gabeblack@google.com>
This commit is contained in:
@@ -359,7 +359,7 @@ Process::ready()
|
||||
return;
|
||||
if (suspended())
|
||||
_suspendedReady = true;
|
||||
else
|
||||
else if (!scheduled())
|
||||
scheduler.ready(this);
|
||||
}
|
||||
|
||||
@@ -381,9 +381,10 @@ Process::Process(const char *name, ProcessFuncWrapper *func, bool internal) :
|
||||
timeoutEvent([this]() { this->timeout(); }),
|
||||
func(func), _internal(internal), _timedOut(false), _dontInitialize(false),
|
||||
_needsStart(true), _isUnwinding(false), _terminated(false),
|
||||
_suspended(false), _disabled(false), _syncReset(false), syncResetCount(0),
|
||||
asyncResetCount(0), _waitCount(0), refCount(0),
|
||||
stackSize(::Fiber::DefaultStackSize), dynamicSensitivity(nullptr)
|
||||
_scheduled(false), _suspended(false), _disabled(false),
|
||||
_syncReset(false), syncResetCount(0), asyncResetCount(0), _waitCount(0),
|
||||
refCount(0), stackSize(::Fiber::DefaultStackSize),
|
||||
dynamicSensitivity(nullptr)
|
||||
{
|
||||
_dynamic =
|
||||
(::sc_core::sc_get_status() >
|
||||
|
||||
@@ -72,6 +72,9 @@ class Process : public ::sc_core::sc_process_b, public ListNode
|
||||
void isUnwinding(bool v) { _isUnwinding = v; }
|
||||
bool terminated() const { return _terminated; }
|
||||
|
||||
bool scheduled() const { return _scheduled; }
|
||||
void scheduled(bool new_val) { _scheduled = new_val; }
|
||||
|
||||
void forEachKid(const std::function<void(Process *)> &work);
|
||||
|
||||
bool suspended() const { return _suspended; }
|
||||
@@ -172,6 +175,7 @@ class Process : public ::sc_core::sc_process_b, public ListNode
|
||||
bool _dynamic;
|
||||
bool _isUnwinding;
|
||||
bool _terminated;
|
||||
bool _scheduled;
|
||||
|
||||
void terminate();
|
||||
|
||||
|
||||
@@ -165,6 +165,7 @@ Scheduler::yield()
|
||||
Fiber::primaryFiber()->run();
|
||||
} else {
|
||||
_current->popListNode();
|
||||
_current->scheduled(false);
|
||||
// Switch to whatever Fiber is supposed to run this process. All
|
||||
// Fibers which aren't running should be parked at this line.
|
||||
_current->fiber()->run();
|
||||
@@ -199,6 +200,8 @@ Scheduler::ready(Process *p)
|
||||
if (_stopNow)
|
||||
return;
|
||||
|
||||
p->scheduled(true);
|
||||
|
||||
if (p->procKind() == ::sc_core::SC_METHOD_PROC_)
|
||||
readyListMethods.pushLast(p);
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user