bugfix: properly remove remaining events of terminating experiment
Before this commit, EventList::getEventsOf() broke when *two* experiment flows terminated in direct succession: (*it)->getParent() fails if the underlying event doesn't exist anymore. To fix this, I moved the event removal from SimulatorController to EventList::remove(flow), and made it work on the internal event list magic similarly to EventList::remove(event). And I tested it with a few known-working experiments. git-svn-id: https://www4.informatik.uni-erlangen.de/i4svn/danceos/trunk/devel/fail@1022 8c4709b5-6ec9-48aa-a5cd-a96041d1645a
This commit is contained in:
@ -210,15 +210,6 @@ void SimulatorController::onJumpEvent(bool flagTriggered, unsigned opcode)
|
|||||||
m_EvList.fireActiveEvents();
|
m_EvList.fireActiveEvents();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SimulatorController::cleanup(fi::ExperimentFlow* pExp)
|
|
||||||
{
|
|
||||||
// remove related events:
|
|
||||||
std::vector<fi::BaseEvent*> evlist;
|
|
||||||
m_EvList.getEventsOf(pExp, evlist);
|
|
||||||
for(size_t i = 0; i < evlist.size(); i++)
|
|
||||||
m_EvList.remove(evlist[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SimulatorController::addFlow(fi::ExperimentFlow* flow)
|
void SimulatorController::addFlow(fi::ExperimentFlow* flow)
|
||||||
{
|
{
|
||||||
// Store the (flow,corohandle)-tuple internally and create its coroutine:
|
// Store the (flow,corohandle)-tuple internally and create its coroutine:
|
||||||
@ -230,7 +221,7 @@ void SimulatorController::addFlow(fi::ExperimentFlow* flow)
|
|||||||
void SimulatorController::removeFlow(fi::ExperimentFlow* flow)
|
void SimulatorController::removeFlow(fi::ExperimentFlow* flow)
|
||||||
{
|
{
|
||||||
// remove all remaining events of this flow
|
// remove all remaining events of this flow
|
||||||
cleanup(flow);
|
clearEvents(flow);
|
||||||
// remove coroutine
|
// remove coroutine
|
||||||
m_Flows.remove(flow);
|
m_Flows.remove(flow);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -214,10 +214,10 @@ class SimulatorController
|
|||||||
*/
|
*/
|
||||||
void removeEvent(fi::BaseEvent* ev) { m_EvList.remove(ev); }
|
void removeEvent(fi::BaseEvent* ev) { m_EvList.remove(ev); }
|
||||||
/**
|
/**
|
||||||
* Removes all previously added events for all experiments. This is
|
* Removes all previously added events for all experiments. To
|
||||||
* equal to removeEvent(NULL);
|
* restrict this to a specific experiment flow, pass a pointer to it.
|
||||||
*/
|
*/
|
||||||
void clearEvents() { removeEvent(NULL); }
|
void clearEvents(fi::ExperimentFlow *flow = 0) { m_EvList.remove(flow); }
|
||||||
/**
|
/**
|
||||||
* Waits on any events which have been added to the event management. If
|
* Waits on any events which have been added to the event management. If
|
||||||
* one of those events occour, waitAny() will return the id of that
|
* one of those events occour, waitAny() will return the id of that
|
||||||
@ -233,12 +233,6 @@ class SimulatorController
|
|||||||
* this pointer will be equal to ev)
|
* this pointer will be equal to ev)
|
||||||
*/
|
*/
|
||||||
fi::BaseEvent* addEventAndWait(fi::BaseEvent* ev);
|
fi::BaseEvent* addEventAndWait(fi::BaseEvent* ev);
|
||||||
/**
|
|
||||||
* Removes all residual events associated with the specified experiment
|
|
||||||
* flow \a pExp.
|
|
||||||
* @param pExp the experiment whose events should be removed
|
|
||||||
*/
|
|
||||||
void cleanup(fi::ExperimentFlow* pExp);
|
|
||||||
/**
|
/**
|
||||||
* Fetches data for the experiments from the Job-Server.
|
* Fetches data for the experiments from the Job-Server.
|
||||||
* @return the Experiment-Data from the Job-Server.
|
* @return the Experiment-Data from the Job-Server.
|
||||||
|
|||||||
@ -51,14 +51,34 @@ EventList::iterator EventList::m_remove(iterator it, bool skip_deletelist)
|
|||||||
return (m_BufferList.erase(it));
|
return (m_BufferList.erase(it));
|
||||||
}
|
}
|
||||||
|
|
||||||
void EventList::getEventsOf(ExperimentFlow* pWhat,
|
void EventList::remove(ExperimentFlow* flow)
|
||||||
std::vector<BaseEvent*>& dest) const
|
|
||||||
{
|
{
|
||||||
assert(pWhat && "FATAL ERROR: The context cannot be NULL!");
|
// all events?
|
||||||
for(bufferlist_t::const_iterator it = m_BufferList.begin();
|
if (flow == 0) {
|
||||||
it != m_BufferList.end(); it++)
|
m_BufferList.clear();
|
||||||
if((*it)->getParent() == pWhat)
|
} else {
|
||||||
dest.push_back(*it);
|
for (bufferlist_t::iterator it = m_BufferList.begin();
|
||||||
|
it != m_BufferList.end(); ) {
|
||||||
|
if ((*it)->getParent() == flow) {
|
||||||
|
it = m_BufferList.erase(it);
|
||||||
|
} else {
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// events that just fired / are about to fire ...
|
||||||
|
for (firelist_t::const_iterator it = m_FireList.begin();
|
||||||
|
it != m_FireList.end(); it++) {
|
||||||
|
if (std::find(m_DeleteList.begin(), m_DeleteList.end(), *it)
|
||||||
|
!= m_DeleteList.end()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// ... need to be pushed into m_DeleteList, as we're currently
|
||||||
|
// iterating over m_FireList in fireActiveEvents() and cannot modify it
|
||||||
|
if (flow == 0 || (*it)->getParent() == flow) {
|
||||||
|
m_DeleteList.push_back(*it);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EventList::~EventList()
|
EventList::~EventList()
|
||||||
|
|||||||
@ -130,15 +130,10 @@ class EventList
|
|||||||
*/
|
*/
|
||||||
BaseEvent* getEventFromId(EventId id);
|
BaseEvent* getEventFromId(EventId id);
|
||||||
/**
|
/**
|
||||||
* Retrieves all events for the specified experiment.
|
* Removes all events for the specified experiment.
|
||||||
* @param pWhat pointer to experiment context (this pointer is expected
|
* @param flow pointer to experiment context (0 = all experiments)
|
||||||
* to be valid!)
|
|
||||||
* @param dest a reference to a vector-object to be used as the
|
|
||||||
* destination buffer for the machting event objects. This
|
|
||||||
* objects may remains unchanged if no matching event objects
|
|
||||||
* were found.
|
|
||||||
*/
|
*/
|
||||||
void getEventsOf(ExperimentFlow* pWhat, std::vector<BaseEvent*>& dest) const;
|
void remove(ExperimentFlow* flow);
|
||||||
/**
|
/**
|
||||||
* Retrieves the number of experiments which currently have active
|
* Retrieves the number of experiments which currently have active
|
||||||
* events. This number is trivially equal to the (current) total
|
* events. This number is trivially equal to the (current) total
|
||||||
|
|||||||
@ -32,7 +32,7 @@ class ExperimentFlow
|
|||||||
void coroutine_entry()
|
void coroutine_entry()
|
||||||
{
|
{
|
||||||
run();
|
run();
|
||||||
sal::simulator.cleanup(this); // remove residual events
|
sal::simulator.clearEvents(this); // remove residual events
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user