From 1466d2454693bdf84a9eab21d7c01a0a8e8a731d Mon Sep 17 00:00:00 2001 From: hsc Date: Tue, 3 Apr 2012 14:05:28 +0000 Subject: [PATCH] bugfix: EventList::remove(event) must deal correctly with active events before: active events were not properly deleted (in both cases, ev == 0 and ev != 0) after: deficiencies repaired; simpler code side-effect: doesn't return whether the event was found anymore (can be re-added at a later time) git-svn-id: https://www4.informatik.uni-erlangen.de/i4svn/danceos/trunk/devel/fail@1024 8c4709b5-6ec9-48aa-a5cd-a96041d1645a --- core/controller/EventList.cc | 35 ++++++++++++++++++----------------- core/controller/EventList.hpp | 4 +--- 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/core/controller/EventList.cc b/core/controller/EventList.cc index 2ec46447..a987261b 100644 --- a/core/controller/EventList.cc +++ b/core/controller/EventList.cc @@ -16,27 +16,28 @@ EventId EventList::add(BaseEvent* ev, ExperimentFlow* pExp) return (ev->getId()); } -bool EventList::remove(BaseEvent* ev) +void EventList::remove(BaseEvent* ev) { - if(ev != NULL) - { - iterator it = std::find(m_BufferList.begin(), m_BufferList.end(), ev); - if(it != end()) - { - m_BufferList.erase(it); + // possible cases: + // - ev == 0 -> remove all events + // * clear m_BufferList + // * copy m_FireList to m_DeleteList + if (ev == 0) { + m_BufferList.clear(); + // all remaining active events must not fire anymore + m_DeleteList.insert(m_DeleteList.end(), m_FireList.begin(), m_FireList.end()); + + // - ev != 0 -> remove single event + // * find/remove ev in m_BufferList + // * if ev in m_FireList, copy to m_DeleteList + } else { + m_BufferList.remove(ev); + firelist_t::const_iterator it = + std::find(m_FireList.begin(), m_FireList.end(), ev); + if (it != m_FireList.end()) { m_DeleteList.push_back(ev); - return (true); } } - else - { - for(iterator it = m_BufferList.begin(); it != m_BufferList.end(); - it++) - m_DeleteList.push_back(*it); - m_BufferList.clear(); - return (true); - } - return (false); } EventList::iterator EventList::remove(iterator it) diff --git a/core/controller/EventList.hpp b/core/controller/EventList.hpp index ba70031e..29a3e992 100644 --- a/core/controller/EventList.hpp +++ b/core/controller/EventList.hpp @@ -82,10 +82,8 @@ class EventList * @param ev the pointer of the event to be removed; if ev is set to * \c NULL, all events (for \a all experiments) will be * removed - * @return \c true if the object has been removed or \c false if the - * pointer could not be found */ - bool remove(BaseEvent* ev); + void remove(BaseEvent* ev); /** * Behaves like remove(BaseEvent) and additionally updates the provided * iteration.