diff options
author | Curtis Dunham <Curtis.Dunham@arm.com> | 2014-12-23 11:51:40 -0600 |
---|---|---|
committer | Curtis Dunham <Curtis.Dunham@arm.com> | 2014-12-23 11:51:40 -0600 |
commit | 10b5e5431d004fe51df30140f20346b2c91248fb (patch) | |
tree | abff13d4c9e7cbcabdf2c5533066fb957fcdfead /src | |
parent | 10c69bb1684c515d683a084b40ab19e5e7ee8c11 (diff) | |
download | gem5-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.
Diffstat (limited to 'src')
-rw-r--r-- | src/python/swig/event.i | 4 | ||||
-rw-r--r-- | src/python/swig/pyevent.cc | 8 | ||||
-rw-r--r-- | src/python/swig/pyevent.hh | 5 |
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(); |