summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCurtis Dunham <Curtis.Dunham@arm.com>2014-12-23 11:51:40 -0600
committerCurtis Dunham <Curtis.Dunham@arm.com>2014-12-23 11:51:40 -0600
commit10b5e5431d004fe51df30140f20346b2c91248fb (patch)
treeabff13d4c9e7cbcabdf2c5533066fb957fcdfead
parent10c69bb1684c515d683a084b40ab19e5e7ee8c11 (diff)
downloadgem5-10b5e5431d004fe51df30140f20346b2c91248fb.tar.xz
sim: fix reference counting of PythonEvent
When gem5 is a slave to another simulator and the Python is only used to initialize the configuration (and not perform actual simulation), a "debug start" (--debug-start) event will get freed during or immediately after the initial Python frame's execution rather than remaining in the event queue. This tricky patch fixes the GC issue causing this.
-rw-r--r--src/python/swig/event.i4
-rw-r--r--src/python/swig/pyevent.cc8
-rw-r--r--src/python/swig/pyevent.hh5
3 files changed, 11 insertions, 6 deletions
diff --git a/src/python/swig/event.i b/src/python/swig/event.i
index 23bb31364..cc72794ed 100644
--- a/src/python/swig/event.i
+++ b/src/python/swig/event.i
@@ -71,6 +71,10 @@
}
}
+%typemap(out) PythonEvent* {
+ result->object = $result = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_PythonEvent, SWIG_POINTER_NEW);
+}
+
%ignore EventQueue::schedule;
%ignore EventQueue::deschedule;
diff --git a/src/python/swig/pyevent.cc b/src/python/swig/pyevent.cc
index 6d80a00cd..d83d57cbf 100644
--- a/src/python/swig/pyevent.cc
+++ b/src/python/swig/pyevent.cc
@@ -34,10 +34,10 @@
#include "sim/async.hh"
#include "sim/eventq.hh"
-PythonEvent::PythonEvent(PyObject *obj, Priority priority)
- : Event(priority), object(obj)
+PythonEvent::PythonEvent(PyObject *code, Priority priority)
+ : Event(priority), eventCode(code)
{
- if (object == NULL)
+ if (code == NULL)
panic("Passed in invalid object");
}
@@ -49,7 +49,7 @@ void
PythonEvent::process()
{
PyObject *args = PyTuple_New(0);
- PyObject *result = PyObject_Call(object, args, NULL);
+ PyObject *result = PyObject_Call(eventCode, args, NULL);
Py_DECREF(args);
if (result) {
diff --git a/src/python/swig/pyevent.hh b/src/python/swig/pyevent.hh
index f34fbd996..f668c1d9a 100644
--- a/src/python/swig/pyevent.hh
+++ b/src/python/swig/pyevent.hh
@@ -37,9 +37,10 @@
class PythonEvent : public Event
{
private:
- PyObject *object;
-
+ PyObject *eventCode; // PyObject to call to perform event
public:
+ PyObject *object; // PyObject wrapping this PythonEvent
+
PythonEvent(PyObject *obj, Event::Priority priority);
~PythonEvent();