diff --git a/src/systemc/core/channel.cc b/src/systemc/core/channel.cc index 04f158bead..4c731716d3 100644 --- a/src/systemc/core/channel.cc +++ b/src/systemc/core/channel.cc @@ -54,8 +54,7 @@ Channel::requestUpdate() void Channel::asyncRequestUpdate() { - //TODO This should probably not request an update directly. - scheduler.requestUpdate(this); + scheduler.asyncRequestUpdate(this); } std::set allChannels; diff --git a/src/systemc/core/scheduler.cc b/src/systemc/core/scheduler.cc index d06ddfb582..f1a78198d9 100644 --- a/src/systemc/core/scheduler.cc +++ b/src/systemc/core/scheduler.cc @@ -257,6 +257,13 @@ Scheduler::requestUpdate(Channel *c) scheduleReadyEvent(); } +void +Scheduler::asyncRequestUpdate(Channel *c) +{ + std::lock_guard lock(asyncListMutex); + asyncUpdateList.pushLast(c); +} + void Scheduler::scheduleReadyEvent() { @@ -321,6 +328,12 @@ void Scheduler::runUpdate() { status(StatusUpdate); + { + std::lock_guard lock(asyncListMutex); + Channel *channel; + while ((channel = asyncUpdateList.getNext()) != nullptr) + updateList.pushLast(channel); + } try { Channel *channel = updateList.getNext(); diff --git a/src/systemc/core/scheduler.hh b/src/systemc/core/scheduler.hh index 63f6ac35d9..b576bec006 100644 --- a/src/systemc/core/scheduler.hh +++ b/src/systemc/core/scheduler.hh @@ -32,6 +32,7 @@ #include #include +#include #include #include @@ -191,6 +192,8 @@ class Scheduler // Schedule an update for a given channel. void requestUpdate(Channel *c); + // Same as above, but may be called from a different thread. + void asyncRequestUpdate(Channel *c); // Run the given process immediately, preempting whatever may be running. void @@ -481,6 +484,9 @@ class Scheduler ChannelList updateList; + ChannelList asyncUpdateList; + std::mutex asyncListMutex; + std::map<::Event *, Tick> eventsToSchedule; std::set traceFiles;