Workaround for DEV-35406 lleventhost crash on shutdown.
The fix deletes all LLEventPumps boost::signal objects prior to unloading any dlls. reviewed by Nat.meow-7.2.2
parent
19d23352bd
commit
0fc5ab7f18
|
|
@ -126,6 +126,16 @@ void LLEventPumps::flush()
|
|||
}
|
||||
}
|
||||
|
||||
void LLEventPumps::reset()
|
||||
{
|
||||
// Reset every known LLEventPump instance. Leave it up to each instance to
|
||||
// decide what to do with the reset() call.
|
||||
for (PumpMap::iterator pmi = mPumpMap.begin(), pmend = mPumpMap.end(); pmi != pmend; ++pmi)
|
||||
{
|
||||
pmi->second->reset();
|
||||
}
|
||||
}
|
||||
|
||||
std::string LLEventPumps::registerNew(const LLEventPump& pump, const std::string& name, bool tweak)
|
||||
{
|
||||
std::pair<PumpMap::iterator, bool> inserted =
|
||||
|
|
@ -242,6 +252,7 @@ LLEventPumps::~LLEventPumps()
|
|||
LLEventPump::LLEventPump(const std::string& name, bool tweak):
|
||||
// Register every new instance with LLEventPumps
|
||||
mName(LLEventPumps::instance().registerNew(*this, name, tweak)),
|
||||
mSignal(new LLStandardSignal()),
|
||||
mEnabled(true)
|
||||
{}
|
||||
|
||||
|
|
@ -264,6 +275,13 @@ std::string LLEventPump::inventName(const std::string& pfx)
|
|||
return STRINGIZE(pfx << suffix++);
|
||||
}
|
||||
|
||||
void LLEventPump::reset()
|
||||
{
|
||||
mSignal.reset();
|
||||
mConnections.clear();
|
||||
//mDeps.clear();
|
||||
}
|
||||
|
||||
LLBoundListener LLEventPump::listen_impl(const std::string& name, const LLEventListener& listener,
|
||||
const NameList& after,
|
||||
const NameList& before)
|
||||
|
|
@ -405,7 +423,7 @@ LLBoundListener LLEventPump::listen_impl(const std::string& name, const LLEventL
|
|||
}
|
||||
// Now that newNode has a value that places it appropriately in mSignal,
|
||||
// connect it.
|
||||
LLBoundListener bound = mSignal.connect(newNode, listener);
|
||||
LLBoundListener bound = mSignal->connect(newNode, listener);
|
||||
mConnections[name] = bound;
|
||||
return bound;
|
||||
}
|
||||
|
|
@ -445,7 +463,7 @@ bool LLEventStream::post(const LLSD& event)
|
|||
// Let caller know if any one listener handled the event. This is mostly
|
||||
// useful when using LLEventStream as a listener for an upstream
|
||||
// LLEventPump.
|
||||
return mSignal(event);
|
||||
return (*mSignal)(event);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
|
|
@ -476,7 +494,7 @@ void LLEventQueue::flush()
|
|||
mEventQueue.clear();
|
||||
for ( ; ! queue.empty(); queue.pop_front())
|
||||
{
|
||||
mSignal(queue.front());
|
||||
(*mSignal)(queue.front());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -202,6 +202,12 @@ public:
|
|||
*/
|
||||
void flush();
|
||||
|
||||
/**
|
||||
* Reset all known LLEventPump instances
|
||||
* workaround for DEV-35406 crash on shutdown
|
||||
*/
|
||||
void reset();
|
||||
|
||||
private:
|
||||
friend class LLEventPump;
|
||||
/**
|
||||
|
|
@ -504,6 +510,8 @@ private:
|
|||
/// flush queued events
|
||||
virtual void flush() {}
|
||||
|
||||
virtual void reset();
|
||||
|
||||
private:
|
||||
virtual LLBoundListener listen_impl(const std::string& name, const LLEventListener&,
|
||||
const NameList& after,
|
||||
|
|
@ -512,7 +520,8 @@ private:
|
|||
|
||||
protected:
|
||||
/// implement the dispatching
|
||||
LLStandardSignal mSignal;
|
||||
boost::scoped_ptr<LLStandardSignal> mSignal;
|
||||
|
||||
/// valve open?
|
||||
bool mEnabled;
|
||||
/// Map of named listeners. This tracks the listeners that actually exist
|
||||
|
|
|
|||
|
|
@ -1206,6 +1206,9 @@ bool LLAppViewer::mainLoop()
|
|||
|
||||
bool LLAppViewer::cleanup()
|
||||
{
|
||||
// workaround for DEV-35406 crash on shutdown
|
||||
LLEventPumps::instance().reset();
|
||||
|
||||
// *TODO - generalize this and move DSO wrangling to a helper class -brad
|
||||
std::set<struct apr_dso_handle_t *>::const_iterator i;
|
||||
for(i = mPlugins.begin(); i != mPlugins.end(); ++i)
|
||||
|
|
@ -1214,9 +1217,7 @@ bool LLAppViewer::cleanup()
|
|||
apr_status_t rv = apr_dso_sym((apr_dso_handle_sym_t*)&ll_plugin_stop_func, *i, "ll_plugin_stop");
|
||||
ll_plugin_stop_func();
|
||||
|
||||
// *NOTE - disabled unloading as partial solution to DEV-35406 crash on shutdown
|
||||
//rv = apr_dso_unload(*i);
|
||||
(void)rv;
|
||||
rv = apr_dso_unload(*i);
|
||||
}
|
||||
mPlugins.clear();
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue