summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Kleshchev <andreykproductengine@lindenlab.com>2024-01-24 22:45:37 +0200
committerAndrey Kleshchev <117672381+akleshchev@users.noreply.github.com>2024-01-25 01:40:53 +0200
commit03afd4ee7866a5ffc81c5fb62edca58607693243 (patch)
treeedbb853a885b8311043955a5a14d0f57b6e81eb8
parent65eec6d2172845de81a3da7ec0fdf63d2ec1897f (diff)
Crash getting acccounting cost
-rw-r--r--indra/newview/llaccountingcostmanager.cpp29
-rw-r--r--indra/newview/llaccountingcostmanager.h2
2 files changed, 21 insertions, 10 deletions
diff --git a/indra/newview/llaccountingcostmanager.cpp b/indra/newview/llaccountingcostmanager.cpp
index d3f988d715..0a558da42b 100644
--- a/indra/newview/llaccountingcostmanager.cpp
+++ b/indra/newview/llaccountingcostmanager.cpp
@@ -58,16 +58,19 @@ void LLAccountingCostManager::accountingCostCoro(std::string url,
try
{
+ LLAccountingCostManager* self = LLAccountingCostManager::getInstance();
uuid_set_t diffSet;
- std::set_difference(mObjectList.begin(), mObjectList.end(),
- mPendingObjectQuota.begin(), mPendingObjectQuota.end(),
- std::inserter(diffSet, diffSet.begin()));
+ std::set_difference(self->mObjectList.begin(),
+ self->mObjectList.end(),
+ self->mPendingObjectQuota.begin(),
+ self->mPendingObjectQuota.end(),
+ std::inserter(diffSet, diffSet.begin()));
if (diffSet.empty())
return;
- mObjectList.clear();
+ self->mObjectList.clear();
std::string keystr;
if (selectionType == Roots)
@@ -91,18 +94,25 @@ void LLAccountingCostManager::accountingCostCoro(std::string url,
objectList.append(*it);
}
- mPendingObjectQuota.insert(diffSet.begin(), diffSet.end());
+ self->mPendingObjectQuota.insert(diffSet.begin(), diffSet.end());
LLSD dataToPost = LLSD::emptyMap();
dataToPost[keystr.c_str()] = objectList;
- LLAccountingCostObserver* observer = NULL;
-
LLSD results = httpAdapter->postAndSuspend(httpRequest, url, dataToPost);
LLSD httpResults = results["http_result"];
LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
+ if (LLApp::isQuitting()
+ || observerHandle.isDead()
+ || !LLAccountingCostManager::instanceExists())
+ {
+ return;
+ }
+
+ LLAccountingCostObserver* observer = NULL;
+
// do/while(false) allows error conditions to break out of following
// block while normal flow goes forward once.
do
@@ -159,7 +169,8 @@ void LLAccountingCostManager::accountingCostCoro(std::string url,
throw;
}
- mPendingObjectQuota.clear();
+ // self can be obsolete by this point
+ LLAccountingCostManager::getInstance()->mPendingObjectQuota.clear();
}
//===============================================================================
@@ -172,7 +183,7 @@ void LLAccountingCostManager::fetchCosts( eSelectionType selectionType,
{
std::string coroname =
LLCoros::instance().launch("LLAccountingCostManager::accountingCostCoro",
- boost::bind(&LLAccountingCostManager::accountingCostCoro, this, url, selectionType, observer_handle));
+ boost::bind(accountingCostCoro, url, selectionType, observer_handle));
LL_DEBUGS() << coroname << " with url '" << url << LL_ENDL;
}
diff --git a/indra/newview/llaccountingcostmanager.h b/indra/newview/llaccountingcostmanager.h
index d133c6437b..9b2ffc7d7c 100644
--- a/indra/newview/llaccountingcostmanager.h
+++ b/indra/newview/llaccountingcostmanager.h
@@ -70,7 +70,7 @@ private:
//a fetch has been instigated.
uuid_set_t mPendingObjectQuota;
- void accountingCostCoro(std::string url, eSelectionType selectionType, const LLHandle<LLAccountingCostObserver> observerHandle);
+ static void accountingCostCoro(std::string url, eSelectionType selectionType, const LLHandle<LLAccountingCostObserver> observerHandle);
};
//===============================================================================