Skip to content
Snippets Groups Projects
Commit 1cadeb40 authored by Nat Goodspeed's avatar Nat Goodspeed
Browse files

MAINT-5232: Prevent runaway LLSingletonBase::MasterList growth.

Until we reimplement LLCoros on Boost.Fiber, we must hand-implement
coroutine-local data. That presently takes the form of a map keyed on
llcoro::id, whose values are the stacks of currently-initializing LLSingleton
instances.

But since the viewer launches an open-ended number of coroutines, we could end
up with an open-ended number of map entries unless we intentionally prune the
map. So every time we pop the stack to empty, remove that map entry.

This could result in thrashing, a given coroutine's 'initializing' stack being
created and deleted for almost every LLSingleton instantiated by that
coroutine -- but the number of different LLSingletons is necessarily static,
and the lifespan of each is the entire rest of the process. Even a couple
dozen LLSingletons won't thrash that badly.
parent 90f42498
No related branches found
No related tags found
No related merge requests found
...@@ -94,6 +94,15 @@ class LLSingletonBase::MasterList: ...@@ -94,6 +94,15 @@ class LLSingletonBase::MasterList:
// here. It returns a reference to the selected mapped_type instance. // here. It returns a reference to the selected mapped_type instance.
return mInitializing[llcoro::get_id()]; return mInitializing[llcoro::get_id()];
} }
void cleanup_initializing_()
{
InitializingMap::iterator found = mInitializing.find(llcoro::get_id());
if (found != mInitializing.end())
{
mInitializing.erase(found);
}
}
}; };
//static //static
...@@ -129,7 +138,7 @@ LLSingletonBase::list_t& LLSingletonBase::get_initializing() ...@@ -129,7 +138,7 @@ LLSingletonBase::list_t& LLSingletonBase::get_initializing()
//static //static
LLSingletonBase::list_t& LLSingletonBase::get_initializing_from(MasterList* master) LLSingletonBase::list_t& LLSingletonBase::get_initializing_from(MasterList* master)
{ {
return master->get_initializing_();; return master->get_initializing_();
} }
LLSingletonBase::~LLSingletonBase() {} LLSingletonBase::~LLSingletonBase() {}
...@@ -156,6 +165,17 @@ void LLSingletonBase::pop_initializing() ...@@ -156,6 +165,17 @@ void LLSingletonBase::pop_initializing()
// and pop it // and pop it
list.pop_back(); list.pop_back();
// The viewer launches an open-ended number of coroutines. While we don't
// expect most of them to initialize LLSingleton instances, our present
// get_initializing() logic could lead to an open-ended number of map
// entries. So every time we pop the stack back to empty, delete the entry
// entirely.
if (list.empty())
{
MasterList::instance().cleanup_initializing_();
}
// Now validate the newly-popped LLSingleton.
if (back != this) if (back != this)
{ {
logerrs("Push/pop mismatch in stack of currently-initializing LLSingletons: ", logerrs("Push/pop mismatch in stack of currently-initializing LLSingletons: ",
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment