diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/systemc/core/process.cc | 28 | ||||
-rw-r--r-- | src/systemc/core/scheduler.cc | 7 |
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 |