diff options
author | Caolán McNamara <caolanm@redhat.com> | 2013-04-30 14:55:14 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2013-04-30 14:58:45 +0100 |
commit | 3a3b64a964f92a63d15407fc7769311a9ecbfb48 (patch) | |
tree | 3726e29739e5eb2684c4fa04ae1cdd6bf6cd919e /vcl | |
parent | 1b14676b5f95dd51d6266a6ab7bd713a5ddcff2f (diff) |
retain references to loaded modules for builders lifetime
Change-Id: Iab8b53dc50d69ba781978e1e7fd9b9c5a19c6d59
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/source/window/builder.cxx | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx index 0833a35a5129..1cf5b8be7b4d 100644 --- a/vcl/source/window/builder.cxx +++ b/vcl/source/window/builder.cxx @@ -1203,20 +1203,27 @@ Window *VclBuilder::makeObject(Window *pParent, const OString &name, const OStri if (nDelim != -1) { #ifndef DISABLE_DYNLOADING - OUStringBuffer sModule; + OUStringBuffer sModuleBuf; #ifdef SAL_DLLPREFIX - sModule.append(SAL_DLLPREFIX); + sModuleBuf.append(SAL_DLLPREFIX); #endif - sModule.append(OStringToOUString(name.copy(0, nDelim), RTL_TEXTENCODING_UTF8)); + sModuleBuf.append(OStringToOUString(name.copy(0, nDelim), RTL_TEXTENCODING_UTF8)); #ifdef SAL_DLLEXTENSION - sModule.append(SAL_DLLEXTENSION); + sModuleBuf.append(SAL_DLLEXTENSION); #endif #endif OUString sFunction(OStringToOUString(OString("make") + name.copy(nDelim+1), RTL_TEXTENCODING_UTF8)); #ifndef DISABLE_DYNLOADING - osl::Module aModule; - aModule.loadRelative(&thisModule, sModule.makeStringAndClear()); - customMakeWidget pFunction = (customMakeWidget)aModule.getFunctionSymbol(sFunction); + OUString sModule = sModuleBuf.makeStringAndClear(); + ModuleMap::iterator aI = m_aModuleMap.find(sModule); + osl::Module* pModule = NULL; + if (aI == m_aModuleMap.end()) + { + pModule = new osl::Module; + pModule->loadRelative(&thisModule, sModule); + aI = m_aModuleMap.insert(sModule, pModule).first; + } + customMakeWidget pFunction = (customMakeWidget)aI->second->getFunctionSymbol(sFunction); #else customMakeWidget pFunction = (customMakeWidget)osl_getFunctionSymbol((oslModule) RTLD_DEFAULT, sFunction.pData); #endif |