From 137b4993a4710a247d79cdc0194dfa107b080f98 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Mon, 8 Oct 2018 23:08:27 -0700 Subject: 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 Maintainer: Gabe Black --- src/systemc/core/process.cc | 9 +++++---- src/systemc/core/process.hh | 4 ++++ src/systemc/core/scheduler.cc | 3 +++ 3 files changed, 12 insertions(+), 4 deletions(-) (limited to 'src/systemc') diff --git a/src/systemc/core/process.cc b/src/systemc/core/process.cc index a0759d9cc..e29cee030 100644 --- a/src/systemc/core/process.cc +++ b/src/systemc/core/process.cc @@ -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() > diff --git a/src/systemc/core/process.hh b/src/systemc/core/process.hh index d50c82905..12901bc8e 100644 --- a/src/systemc/core/process.hh +++ b/src/systemc/core/process.hh @@ -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 &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(); diff --git a/src/systemc/core/scheduler.cc b/src/systemc/core/scheduler.cc index ec91c795a..52bf7ec31 100644 --- a/src/systemc/core/scheduler.cc +++ b/src/systemc/core/scheduler.cc @@ -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 -- cgit v1.2.3