diff options
Diffstat (limited to 'indra/newview/llaccountingcostmanager.cpp')
-rw-r--r-- | indra/newview/llaccountingcostmanager.cpp | 81 |
1 files changed, 46 insertions, 35 deletions
diff --git a/indra/newview/llaccountingcostmanager.cpp b/indra/newview/llaccountingcostmanager.cpp index d3f988d715..82124b7412 100644 --- a/indra/newview/llaccountingcostmanager.cpp +++ b/indra/newview/llaccountingcostmanager.cpp @@ -1,25 +1,25 @@ -/** +/** * @file LLAccountingQuotaManager.cpp - * @ Handles the setting and accessing for costs associated with mesh + * @ Handles the setting and accessing for costs associated with mesh * * $LicenseInfo:firstyear=2001&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2011, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -38,11 +38,11 @@ //=============================================================================== LLAccountingCostManager::LLAccountingCostManager() -{ +{ } -// Coroutine for sending and processing avatar name cache requests. +// Coroutine for sending and processing avatar name cache requests. // Do not call directly. See documentation in lleventcoro.h and llcoro.h for // further explanation. void LLAccountingCostManager::accountingCostCoro(std::string url, @@ -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,21 +94,28 @@ 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); - // do/while(false) allows error conditions to break out of following + 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 + do { observer = observerHandle.get(); @@ -159,39 +169,40 @@ void LLAccountingCostManager::accountingCostCoro(std::string url, throw; } - mPendingObjectQuota.clear(); + // self can be obsolete by this point + LLAccountingCostManager::getInstance()->mPendingObjectQuota.clear(); } //=============================================================================== void LLAccountingCostManager::fetchCosts( eSelectionType selectionType, - const std::string& url, - const LLHandle<LLAccountingCostObserver>& observer_handle ) + const std::string& url, + const LLHandle<LLAccountingCostObserver>& observer_handle ) { - // Invoking system must have already determined capability availability - if ( !url.empty() ) - { - std::string coroname = + // Invoking system must have already determined capability availability + if ( !url.empty() ) + { + 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; - } - else - { - //url was empty - warn & continue - LL_WARNS()<<"Supplied url is empty "<<LL_ENDL; - mObjectList.clear(); - mPendingObjectQuota.clear(); - } + } + else + { + //url was empty - warn & continue + LL_WARNS()<<"Supplied url is empty "<<LL_ENDL; + mObjectList.clear(); + mPendingObjectQuota.clear(); + } } //=============================================================================== void LLAccountingCostManager::addObject( const LLUUID& objectID ) { - mObjectList.insert( objectID ); + mObjectList.insert( objectID ); } //=============================================================================== void LLAccountingCostManager::removePendingObject( const LLUUID& objectID ) { - mPendingObjectQuota.erase( objectID ); + mPendingObjectQuota.erase( objectID ); } //=============================================================================== |