// Return true if the handle is not valid, which is the case // when the worker was already deleted or is scheduled for deletion. // // If the handle exists and a call to worker->complete() returns // true or abort is true, then the handle is removed and the worker // scheduled for deletion. bool LLTextureCache::readComplete(handle_t handle, bool abort) { lockWorkers(); // Needed for access to mReaders. handle_map_t::iterator iter = mReaders.find(handle); bool handle_is_valid = iter != mReaders.end(); llassert_always(handle_is_valid || abort); LLTextureCacheWorker* worker = NULL; bool delete_worker = false; if (handle_is_valid) { worker = iter->second; delete_worker = worker->complete() || abort; if (delete_worker) { mReaders.erase(handle); handle_is_valid = false; } } unlockWorkers(); if (delete_worker) worker->scheduleDelete(); // Return false if the handle is (still) valid. return !handle_is_valid; }
bool LLTextureCache::writeComplete(handle_t handle, bool abort) { lockWorkers(); handle_map_t::iterator iter = mWriters.find(handle); llassert_always(iter != mWriters.end()); LLTextureCacheWorker* worker = iter->second; if (worker->complete() || abort) { mWriters.erase(handle); unlockWorkers(); worker->scheduleDelete(); return true; } else { unlockWorkers(); return false; } }