summaryrefslogtreecommitdiffstats
path: root/vcl
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2013-04-30 14:55:14 +0100
committerCaolán McNamara <caolanm@redhat.com>2013-04-30 14:58:45 +0100
commit3a3b64a964f92a63d15407fc7769311a9ecbfb48 (patch)
tree3726e29739e5eb2684c4fa04ae1cdd6bf6cd919e /vcl
parentredo fix for fdo#64078 (diff)
downloadcore-3a3b64a964f92a63d15407fc7769311a9ecbfb48.tar.gz
core-3a3b64a964f92a63d15407fc7769311a9ecbfb48.zip
retain references to loaded modules for builders lifetime
Change-Id: Iab8b53dc50d69ba781978e1e7fd9b9c5a19c6d59
Diffstat (limited to 'vcl')
-rw-r--r--vcl/source/window/builder.cxx21
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