From c93c38e047836e31dd34e33391a997d883777ae1 Mon Sep 17 00:00:00 2001 From: Josh Bell Date: Wed, 21 Mar 2007 19:36:11 +0000 Subject: svn merge -r 59178:59364 svn+ssh://svn.lindenlab.com/svn/linden/branches/maintenance --> release --- indra/newview/lltexturecache.cpp | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) (limited to 'indra/newview/lltexturecache.cpp') diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index cb846a43fe..1a3fe79551 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -671,7 +671,7 @@ void LLTextureCacheWorker::finishWork(S32 param, bool completed) mWriteData = NULL; // we never owned data mDataSize = 0; } - mResponder->completed(success); + mCache->addCompleted(mResponder, success); } } @@ -705,6 +705,7 @@ LLTextureCache::LLTextureCache(bool threaded) : LLWorkerThread("TextureCache", threaded), mWorkersMutex(getAPRPool()), mHeaderMutex(getAPRPool()), + mListMutex(getAPRPool()), mFileAPRPool(NULL), mReadOnly(FALSE), mTexturesSizeTotal(0), @@ -726,9 +727,17 @@ S32 LLTextureCache::update(U32 max_time_ms) S32 res; res = LLWorkerThread::update(max_time_ms); + mListMutex.lock(); + handle_list_t priorty_list = mPrioritizeWriteList; // copy list + mPrioritizeWriteList.clear(); + responder_list_t completed_list = mCompletedList; // copy list + mCompletedList.clear(); + mListMutex.unlock(); + lockWorkers(); - for (std::vector::iterator iter1 = mPrioritizeWriteList.begin(); - iter1 != mPrioritizeWriteList.end(); ++iter1) + + for (handle_list_t::iterator iter1 = priorty_list.begin(); + iter1 != priorty_list.end(); ++iter1) { handle_t handle = *iter1; handle_map_t::iterator iter2 = mWriters.find(handle); @@ -738,8 +747,17 @@ S32 LLTextureCache::update(U32 max_time_ms) worker->setPriority(LLWorkerThread::PRIORITY_HIGH | worker->mPriority); } } - mPrioritizeWriteList.clear(); + + for (responder_list_t::iterator iter1 = completed_list.begin(); + iter1 != completed_list.end(); ++iter1) + { + Responder *responder = iter1->first; + bool success = iter1->second; + responder->completed(success); + } + unlockWorkers(); + return res; } @@ -1294,9 +1312,16 @@ void LLTextureCache::prioritizeWrite(handle_t handle) { // Don't prioritize yet, we might be working on this now // which could create a deadlock + LLMutexLock lock(&mListMutex); mPrioritizeWriteList.push_back(handle); } +void LLTextureCache::addCompleted(Responder* responder, bool success) +{ + LLMutexLock lock(&mListMutex); + mCompletedList.push_back(std::make_pair(responder,success)); +} + ////////////////////////////////////////////////////////////////////////////// // Called from MAIN thread (endWork()) -- cgit v1.2.3