summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2018-08-24 17:58:10 -0700
committerGabe Black <gabeblack@google.com>2018-09-26 00:01:55 +0000
commit28b09df79bdd6c232be2b386119569291f92311c (patch)
tree81ad2c20317c9946794152df562801958239ee50 /src
parente95a3062415a27ddd8183fa3a621aba6198b1621 (diff)
downloadgem5-28b09df79bdd6c232be2b386119569291f92311c.tar.xz
systemc: Make sure methods aren't restarted by yield.
Methods may need to yield control to other Processes when throwing them exceptions. In that case, we need to keep track of the fact that the method doesn't need to be restarted when it resumes within yield. Change-Id: I829c387d6ddb563b2957db47e55adadbbe6bc51a Reviewed-on: https://gem5-review.googlesource.com/12265 Reviewed-by: Gabe Black <gabeblack@google.com> Maintainer: Gabe Black <gabeblack@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/systemc/core/process.cc1
-rw-r--r--src/systemc/core/process.hh1
-rw-r--r--src/systemc/core/scheduler.cc4
3 files changed, 5 insertions, 1 deletions
diff --git a/src/systemc/core/process.cc b/src/systemc/core/process.cc
index 1a101f749..94e49a8af 100644
--- a/src/systemc/core/process.cc
+++ b/src/systemc/core/process.cc
@@ -320,6 +320,7 @@ Process::run()
_isUnwinding = false;
}
} while (reset);
+ needsStart(true);
}
void
diff --git a/src/systemc/core/process.hh b/src/systemc/core/process.hh
index 17f417b6e..0cb3e3c01 100644
--- a/src/systemc/core/process.hh
+++ b/src/systemc/core/process.hh
@@ -271,6 +271,7 @@ class Process : public ::sc_core::sc_process_b, public ListNode
public:
virtual ::sc_core::sc_curr_proc_kind procKind() const = 0;
bool needsStart() const { return _needsStart; }
+ void needsStart(bool ns) { _needsStart = ns; }
bool dynamic() const { return _dynamic; }
bool isUnwinding() const { return _isUnwinding; }
void isUnwinding(bool v) { _isUnwinding = v; }
diff --git a/src/systemc/core/scheduler.cc b/src/systemc/core/scheduler.cc
index 2dc3aa74c..7851bac67 100644
--- a/src/systemc/core/scheduler.cc
+++ b/src/systemc/core/scheduler.cc
@@ -174,8 +174,10 @@ Scheduler::yield()
// Fibers which aren't running should be parked at this line.
_current->fiber()->run();
// If the current process needs to be manually started, start it.
- if (_current && _current->needsStart())
+ if (_current && _current->needsStart()) {
+ _current->needsStart(false);
_current->run();
+ }
}
if (_current && _current->excWrapper) {
// Make sure this isn't a method process.