diff options
Diffstat (limited to 'indra')
| -rwxr-xr-x | indra/newview/lltexturefetch.cpp | 39 | ||||
| -rw-r--r-- | indra/newview/lltexturefetch.h | 3 | 
2 files changed, 36 insertions, 6 deletions
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index 6ae20edb9f..faaa9ed86b 100755 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -1945,10 +1945,14 @@ bool LLTextureFetchWorker::deleteOK()  	if (WAIT_HTTP_RESOURCE2 == mState)  	{ -		// Don't delete the worker out from under the -		// releaseHttpWaiters() method.  Keep the pointers -		// valid, clean up after transition. -		delete_ok = false; +		if (mFetcher->isHttpWaiter(mID)) +		{ +			// Don't delete the worker out from under the releaseHttpWaiters() +			// method.  Keep the pointers valid, clean up after that method +			// has recognized the cancelation and removed the UUID from the +			// waiter list. +			delete_ok = false; +		}  	}  	// Allow any pending reads or writes to complete @@ -2551,7 +2555,6 @@ void LLTextureFetch::deleteRequest(const LLUUID& id, bool cancel)  		unlockQueue();													// -Mfq  		llassert_always(erased_1 > 0) ; -  		removeFromNetworkQueue(worker, cancel);  		llassert_always(!(worker->getFlags(LLWorkerClass::WCF_DELETE_REQUESTED))) ; @@ -3370,6 +3373,16 @@ void LLTextureFetch::removeHttpWaiter(const LLUUID & tid)  	mNetworkQueueMutex.unlock();										// -Mfnq  } +// Threads:  T* +bool LLTextureFetch::isHttpWaiter(const LLUUID & tid) +{ +	mNetworkQueueMutex.lock();											// +Mfnq +	wait_http_res_queue_t::iterator iter(mHttpWaitResource.find(tid)); +	const bool ret(mHttpWaitResource.end() != iter); +	mNetworkQueueMutex.unlock();										// -Mfnq +	return ret; +} +  // Release as many requests as permitted from the WAIT_HTTP_RESOURCE2  // state to the SEND_HTTP_REQ state based on their current priority.  // @@ -3424,6 +3437,15 @@ void LLTextureFetch::releaseHttpWaiters()  		{  			tids2.push_back(worker);  		} +		else +		{ +			// If worker isn't found, this should be due to a request +			// for deletion.  We signal our recognition that this +			// uuid shouldn't be used for resource waiting anymore by +			// erasing it from the resource waiter list.  That allows +			// deleteOK to do final deletion on the worker. +			removeHttpWaiter(* iter); +		}  	}  	tids.clear(); @@ -3446,8 +3468,13 @@ void LLTextureFetch::releaseHttpWaiters()  		worker->lockWorkMutex();										// +Mw  		if (LLTextureFetchWorker::WAIT_HTTP_RESOURCE2 != worker->mState)  		{ -			// Not in expected state, try the next one +			// Not in expected state, remove it, try the next one  			worker->unlockWorkMutex();									// -Mw +			LL_WARNS("Texture") << "Resource-waited texture " << worker->mID +								<< " in unexpected state:  " << worker->mState +								<< ".  Removing from wait list." +								<< LL_ENDL; +			removeHttpWaiter(worker->mID);  			continue;  		} diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h index 4294209f04..fd2223ecb0 100644 --- a/indra/newview/lltexturefetch.h +++ b/indra/newview/lltexturefetch.h @@ -185,6 +185,9 @@ public:      // Threads:  T*  	void removeHttpWaiter(const LLUUID & tid); +    // Threads:  T* +	bool isHttpWaiter(const LLUUID & tid); +  	// If there are slots, release one or more LLTextureFetchWorker  	// requests from resource wait state (WAIT_HTTP_RESOURCE) to  	// active (SEND_HTTP_REQ).  | 
