diff --git a/src/python/m5/simulate.py b/src/python/m5/simulate.py --- a/src/python/m5/simulate.py +++ b/src/python/m5/simulate.py @@ -170,7 +170,8 @@ # If we've got some objects that can't drain immediately, then simulate if unready_objs > 0: drain_event.setCount(unready_objs) - simulate() + exit_event = simulate() + internal.event.cleanupExitEvent(exit_event) else: all_drained = True internal.event.cleanupCountedDrain(drain_event) @@ -230,4 +231,7 @@ for old_cpu, new_cpu in cpuList: new_cpu.takeOverFrom(old_cpu) +def cleanupExitEvent(exit_event): + internal.event.cleanupExitEvent(exit_event) + from internal.core import disableAllListeners diff --git a/src/python/swig/pyevent.hh b/src/python/swig/pyevent.hh --- a/src/python/swig/pyevent.hh +++ b/src/python/swig/pyevent.hh @@ -51,5 +51,7 @@ CountedDrainEvent *createCountedDrain(); void cleanupCountedDrain(Event *counted_drain); +void cleanupExitEvent(Event *counted_drain); + #endif // __PYTHON_SWIG_PYEVENT_HH__ diff --git a/src/python/swig/pyevent.cc b/src/python/swig/pyevent.cc --- a/src/python/swig/pyevent.cc +++ b/src/python/swig/pyevent.cc @@ -84,3 +84,15 @@ assert(event->getCount() == 0); delete event; } + +void +cleanupExitEvent( Event * exit_event) +{ + SimLoopExitEvent *event = + dynamic_cast(exit_event); + if (event == NULL){ + fatal("Called cleanupExitEvent() on an event that was not " + "a SimLoopExitEvent."); + } + delete event; +} diff --git a/src/sim/simulate.cc b/src/sim/simulate.cc --- a/src/sim/simulate.cc +++ b/src/sim/simulate.cc @@ -85,6 +85,8 @@ assert(limit_event->scheduled()); limit_event->squash(); hack_once("be nice to actually delete the event here"); + mainEventQueue.deschedule(limit_event); + delete limit_event; } return se_event;