From c14601f7c210a60af20fbd1e1f7dff6587e114cf Mon Sep 17 00:00:00 2001 From: Aleric Inglewood Date: Thu, 28 Mar 2013 03:01:27 +0100 Subject: [PATCH] Avoid assertion in ~AIStateMachine upon viewer exit. Force the state to bs_killed before clearing the list of statemachines in AIEngine::flush(). --- indra/aistatemachine/aistatemachine.cpp | 13 ++++++++++++- indra/aistatemachine/aistatemachine.h | 3 ++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/indra/aistatemachine/aistatemachine.cpp b/indra/aistatemachine/aistatemachine.cpp index dedec3bd7..8784a84c4 100644 --- a/indra/aistatemachine/aistatemachine.cpp +++ b/indra/aistatemachine/aistatemachine.cpp @@ -352,8 +352,13 @@ void AIEngine::mainloop(void) void AIEngine::flush(void) { - DoutEntering(dc::statemachine, "AIEngine::flush [" << mName << "]"); engine_state_type_wat engine_state_w(mEngineState); + DoutEntering(dc::statemachine, "AIEngine::flush [" << mName << "]: calling force_killed() on " << engine_state_w->list.size() << " state machines."); + for (queued_type::iterator iter = engine_state_w->list.begin(); iter != engine_state_w->list.end(); ++iter) + { + // To avoid an assertion in ~AIStateMachine. + iter->statemachine().force_killed(); + } engine_state_w->list.clear(); } @@ -906,6 +911,12 @@ void AIStateMachine::callback(void) } } +void AIStateMachine::force_killed(void) +{ + multiplex_state_type_wat state_w(mState); + state_w->base_state = bs_killed; +} + void AIStateMachine::kill(void) { DoutEntering(dc::statemachine, "AIStateMachine::kill() [" << (void*)this << "]"); diff --git a/indra/aistatemachine/aistatemachine.h b/indra/aistatemachine/aistatemachine.h index 10031a834..979205e02 100644 --- a/indra/aistatemachine/aistatemachine.h +++ b/indra/aistatemachine/aistatemachine.h @@ -300,8 +300,9 @@ class AIStateMachine : public LLThreadSafeRefCount mSleep = 0; return mSleep != 0; } + void force_killed(void); // Called from AIEngine::flush(). - friend class AIEngine; // Calls multiplex(). + friend class AIEngine; // Calls multiplex() and force_killed(). }; bool AIEngine::QueueElementComp::operator()(QueueElement const& e1, QueueElement const& e2) const