SL-17159 Crash initializing LLInstanceTrackerPrivate

meow-7.2.2
Andrey Kleshchev 2022-04-20 23:15:04 +03:00
parent e0c4304e4a
commit cf7bc4406e
3 changed files with 33 additions and 26 deletions

View File

@ -637,6 +637,7 @@ LLAppViewer::LLAppViewer()
mLogoutMarkerFile(),
mReportedCrash(false),
mNumSessions(0),
mGeneralThreadPool(nullptr),
mPurgeCache(false),
mPurgeCacheOnExit(false),
mPurgeUserDataOnExit(false),
@ -1712,11 +1713,6 @@ void LLAppViewer::flushLFSIO()
bool LLAppViewer::cleanup()
{
// Since we don't know what functions are going to be queued by
// onCleanup(), we have to assume they might rely on some of the things
// we're about to destroy below. Run them first.
mOnCleanup();
LLAtmosphere::cleanupClass();
//ditch LLVOAvatarSelf instance
@ -2070,6 +2066,10 @@ bool LLAppViewer::cleanup()
sTextureCache->shutdown();
sImageDecodeThread->shutdown();
sPurgeDiskCacheThread->shutdown();
if (mGeneralThreadPool)
{
mGeneralThreadPool->close();
}
sTextureFetch->shutDownTextureCacheThread() ;
sTextureFetch->shutDownImageDecodeThread() ;
@ -2094,6 +2094,8 @@ bool LLAppViewer::cleanup()
mFastTimerLogThread = NULL;
delete sPurgeDiskCacheThread;
sPurgeDiskCacheThread = NULL;
delete mGeneralThreadPool;
mGeneralThreadPool = NULL;
if (LLFastTimerView::sAnalyzePerformance)
{
@ -2179,6 +2181,24 @@ bool LLAppViewer::cleanup()
return true;
}
void LLAppViewer::initGeneralThread()
{
if (mGeneralThreadPool)
{
return;
}
LLSD poolSizes{ gSavedSettings.getLLSD("ThreadPoolSizes") };
LLSD sizeSpec{ poolSizes["General"] };
LLSD::Integer poolSize{ sizeSpec.isInteger() ? sizeSpec.asInteger() : 3 };
LL_DEBUGS("ThreadPool") << "Instantiating General pool with "
<< poolSize << " threads" << LL_ENDL;
// We don't want anyone, especially the main thread, to have to block
// due to this ThreadPool being full.
mGeneralThreadPool = new LL::ThreadPool("General", poolSize, 1024 * 1024);
mGeneralThreadPool->start();
}
bool LLAppViewer::initThreads()
{
static const bool enable_threads = true;

View File

@ -63,6 +63,11 @@ class LLViewerJoystick;
class LLPurgeDiskCacheThread;
class LLViewerRegion;
namespace LL
{
class ThreadPool;
}
extern LLTrace::BlockTimerStatHandle FTM_FRAME;
class LLAppViewer : public LLApp
@ -201,13 +206,7 @@ public:
void addOnIdleCallback(const boost::function<void()>& cb); // add a callback to fire (once) when idle
typedef boost::signals2::signal<void()> cleanup_signal_t;
cleanup_signal_t mOnCleanup;
boost::signals2::connection onCleanup(const cleanup_signal_t::slot_type& cb)
{
return mOnCleanup.connect(cb);
}
void initGeneralThread();
void purgeUserDataOnExit() { mPurgeUserDataOnExit = true; }
void purgeCache(); // Clear the local cache.
void purgeCacheImmediate(); //clear local cache immediately.
@ -269,7 +268,6 @@ private:
void idle();
void idleShutdown();
// update avatar SLID and display name caches
void idleExperienceCache();
void idleNameCache();
void idleNetwork();
@ -298,6 +296,7 @@ private:
static LLImageDecodeThread* sImageDecodeThread;
static LLTextureFetch* sTextureFetch;
static LLPurgeDiskCacheThread* sPurgeDiskCacheThread;
LL::ThreadPool* mGeneralThreadPool;
S32 mNumSessions;

View File

@ -1496,19 +1496,7 @@ bool idle_startup()
display_startup();
// start up the ThreadPool we'll use for textures et al.
{
LLSD poolSizes{ gSavedSettings.getLLSD("ThreadPoolSizes") };
LLSD sizeSpec{ poolSizes["General"] };
LLSD::Integer poolSize{ sizeSpec.isInteger()? sizeSpec.asInteger() : 3 };
LL_DEBUGS("ThreadPool") << "Instantiating General pool with "
<< poolSize << " threads" << LL_ENDL;
// We don't want anyone, especially the main thread, to have to block
// due to this ThreadPool being full.
auto pool = new LL::ThreadPool("General", poolSize, 1024*1024);
pool->start();
// Once we start shutting down, destroy this ThreadPool.
LLAppViewer::instance()->onCleanup([pool](){ delete pool; });
}
LLAppViewer::instance()->initGeneralThread();
// Initialize global class data needed for surfaces (i.e. textures)
LL_DEBUGS("AppInit") << "Initializing sky..." << LL_ENDL;