SL-15272 Bugsplat crashes at condition wait()

Made sure all waits will be triggered, won't loop back and that in case of http queue it had some time to trigger
master
Andrey Kleshchev 2021-05-21 20:06:41 +03:00
parent 2922c59316
commit 823f97ac59
14 changed files with 36 additions and 26 deletions

View File

@ -354,8 +354,9 @@ void LLThread::setQuitting()
{
mStatus = QUITTING;
}
// It's only safe to remove mRunCondition if all locked threads were notified
mRunCondition->broadcast();
mDataLock->unlock();
wake();
}
// static

View File

@ -56,7 +56,6 @@ void HttpReplyQueue::addOp(const HttpReplyQueue::opPtr_t &op)
mQueue.push_back(op);
}
mQueueCV.notify_all();
}

View File

@ -98,7 +98,6 @@ protected:
OpContainer mQueue;
LLCoreInt::HttpMutex mQueueMutex;
LLCoreInt::HttpConditionVariable mQueueCV;
}; // end class HttpReplyQueue

View File

@ -142,13 +142,19 @@ void HttpRequestQueue::wakeAll()
}
void HttpRequestQueue::stopQueue()
bool HttpRequestQueue::stopQueue()
{
{
HttpScopedLock lock(mQueueMutex);
mQueueStopped = true;
wakeAll();
if (!mQueueStopped)
{
mQueueStopped = true;
wakeAll();
return true;
}
wakeAll();
return false;
}
}

View File

@ -124,7 +124,7 @@ public:
/// them on their way.
///
/// Threading: callable by any thread.
void stopQueue();
bool stopQueue();
protected:
static HttpRequestQueue * sInstance;

View File

@ -87,7 +87,11 @@ HttpService::~HttpService()
// is a bit tricky.
if (mRequestQueue)
{
mRequestQueue->stopQueue();
if (mRequestQueue->stopQueue())
{
// Give mRequestQueue a chance to finish
ms_sleep(10);
}
}
if (mThread)

View File

@ -3626,7 +3626,7 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
}
llcoro::suspend();
if (LLApp::isQuitting())
if (LLApp::isExiting())
{
return;
}
@ -3693,7 +3693,7 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
LLSD result = httpAdapter->postAndSuspend(httpRequest, url, postData);
if (LLApp::isQuitting())
if (LLApp::isExiting())
{
return;
}
@ -3733,7 +3733,7 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
LL_WARNS("Avatar") << "Bake retry #" << retryCount << " in " << timeout << " seconds." << LL_ENDL;
llcoro::suspendUntilTimeout(timeout);
if (LLApp::isQuitting())
if (LLApp::isExiting())
{
return;
}

View File

@ -347,7 +347,7 @@ void LLFloaterCompileQueue::processExperienceIdResults(LLSD result, LLUUID paren
bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloater,
const LLPointer<LLViewerObject> &object, LLInventoryObject* inventory, LLEventPump &pump)
{
if (LLApp::isQuitting())
if (LLApp::isExiting())
{
// Reply from coroutine came on shutdown
// We are quiting, don't start any more coroutines!

View File

@ -113,7 +113,7 @@ bool LLDelayedGestureError::doDialog(const LLErrorEntry &ent, bool uuid_ok)
}
}
if(!LLApp::isQuitting())
if(!LLApp::isExiting())
{
LLNotificationsUtil::add(ent.mNotifyName, args);
}

View File

@ -881,7 +881,7 @@ void LLMeshRepoThread::run()
LL_WARNS(LOG_MESH) << "Convex decomposition unable to be loaded. Expect severe problems." << LL_ENDL;
}
while (!LLApp::isQuitting())
while (!LLApp::isExiting())
{
// *TODO: Revise sleep/wake strategy and try to move away
// from polling operations in this thread. We can sleep
@ -898,7 +898,7 @@ void LLMeshRepoThread::run()
mSignal->wait();
if (LLApp::isQuitting())
if (LLApp::isExiting())
{
break;
}
@ -1168,7 +1168,7 @@ void LLMeshRepoThread::loadMeshPhysicsShape(const LLUUID& mesh_id)
void LLMeshRepoThread::lockAndLoadMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
{
if (!LLAppViewer::isQuitting())
if (!LLAppViewer::isExiting())
{
loadMeshLOD(mesh_params, lod);
}
@ -2654,7 +2654,7 @@ void LLMeshUploadThread::doWholeModelUpload()
LL_DEBUGS(LOG_MESH) << "POST request issued." << LL_ENDL;
mHttpRequest->update(0);
while (! LLApp::isQuitting() && ! finished() && ! isDiscarded())
while (! LLApp::isExiting() && ! finished() && ! isDiscarded())
{
ms_sleep(sleep_time);
sleep_time = llmin(250U, sleep_time + sleep_time);
@ -2703,7 +2703,7 @@ void LLMeshUploadThread::requestWholeModelFee()
U32 sleep_time(10);
mHttpRequest->update(0);
while (! LLApp::isQuitting() && ! finished() && ! isDiscarded())
while (! LLApp::isExiting() && ! finished() && ! isDiscarded())
{
ms_sleep(sleep_time);
sleep_time = llmin(250U, sleep_time + sleep_time);
@ -3149,7 +3149,7 @@ common_exit:
LLMeshHeaderHandler::~LLMeshHeaderHandler()
{
if (!LLApp::isQuitting())
if (!LLApp::isExiting())
{
if (! mProcessed)
{
@ -3292,7 +3292,7 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b
LLMeshLODHandler::~LLMeshLODHandler()
{
if (! LLApp::isQuitting())
if (! LLApp::isExiting())
{
if (! mProcessed)
{
@ -3553,7 +3553,7 @@ void LLMeshRepository::shutdown()
mUploads[i]->discard() ; //discard the uploading requests.
}
mThread->mSignal->signal();
mThread->mSignal->broadcast();
while (!mThread->isStopped())
{
@ -4682,7 +4682,8 @@ void LLPhysicsDecomp::shutdown()
if (mSignal)
{
mQuitting = true;
mSignal->signal();
// There is only one wait(), but just in case 'broadcast'
mSignal->broadcast();
while (!isStopped())
{

View File

@ -1118,7 +1118,7 @@ void LLOutfitGallery::refreshOutfit(const LLUUID& category_id)
}
}
if (mGalleryCreated && !LLApp::isQuitting())
if (mGalleryCreated && !LLApp::isExiting())
{
reArrangeRows();
}

View File

@ -405,7 +405,7 @@ void LLToolMgr::clearTransientTool()
void LLToolMgr::onAppFocusLost()
{
if (LLApp::isQuitting())
if (LLApp::isExiting())
return;
if (mSelectedTool)

View File

@ -546,7 +546,7 @@ void LLViewerAssetStorage::assetRequestCoro(
LLSD result = httpAdapter->getRawAndSuspend(httpRequest, url, httpOpts);
if (LLApp::isQuitting() || !gAssetStorage)
if (LLApp::isExiting() || !gAssetStorage)
{
// Bail out if result arrives after shutdown has been started.
return;

View File

@ -498,7 +498,7 @@ bool LLCrashLoggerWindows::frame()
MSG msg;
memset(&msg, 0, sizeof(msg));
while (!LLApp::isQuitting() && GetMessage(&msg, NULL, 0, 0))
while (!LLApp::isExiting() && GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);