changeset f058e09b7d69 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=f058e09b7d69
description:
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:
src/base/pollevent.cc | 3 +++
src/python/swig/pyevent.cc | 3 +++
src/sim/eventq.hh | 22 ++++++++++++++++++++++
src/sim/init_signals.cc | 9 +++++++++
4 files changed, 37 insertions(+), 0 deletions(-)
diffs (132 lines):
diff -r 5744891a444b -r f058e09b7d69 src/base/pollevent.cc
--- a/src/base/pollevent.cc Thu Oct 16 05:49:53 2014 -0400
+++ b/src/base/pollevent.cc Thu Oct 16 05:49:53 2014 -0400
@@ -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 @@
if (set) {
async_event = true;
async_io = true;
+ /* Wake up some event queue to handle event */
+ getEventQueue(0)->wakeup();
}
}
diff -r 5744891a444b -r f058e09b7d69 src/python/swig/pyevent.cc
--- a/src/python/swig/pyevent.cc Thu Oct 16 05:49:53 2014 -0400
+++ b/src/python/swig/pyevent.cc Thu Oct 16 05:49:53 2014 -0400
@@ -32,6 +32,7 @@
#include "python/swig/pyevent.hh"
#include "sim/async.hh"
+#include "sim/eventq.hh"
PythonEvent::PythonEvent(PyObject *obj, Priority priority)
: Event(priority), object(obj)
@@ -59,6 +60,8 @@
// that there's been an exception.
async_event = true;
async_exception = true;
+ /* Wake up some event queue to handle event */
+ getEventQueue(0)->wakeup();
}
// Since the object has been removed from the event queue, its
diff -r 5744891a444b -r f058e09b7d69 src/sim/eventq.hh
--- a/src/sim/eventq.hh Thu Oct 16 05:49:53 2014 -0400
+++ b/src/sim/eventq.hh Thu Oct 16 05:49:53 2014 -0400
@@ -606,6 +606,21 @@
void handleAsyncInsertions();
/**
+ * Function to signal that the event loop should be woken up because
+ * an event has been scheduled by an agent outside the gem5 event
+ * loop(s) whose event insertion may not have been noticed by gem5.
+ * This function isn't needed by the usual gem5 event loop but may
+ * be necessary in derived EventQueues which host gem5 onto other
+ * schedulers.
+ *
+ * @param when Time of a delayed wakeup (if known). This parameter
+ * can be used by an implementation to schedule a wakeup in the
+ * future if it is sure it will remain active until then.
+ * Or it can be ignored and the event queue can be woken up now.
+ */
+ virtual void wakeup(Tick when = (Tick)-1) { }
+
+ /**
* function for replacing the head of the event queue, so that a
* different set of events can run without disturbing events that have
* already been scheduled. Already scheduled events can be processed
@@ -635,6 +650,8 @@
virtual void serialize(std::ostream &os);
virtual void unserialize(Checkpoint *cp, const std::string §ion);
#endif
+
+ virtual ~EventQueue() { }
};
void dumpMainQueue();
@@ -693,6 +710,11 @@
eventq->reschedule(event, when, always);
}
+ void wakeupEventQueue(Tick when = (Tick)-1)
+ {
+ eventq->wakeup(when);
+ }
+
void setCurTick(Tick newVal) { eventq->setCurTick(newVal); }
};
diff -r 5744891a444b -r f058e09b7d69 src/sim/init_signals.cc
--- a/src/sim/init_signals.cc Thu Oct 16 05:49:53 2014 -0400
+++ b/src/sim/init_signals.cc Thu Oct 16 05:49:53 2014 -0400
@@ -48,6 +48,7 @@
#include "base/cprintf.hh"
#include "sim/async.hh"
#include "sim/core.hh"
+#include "sim/eventq.hh"
#include "sim/init_signals.hh"
using namespace std;
@@ -58,6 +59,8 @@
{
async_event = true;
async_statdump = true;
+ /* Wake up some event queue to handle event */
+ getEventQueue(0)->wakeup();
}
void
@@ -66,6 +69,8 @@
async_event = true;
async_statdump = true;
async_statreset = true;
+ /* Wake up some event queue to handle event */
+ getEventQueue(0)->wakeup();
}
/// Exit signal handler.
@@ -74,6 +79,8 @@
{
async_event = true;
async_exit = true;
+ /* Wake up some event queue to handle event */
+ getEventQueue(0)->wakeup();
}
/// Abort signal handler.
@@ -89,6 +96,8 @@
{
async_event = true;
async_io = true;
+ /* Wake up some event queue to handle event */
+ getEventQueue(0)->wakeup();
}
static void
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev