//----------------------------------------------------------------------- void Resource::unload(void) { // Early-out without lock (mitigate perf cost of ensuring unloaded) LoadingState old = mLoadingState.get(); if (old!=LOADSTATE_LOADED && old!=LOADSTATE_PREPARED) return; if (!mLoadingState.cas(old,LOADSTATE_UNLOADING)) return; // Scope lock for actual unload { OGRE_LOCK_AUTO_MUTEX if (old==LOADSTATE_PREPARED) { unprepareImpl(); } else { preUnloadImpl(); unloadImpl(); postUnloadImpl(); } } mLoadingState.set(LOADSTATE_UNLOADED); // Notify manager // Note if we have gone from PREPARED to UNLOADED, then we haven't actually // unloaded, i.e. there is no memory freed on the GPU. if(old==LOADSTATE_LOADED && mCreator) mCreator->_notifyResourceUnloaded(this); }
//----------------------------------------------------------------------- void Resource::unload(void) { // Early-out without lock (mitigate perf cost of ensuring unloaded) if (mLoadingState != LOADSTATE_LOADED) return; // Scope lock for loading status { OGRE_LOCK_MUTEX(mLoadingStatusMutex) if (mLoadingState == LOADSTATE_LOADING) { OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, "Cannot unload resource " + mName + " whilst loading is in progress!", "Resource::unload"); } if (mLoadingState != LOADSTATE_LOADED) return; // nothing to do mLoadingState = LOADSTATE_UNLOADING; } // Scope lock for actual unload { OGRE_LOCK_AUTO_MUTEX preUnloadImpl(); unloadImpl(); postUnloadImpl(); } // Scope lock for loading status { OGRE_LOCK_MUTEX(mLoadingStatusMutex) mLoadingState = LOADSTATE_UNLOADED; } // Notify manager if(mCreator) mCreator->_notifyResourceUnloaded(this); }