diff options
Diffstat (limited to 'src/python')
-rw-r--r-- | src/python/m5/event.py | 2 | ||||
-rw-r--r-- | src/python/swig/event.i | 29 | ||||
-rw-r--r-- | src/python/swig/pyevent.cc | 23 | ||||
-rw-r--r-- | src/python/swig/pyevent.hh | 3 |
4 files changed, 37 insertions, 20 deletions
diff --git a/src/python/m5/event.py b/src/python/m5/event.py index 2b43e578e..ce003defb 100644 --- a/src/python/m5/event.py +++ b/src/python/m5/event.py @@ -36,7 +36,7 @@ mainq = internal.event.cvar.mainEventQueue def create(obj, priority=None): if priority is None: priority = internal.event.Event.Default_Pri - return internal.event.PythonEvent(obj, priority) + return PythonEvent(obj, priority) class Event(PythonEvent): def __init__(self, priority=None): diff --git a/src/python/swig/event.i b/src/python/swig/event.i index 10d75d2de..b40e59a4b 100644 --- a/src/python/swig/event.i +++ b/src/python/swig/event.i @@ -41,6 +41,35 @@ #pragma SWIG nowarn=350,351 +%extend EventQueue { + void + schedule(Event *event, Tick when) + { + // Any python event that are scheduled must have their + // internal object's refcount incremented so that the object + // sticks around while it is in the event queue. + PythonEvent *pyevent = dynamic_cast<PythonEvent *>(event); + if (pyevent) + pyevent->incref(); + $self->schedule(event, when); + } + + void + deschedule(Event *event) + { + $self->deschedule(event); + + // Now that we're removing the python object from the event + // queue, we need to decrement its reference count. + PythonEvent *pyevent = dynamic_cast<PythonEvent *>(event); + if (pyevent) + pyevent->decref(); + } +} + +%ignore EventQueue::schedule; +%ignore EventQueue::deschedule; + %import "base/fast_alloc.hh" %import "sim/serialize.hh" diff --git a/src/python/swig/pyevent.cc b/src/python/swig/pyevent.cc index a201e0185..0695ed2d3 100644 --- a/src/python/swig/pyevent.cc +++ b/src/python/swig/pyevent.cc @@ -38,15 +38,10 @@ PythonEvent::PythonEvent(PyObject *obj, Priority priority) { if (object == NULL) panic("Passed in invalid object"); - - Py_INCREF(object); - - setFlags(AutoDelete); } PythonEvent::~PythonEvent() { - Py_DECREF(object); } void @@ -65,6 +60,10 @@ PythonEvent::process() async_event = true; async_exception = true; } + + // Since the object has been removed from the event queue, its + // reference count must be decremented. + Py_DECREF(object); } CountedDrainEvent * @@ -85,17 +84,3 @@ cleanupCountedDrain(Event *counted_drain) assert(event->getCount() == 0); delete event; } - -#if 0 -Event * -create(PyObject *object, Event::Priority priority) -{ - return new PythonEvent(object, priority); -} - -void -destroy(Event *event) -{ - delete event; -} -#endif diff --git a/src/python/swig/pyevent.hh b/src/python/swig/pyevent.hh index 22b562de1..9006a0404 100644 --- a/src/python/swig/pyevent.hh +++ b/src/python/swig/pyevent.hh @@ -43,6 +43,9 @@ class PythonEvent : public Event PythonEvent(PyObject *obj, Event::Priority priority); ~PythonEvent(); + void incref() { Py_INCREF(object); } + void decref() { Py_DECREF(object); } + virtual void process(); }; |