//----------------------------------------------------------------------- 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); }
bool dpLoader::unload(const char *path) { if(dpBinary *bin=findBinary(path)) { unloadImpl(bin); return true; } return false; }
/* ---------------------------------------------------------------------------- * 栞 Method / load */ SHIORI_API BOOL __cdecl load(HGLOBAL hGlobal_loaddir, long loaddir_len) { AutoGrobalFree autoFree(hGlobal_loaddir); ATLTRACE2(_T("[SHIORI::load]\n")); unloadImpl(); CAtlString sLoaddir((LPSTR)hGlobal_loaddir, (int)loaddir_len); CPath loaddir(sLoaddir); ATLTRACE2(_T("[SHIORI::load] loaddir = %s\n"), (LPCTSTR)loaddir); api = new CShioriAPI(hinst, loaddir); return true; }
void Sound::unload() throw() { if (isLoading()) { abortLoad(); if (isLoading()) waitLoad(); } if (isLoaded()) { unloadImpl(); flags.loaded = false; } }
//----------------------------------------------------------------------- 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); }
BinaryType* dpLoader::loadBinaryImpl(const char *path) { dpBuilder::ScopedPreloadLock pl(dpGetBuilder()); BinaryType *old = static_cast<BinaryType*>(findBinary(path)); if(old) { dpTime t = dpGetMTime(path); if(t<=old->getLastModifiedTime()) { return old; } } BinaryType *ret = new BinaryType(m_context); if(ret->loadFile(path)) { if(old) { unloadImpl(old); } m_binaries.push_back(ret); addOnLoadList(ret); dpPrintInfo("loaded \"%s\"\n", ret->getPath()); } else { delete ret; ret = nullptr; } return ret; }
extern "C" __declspec(dllexport) BOOL WINAPI DllMain( HINSTANCE hinstDLL, // DLL モジュールのハンドル DWORD fdwReason, // 関数を呼び出す理由 LPVOID lpvReserved // 予約済み ) { switch (fdwReason) { case DLL_PROCESS_ATTACH: // プロセス接続 hinst =hinstDLL; break; case DLL_PROCESS_DETACH: // プロセス切り離し unloadImpl(); break; case DLL_THREAD_ATTACH: // スレッド接続 break; case DLL_THREAD_DETACH: // スレッド切り離し break; } return true; }
void SharedLibrary::unload() { unloadImpl(); }
dpLoader::~dpLoader() { while(!m_binaries.empty()) { unloadImpl(m_binaries.front()); } m_hostsymbols.eachSymbols([&](dpSymbol *sym){ deleteSymbol(sym); }); m_hostsymbols.clear(); }
/* ---------------------------------------------------------------------------- * 栞 Method / unload */ SHIORI_API BOOL __cdecl unload(void) { ATLTRACE2(_T("[SHIORI::unload]\n")); return unloadImpl(); }