#4949 QueuedRequest destructor crash

master
Andrey Kleshchev 2025-11-09 10:33:36 +02:00
parent 4e78b4c9fe
commit bcecb3dc10
1 changed files with 27 additions and 7 deletions

View File

@ -80,7 +80,7 @@ void LLQueuedThread::shutdown()
mRequestQueue.close(); mRequestQueue.close();
} }
S32 timeout = 100; S32 timeout = 50;
for ( ; timeout>0; timeout--) for ( ; timeout>0; timeout--)
{ {
if (isStopped()) if (isStopped())
@ -101,19 +101,34 @@ void LLQueuedThread::shutdown()
} }
QueuedRequest* req; QueuedRequest* req;
S32 active_count = 0; S32 queued_count = 0;
bool has_active = false;
lockData();
while ( (req = (QueuedRequest*)mRequestHash.pop_element()) ) while ( (req = (QueuedRequest*)mRequestHash.pop_element()) )
{ {
if (req->getStatus() == STATUS_QUEUED || req->getStatus() == STATUS_INPROGRESS) if (req->getStatus() == STATUS_INPROGRESS)
{ {
++active_count; has_active = true;
req->setFlags(FLAG_ABORT | FLAG_AUTO_COMPLETE);
continue;
}
if (req->getStatus() == STATUS_QUEUED)
{
++queued_count;
req->setStatus(STATUS_ABORTED); // avoid assert in deleteRequest req->setStatus(STATUS_ABORTED); // avoid assert in deleteRequest
} }
req->deleteRequest(); req->deleteRequest();
} }
if (active_count) unlockData();
if (queued_count)
{ {
LL_WARNS() << "~LLQueuedThread() called with active requests: " << active_count << LL_ENDL; LL_WARNS() << "~LLQueuedThread() called with unpocessed requests: " << queued_count << LL_ENDL;
}
if (has_active)
{
LL_WARNS() << "~LLQueuedThread() called with active requests!" << LL_ENDL;
ms_sleep(100); // last chance for request to finish
printQueueStats();
} }
mRequestQueue.close(); mRequestQueue.close();
@ -570,7 +585,12 @@ LLQueuedThread::QueuedRequest::QueuedRequest(LLQueuedThread::handle_t handle, U3
LLQueuedThread::QueuedRequest::~QueuedRequest() LLQueuedThread::QueuedRequest::~QueuedRequest()
{ {
llassert_always(mStatus == STATUS_DELETE); if (mStatus != STATUS_DELETE)
{
// The only method to delete a request is deleteRequest(),
// it should have set the status to STATUS_DELETE
LL_ERRS() << "LLQueuedThread::QueuedRequest deleted with status " << mStatus << LL_ENDL;
}
} }
//virtual //virtual