diff options
author | Andreas Hansson <andreas.hansson@arm.com> | 2014-10-16 05:49:53 -0400 |
---|---|---|
committer | Andreas Hansson <andreas.hansson@arm.com> | 2014-10-16 05:49:53 -0400 |
commit | e2a13386e543901ba81b52f6cbd48d561ccb2b6d (patch) | |
tree | e863f21b2048dd1da44eb5e08f51ee0aedc76397 /src/base | |
parent | 960935a5bd31b0a325285beb1deb816429c7fe00 (diff) | |
download | gem5-e2a13386e543901ba81b52f6cbd48d561ccb2b6d.tar.xz |
sim: EventQueue wakeup on events scheduled outside the event loop
This patch adds a 'wakeup' member function to EventQueue which should be
called on an event queue whenever an event is scheduled on the event queue
from outside code within the call tree of the gem5 event loop.
This clearly isn't necessary for normal gem5 EventQueue operation but
becomes the minimum necessary interface to allow hosting gem5's event loop
onto other schedulers where there may be calls into gem5 from external
code which schedules events onto an EventQueue between the current time and
the time of the next scheduled event.
The use case I have in mind is a SystemC hosting where the event loop is:
while (more events) {
wait(time_to_next_event or wakeup)
setCurTick
service events at this time
}
where the 'wait' needs to be woken up if time_to_next_event becomes shorter
due to a scheduled event from SystemC arriving in a gem5 object.
Requiring 'wakeup' to be called is a more efficient interface than
requiring all gem5 event scheduling actions to affect the host scheduler.
This interface could be located elsewhere, say on another global object,
or by being passed by the host scheduler to objects which will schedule
such events, but it seems cleanest to put it on EventQueue as it is
actually a signal to the queue.
EventQueue::wakeup is called for async_event events on event queue 0 as
it's only important that *some* queue be triggered for such events.
Diffstat (limited to 'src/base')
-rw-r--r-- | src/base/pollevent.cc | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/src/base/pollevent.cc b/src/base/pollevent.cc index fb28d63d6..ea4d632d0 100644 --- a/src/base/pollevent.cc +++ b/src/base/pollevent.cc @@ -44,6 +44,7 @@ #include "base/types.hh" #include "sim/async.hh" #include "sim/core.hh" +#include "sim/eventq.hh" #include "sim/serialize.hh" using namespace std; @@ -224,5 +225,7 @@ PollQueue::setupAsyncIO(int fd, bool set) if (set) { async_event = true; async_io = true; + /* Wake up some event queue to handle event */ + getEventQueue(0)->wakeup(); } } |