예제 #1
0
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;
}
예제 #2
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);
    }
}
예제 #3
0
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;
}