void Resources::update(HResource& handle, const SPtr<Resource>& resource) { const String& uuid = handle.getUUID(); handle.setHandleData(resource, uuid); { Lock lock(mLoadedResourceMutex); auto iterFind = mLoadedResources.find(uuid); if (iterFind == mLoadedResources.end()) { LoadedResourceData& resData = mLoadedResources[uuid]; resData.resource = handle.getWeak(); } } onResourceModified(handle); }
void Resources::loadComplete(HResource& resource) { String uuid = resource.getUUID(); ResourceLoadData* myLoadData = nullptr; bool finishLoad = true; Vector<ResourceLoadData*> dependantLoads; { Lock inProgresslock(mInProgressResourcesMutex); auto iterFind = mInProgressResources.find(uuid); if (iterFind != mInProgressResources.end()) { myLoadData = iterFind->second; finishLoad = myLoadData->remainingDependencies == 0; if (finishLoad) mInProgressResources.erase(iterFind); } auto iterFind2 = mDependantLoads.find(uuid); if (iterFind2 != mDependantLoads.end()) dependantLoads = iterFind2->second; if (finishLoad) { mDependantLoads.erase(uuid); // If loadedData is null then we're probably completing load on an already loaded resource, triggered // by its dependencies. if (myLoadData != nullptr && myLoadData->loadedData != nullptr) { Lock loadedLock(mLoadedResourceMutex); mLoadedResources[uuid] = myLoadData->resData; resource.setHandleData(myLoadData->loadedData, uuid); } for (auto& dependantLoad : dependantLoads) dependantLoad->remainingDependencies--; } } for (auto& dependantLoad : dependantLoads) { HResource dependant = dependantLoad->resData.resource.lock(); loadComplete(dependant); } if (finishLoad && myLoadData != nullptr) { onResourceLoaded(resource); // This should only ever be true on the main thread if (myLoadData->notifyImmediately) ResourceListenerManager::instance().notifyListeners(uuid); bs_delete(myLoadData); } }