summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/systemc/core/process.cc28
-rw-r--r--src/systemc/core/scheduler.cc7
2 files changed, 22 insertions, 13 deletions
diff --git a/src/systemc/core/process.cc b/src/systemc/core/process.cc
index 678cb04db..ec5c57cb9 100644
--- a/src/systemc/core/process.cc
+++ b/src/systemc/core/process.cc
@@ -108,15 +108,13 @@ SensitivityEventOrList::~SensitivityEventOrList()
class UnwindExceptionReset : public ::sc_core::sc_unwind_exception
{
public:
- const char *what() const throw() override { return "RESET"; }
- bool is_reset() const override { return true; }
+ UnwindExceptionReset() { _isReset = true; }
};
class UnwindExceptionKill : public ::sc_core::sc_unwind_exception
{
public:
- const char *what() const throw() override { return "KILL"; }
- bool is_reset() const override { return false; }
+ UnwindExceptionKill() {}
};
template <typename T>
@@ -194,10 +192,6 @@ Process::enable(bool inc_kids)
void
Process::kill(bool inc_kids)
{
- // Update our state.
- _terminated = true;
- _isUnwinding = true;
-
// Propogate the kill to our children no matter what happens to us.
if (inc_kids)
forEachKid([](Process *p) { p->kill(true); });
@@ -206,6 +200,13 @@ Process::kill(bool inc_kids)
if (_isUnwinding)
return;
+ // Update our state.
+ _terminated = true;
+ _isUnwinding = true;
+ _suspendedReady = false;
+ _suspended = false;
+ _syncReset = false;
+
// Inject the kill exception into this process.
injectException(killException);
@@ -215,9 +216,6 @@ Process::kill(bool inc_kids)
void
Process::reset(bool inc_kids)
{
- // Update our state.
- _isUnwinding = true;
-
// Propogate the reset to our children no matter what happens to us.
if (inc_kids)
forEachKid([](Process *p) { p->reset(true); });
@@ -226,6 +224,9 @@ Process::reset(bool inc_kids)
if (_isUnwinding)
return;
+ // Update our state.
+ _isUnwinding = true;
+
// Inject the reset exception into this process.
injectException(resetException);
@@ -243,7 +244,7 @@ void
Process::injectException(ExceptionWrapperBase &exc)
{
excWrapper = &exc;
- // Let this process preempt us.
+ scheduler.runNow(this);
};
void
@@ -289,8 +290,9 @@ Process::run()
reset = false;
try {
func->call();
- } catch(::sc_core::sc_unwind_exception exc) {
+ } catch(const ::sc_core::sc_unwind_exception &exc) {
reset = exc.is_reset();
+ _isUnwinding = false;
}
} while (reset);
_terminated = true;
diff --git a/src/systemc/core/scheduler.cc b/src/systemc/core/scheduler.cc
index c2b5ec38d..085602d7b 100644
--- a/src/systemc/core/scheduler.cc
+++ b/src/systemc/core/scheduler.cc
@@ -117,6 +117,13 @@ Scheduler::yield()
if (_current && _current->needsStart())
_current->run();
}
+ if (_current && _current->excWrapper) {
+ // Make sure this isn't a method process.
+ assert(!_current->needsStart());
+ auto ew = _current->excWrapper;
+ _current->excWrapper = nullptr;
+ ew->throw_it();
+ }
}
void