diff options
Diffstat (limited to '')
-rw-r--r-- | linden/indra/newview/lltexturefetch.cpp | 42 |
1 files changed, 12 insertions, 30 deletions
diff --git a/linden/indra/newview/lltexturefetch.cpp b/linden/indra/newview/lltexturefetch.cpp index 3a5665c..62b4c8b 100644 --- a/linden/indra/newview/lltexturefetch.cpp +++ b/linden/indra/newview/lltexturefetch.cpp | |||
@@ -744,26 +744,17 @@ bool LLTextureFetchWorker::doWork(S32 param) | |||
744 | } | 744 | } |
745 | else if (mSentRequest == UNSENT) | 745 | else if (mSentRequest == UNSENT) |
746 | { | 746 | { |
747 | if(mFetcher->mQueueMutex.tryLock()) | 747 | // Add this to the network queue and sit here. |
748 | { | 748 | // LLTextureFetch::update() will send off a request which will change our state |
749 | // Add this to the network queue and sit here. | 749 | mRequestedSize = mDesiredSize; |
750 | // LLTextureFetch::update() will send off a request which will change our state | 750 | mRequestedDiscard = mDesiredDiscard; |
751 | mRequestedSize = mDesiredSize; | 751 | mSentRequest = QUEUED; |
752 | mRequestedDiscard = mDesiredDiscard; | 752 | mFetcher->addToNetworkQueue(this); |
753 | mSentRequest = QUEUED; | 753 | setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); |
754 | mFetcher->addToNetworkQueue(this); | ||
755 | setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); | ||
756 | mFetcher->mQueueMutex.unlock(); | ||
757 | } | ||
758 | return false; | 754 | return false; |
759 | } | 755 | } |
760 | else | 756 | else |
761 | { | 757 | { |
762 | // Shouldn't need to do anything here | ||
763 | //llassert_always(mFetcher->mNetworkQueue.find(mID) != mFetcher->mNetworkQueue.end()); | ||
764 | // Make certain this is in the network queue | ||
765 | //mFetcher->addToNetworkQueue(this); | ||
766 | //setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); | ||
767 | return false; | 758 | return false; |
768 | } | 759 | } |
769 | } | 760 | } |
@@ -1473,23 +1464,12 @@ void LLTextureFetch::deleteRequest(const LLUUID& id, bool cancel) | |||
1473 | } | 1464 | } |
1474 | } | 1465 | } |
1475 | 1466 | ||
1476 | // Need to hold mQueueMutex when entering this function SNOW-196 | ||
1477 | // Snowglobe ToDo fix holding mQueueMutex over the entire function, we only need | ||
1478 | // it for the mRequestMap access | ||
1479 | // protected | 1467 | // protected |
1480 | void LLTextureFetch::addToNetworkQueue(LLTextureFetchWorker* worker) | 1468 | void LLTextureFetch::addToNetworkQueue(LLTextureFetchWorker* worker) |
1481 | { | 1469 | { |
1482 | bool is_worker_in_request_map = (mRequestMap.find(worker->mID) != mRequestMap.end()); | ||
1483 | |||
1484 | LLMutexLock lock(&mNetworkQueueMutex); | 1470 | LLMutexLock lock(&mNetworkQueueMutex); |
1485 | if (is_worker_in_request_map) | 1471 | mNetworkQueue.insert(worker->mID); |
1486 | { | 1472 | for (cancel_queue_t::iterator iter1 = mCancelQueue.begin(); iter1 != mCancelQueue.end(); ++iter1) |
1487 | // only add to the queue if in the request map | ||
1488 | // i.e. a delete has not been requested | ||
1489 | mNetworkQueue.insert(worker->mID); | ||
1490 | } | ||
1491 | for (cancel_queue_t::iterator iter1 = mCancelQueue.begin(); | ||
1492 | iter1 != mCancelQueue.end(); ++iter1) | ||
1493 | { | 1473 | { |
1494 | iter1->second.erase(worker->mID); | 1474 | iter1->second.erase(worker->mID); |
1495 | } | 1475 | } |
@@ -1715,8 +1695,10 @@ void LLTextureFetch::sendRequestListToSimulators() | |||
1715 | LLTextureFetchWorker* req = getWorker(*curiter); | 1695 | LLTextureFetchWorker* req = getWorker(*curiter); |
1716 | if (!req) | 1696 | if (!req) |
1717 | { | 1697 | { |
1698 | // This happens when a request was removed from mRequestMap in a race | ||
1699 | // with adding it to mNetworkQueue by doWork (see SNOW-196). | ||
1718 | mNetworkQueue.erase(curiter); | 1700 | mNetworkQueue.erase(curiter); |
1719 | continue; // paranoia | 1701 | continue; |
1720 | } | 1702 | } |
1721 | llassert(req->mState == LLTextureFetchWorker::LOAD_FROM_NETWORK || LLTextureFetchWorker::LOAD_FROM_SIMULATOR); | 1703 | llassert(req->mState == LLTextureFetchWorker::LOAD_FROM_NETWORK || LLTextureFetchWorker::LOAD_FROM_SIMULATOR); |
1722 | if ((req->mState != LLTextureFetchWorker::LOAD_FROM_NETWORK) && | 1704 | if ((req->mState != LLTextureFetchWorker::LOAD_FROM_NETWORK) && |