void DestroyAllLibraries() { int n; for (n = 0; n < s_cModules; n++) { if (s_modules[n]->mAttribs & CARAttrib_inheap) DisposeFlattedCLS(s_modules[n]); else DestroyCLS(s_modules[n]); } s_cModules = 0; }
CClsModule::~CClsModule() { if (mTypeAliasList) { for (Int32 i = 0; i < mClsMod->mAliasCount; i++) { if (mTypeAliasList[i].mOrgTypeDesc) { delete mTypeAliasList[i].mOrgTypeDesc; } } delete[] mTypeAliasList; } if (mAllocedClsMode) { if (mClsMod) DisposeFlattedCLS(mClsMod); } else { if (mModule) dlclose(mModule); } }
ECode CObjInfoList::AcquireModuleInfo( /* [in] */ const String& name, /* [out] */ IModuleInfo** moduleInfo) { if (name.IsNull() || !moduleInfo) { return E_INVALID_ARGUMENT; } ECode ec = NOERROR; void* module = dlopen(name.string(), RTLD_NOW); if(NULL == module){ return E_FILE_NOT_FOUND; } LockHashTable(EntryType_Module); IModuleInfo** modInfo = mModInfos.Get(const_cast<char*>(name.string())); if (modInfo) { dlclose(module); *moduleInfo = *modInfo; (*moduleInfo)->AddRef(); UnlockHashTable(EntryType_Module); return NOERROR; } AutoPtr<CModuleInfo> modInfoObj; CClsModule* clsModule = NULL; LockHashTable(EntryType_ClsModule); CClsModule** ppCClsModule = mClsModule.Get(const_cast<char*>(name.string())); if (ppCClsModule) { clsModule = *ppCClsModule; } if (!clsModule) { ppCClsModule = NULL; //get cls module metadata MemorySize size; void* lockRes; CLSModule* clsMod; Boolean isAllocedClsMod = FALSE; if (-1 == dlGetClassInfo(module, &lockRes, &size)) { ec = E_DOES_NOT_EXIST; goto Exit; } if (((CLSModule *)lockRes)->mAttribs & CARAttrib_compress) { if (RelocFlattedCLS((CLSModule *)lockRes, size, &clsMod) < 0) { ec = E_OUT_OF_MEMORY; goto Exit; } isAllocedClsMod = TRUE; } else { clsMod = (CLSModule *)lockRes; } clsModule = new CClsModule(clsMod, isAllocedClsMod, name, module); if (clsModule == NULL) { if (isAllocedClsMod) DisposeFlattedCLS(clsMod); ec = E_OUT_OF_MEMORY; goto Exit; } if (!mClsModule.Put(const_cast<char*>(name.string()), (CClsModule**)&clsModule)) { delete clsModule; ec = E_OUT_OF_MEMORY; goto Exit; } } modInfoObj = new CModuleInfo(clsModule, name); if (modInfoObj == NULL) { if (!ppCClsModule && clsModule) delete clsModule; ec = E_OUT_OF_MEMORY; goto Exit; } if (!g_objInfoList.mModInfos.Put(const_cast<char*>(name.string()), (IModuleInfo**)&modInfoObj)) { ec = E_OUT_OF_MEMORY; goto Exit; } *moduleInfo = (IModuleInfo *)modInfoObj; (*moduleInfo)->AddRef(); ec = NOERROR; Exit: UnlockHashTable(EntryType_ClsModule); UnlockHashTable(EntryType_Module); return ec; }