include/sal/log-areas.dox | 1 officecfg/registry/schema/org/openoffice/Office/Java.xcs | 7 solenv/gbuild/CppunitTest.mk | 2 solenv/gdb/boost/util/printing.py | 2 solenv/gdb/libreoffice/util/printing.py | 2 stoc/source/javaloader/javaloader.component | 5 stoc/source/javaloader/javaloader.cxx | 297 +++++++++++---- vcl/Module_vcl.mk | 2 8 files changed, 252 insertions(+), 66 deletions(-)
New commits: commit 83d822e6294e1af180da55eae13303f85d537ace Author: Stephan Bergmann <sberg...@redhat.com> AuthorDate: Thu Sep 24 09:53:24 2020 +0200 Commit: Michael Stahl <michael.st...@allotropia.de> CommitDate: Thu May 12 18:48:29 2022 +0200 Fix Python deprecation warnings I noticed these "DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3, and in 3.9 it will stop working" now when running tests with CPPUNITTRACE='gdb --args' on Fedora 32. Change-Id: If263dacb9df5c1fffd2be2418e13e69b96070c77 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/103294 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sberg...@redhat.com> (cherry picked from commit 4a899a5f8a72ea29a6919316afe3627de9f33e95) diff --git a/solenv/gdb/boost/util/printing.py b/solenv/gdb/boost/util/printing.py index 1d5d0bac9fc6..4088f3a3fa3b 100644 --- a/solenv/gdb/boost/util/printing.py +++ b/solenv/gdb/boost/util/printing.py @@ -19,7 +19,7 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. -from collections import Mapping +from collections.abc import Mapping import gdb import re import six diff --git a/solenv/gdb/libreoffice/util/printing.py b/solenv/gdb/libreoffice/util/printing.py index 9cbae3080a64..7ce29899355a 100644 --- a/solenv/gdb/libreoffice/util/printing.py +++ b/solenv/gdb/libreoffice/util/printing.py @@ -7,7 +7,7 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. # -from collections import Mapping +from collections.abc import Mapping import gdb import re import six commit 791c40d8e64b0dad9e9329184bc9b4bdfcef827c Author: Michael Stahl <michael.st...@allotropia.de> AuthorDate: Thu May 12 18:07:33 2022 +0200 Commit: Michael Stahl <michael.st...@allotropia.de> CommitDate: Thu May 12 18:09:33 2022 +0200 vcl: disable timer test (never succeeded for me on Linux) Change-Id: I6f696641a19bec3df792bd27f8c2fe0a7024c6c6 diff --git a/vcl/Module_vcl.mk b/vcl/Module_vcl.mk index 5ea0e5ae125d..736ede5d8002 100644 --- a/vcl/Module_vcl.mk +++ b/vcl/Module_vcl.mk @@ -219,7 +219,7 @@ $(eval $(call gb_Module_add_check_targets,vcl,\ endif ifeq ($(USING_X11),TRUE) -$(eval $(call gb_Module_add_check_targets,vcl,\ +#$(eval $(call gb_Module_add_check_targets,vcl,\ CppunitTest_vcl_timer \ )) endif commit abb3d544a5043a48398b82ba11eaec3f37f34bc8 Author: Michael Stahl <michael.st...@allotropia.de> AuthorDate: Wed May 11 12:07:06 2022 +0200 Commit: Michael Stahl <michael.st...@allotropia.de> CommitDate: Thu May 12 18:03:17 2022 +0200 officecfg,stoc: allow running JVM UNO components out-of-process The problem is that 32-bit Win32 applications have very little VM, and soffice.bin can run out, so try to move the JVM to a separate process (uno.bin) and connect to it via pipe. Add a new config to enable this: "org.openoffice.Office.Java/VirtualMachine/RunUnoComponentsOutOfProcess" If enabled, ServiceManager instantiates *all* JVM components out-of-process, by instantiating "com.sun.star.java.theJavaVirtualMachine" out-of-process. To ensure that the remote connection is disconnected at shutdown (and thereby prevent crashes with remote calls during late shutdown), JavaComponentLoader is now a "single-instance" service; this change should be harmless for the default in-process configuration case. Tested with these extensions: Wiki Publisher smoketest TestExtension.oxt odk CalcAddins.oxt Inspector.oxt ToDo.oxt Also passed "make check" on Linux when enabled, if the variable URE_BIN_DIR is set properly for CppunitTest_services. Change-Id: I76bf17a9512414b67dbd20daee25a6d29c05f9d9 diff --git a/include/sal/log-areas.dox b/include/sal/log-areas.dox index 40575f96e69a..5b28b7d072c9 100644 --- a/include/sal/log-areas.dox +++ b/include/sal/log-areas.dox @@ -453,6 +453,7 @@ certain functionality. @section stoc @li @c stoc.corerefl - CoreReflection +@li @c stoc.java - javaloader and javavm @section VCL diff --git a/officecfg/registry/schema/org/openoffice/Office/Java.xcs b/officecfg/registry/schema/org/openoffice/Office/Java.xcs index 95d9947a3d4d..2349848de235 100644 --- a/officecfg/registry/schema/org/openoffice/Office/Java.xcs +++ b/officecfg/registry/schema/org/openoffice/Office/Java.xcs @@ -120,6 +120,13 @@ <desc>Specifies properties for use with the Java VM.</desc> </info> </prop> + <prop oor:name="RunUnoComponentsOutOfProcess" oor:type="xs:boolean" oor:nillable="false"> + <info> + <desc>Specifies whether JVM based UNO components are run via uno command outside the LibreOffice process.</desc> + <label>Run UNO components out-of-process</label> + </info> + <value>false</value> + </prop> </group> </component> </oor:component-schema> diff --git a/solenv/gbuild/CppunitTest.mk b/solenv/gbuild/CppunitTest.mk index 98f05417c5e8..ac24e1bf8afb 100644 --- a/solenv/gbuild/CppunitTest.mk +++ b/solenv/gbuild/CppunitTest.mk @@ -85,7 +85,7 @@ $(if $(URE),\ $(if $(strip $(UNO_TYPES)),\ "-env:UNO_TYPES=$(foreach item,$(UNO_TYPES),$(call gb_Helper_make_url,$(item)))") \ $(if $(strip $(UNO_SERVICES)),\ - "-env:UNO_SERVICES=$(foreach item,$(UNO_SERVICES),$(call gb_Helper_make_url,$(item)))") \ + "-env:UNO_SERVICES=$(foreach item,$(UNO_SERVICES),$(call gb_Helper_make_url,$(item)))" -env:URE_BIN_DIR=$(call gb_Helper_make_url,$(INSTROOT)/$(LIBO_URE_BIN_FOLDER))) \ $(if $(strip $(JAVA_URE)),\ -env:URE_MORE_JAVA_TYPES=$(call gb_Helper_make_url,$(call gb_Jar_get_target,unoil))) \ -env:URE_INTERNAL_LIB_DIR=$(call gb_Helper_make_url,$(INSTROOT)/$(LIBO_URE_LIB_FOLDER)) \ diff --git a/stoc/source/javaloader/javaloader.cxx b/stoc/source/javaloader/javaloader.cxx index 2e986e82a708..1d0427568cdb 100644 --- a/stoc/source/javaloader/javaloader.cxx +++ b/stoc/source/javaloader/javaloader.cxx @@ -36,20 +36,32 @@ #include <jni.h> +#include <rtl/random.h> +#include <rtl/ustrbuf.hxx> +#include <osl/security.hxx> +#include <osl/thread.hxx> + #include <cppuhelper/factory.hxx> #include <cppuhelper/implementationentry.hxx> -#include <cppuhelper/implbase.hxx> +#include <cppuhelper/basemutex.hxx> +#include <cppuhelper/compbase.hxx> #include <cppuhelper/supportsservice.hxx> +#include <com/sun/star/bridge/UnoUrlResolver.hpp> +#include <com/sun/star/container/XHierarchicalNameAccess.hpp> #include <com/sun/star/loader/XImplementationLoader.hpp> #include <com/sun/star/lang/XServiceInfo.hpp> #include <com/sun/star/lang/XInitialization.hpp> #include <com/sun/star/uno/XComponentContext.hpp> +#include <com/sun/star/util/theMacroExpander.hpp> #include <jvmaccess/unovirtualmachine.hxx> #include <jvmaccess/virtualmachine.hxx> +// this one is header-only +#include <comphelper/sequence.hxx> + namespace com::sun::star::registry { class XRegistryKey; } using namespace css::java; @@ -63,10 +75,167 @@ using namespace ::osl; namespace stoc_javaloader { -class JavaComponentLoader : public WeakImplHelper<XImplementationLoader, XServiceInfo> +// from desktop/source/deployment/misc/dp_misc.cxx +OUString generateRandomPipeId() +{ + // compute some good pipe id: + static rtlRandomPool s_hPool = rtl_random_createPool(); + if (s_hPool == nullptr) + throw RuntimeException( "cannot create random pool!?", nullptr ); + sal_uInt8 bytes[ 32 ]; + if (rtl_random_getBytes( + s_hPool, bytes, SAL_N_ELEMENTS(bytes) ) != rtl_Random_E_None) { + throw RuntimeException( "random pool error!?", nullptr ); + } + OUStringBuffer buf; + for (unsigned char byte : bytes) { + buf.append( static_cast<sal_Int32>(byte), 0x10 ); + } + return buf.makeStringAndClear(); +} + +// from desktop/source/deployment/registry/component/dp_component.cxx +/** return a vector of bootstrap variables which have been provided + as command arguments. +*/ +std::vector<OUString> getCmdBootstrapVariables() +{ + std::vector<OUString> ret; + sal_uInt32 count = osl_getCommandArgCount(); + for (sal_uInt32 i = 0; i < count; i++) + { + OUString arg; + osl_getCommandArg(i, &arg.pData); + if (arg.startsWith("-env:")) + ret.push_back(arg); + } + return ret; +} + +// from desktop/source/deployment/misc/dp_misc.cxx +oslProcess raiseProcess( + OUString const & appURL, Sequence<OUString> const & args ) +{ + ::osl::Security sec; + oslProcess hProcess = nullptr; + oslProcessError rc = osl_executeProcess( + appURL.pData, + reinterpret_cast<rtl_uString **>( + const_cast<OUString *>(args.getConstArray()) ), + args.getLength(), + osl_Process_DETACHED, + sec.getHandle(), + nullptr, // => current working dir + nullptr, 0, // => no env vars + &hProcess ); + + switch (rc) { + case osl_Process_E_None: + break; + case osl_Process_E_NotFound: + throw RuntimeException( "image not found!", nullptr ); + case osl_Process_E_TimedOut: + throw RuntimeException( "timeout occurred!", nullptr ); + case osl_Process_E_NoPermission: + throw RuntimeException( "permission denied!", nullptr ); + case osl_Process_E_Unknown: + throw RuntimeException( "unknown error!", nullptr ); + case osl_Process_E_InvalidError: + default: + throw RuntimeException( "unmapped error!", nullptr ); + } + + return hProcess; +} + +// from desktop/source/deployment/registry/component/dp_component.cxx +Reference<XComponentContext> raise_uno_process( + Reference<XComponentContext> const & xContext) +{ + OSL_ASSERT( xContext.is() ); + + OUString const url(css::util::theMacroExpander::get(xContext)->expandMacros("$URE_BIN_DIR/uno")); + + const OUString connectStr = "uno:pipe,name=" + generateRandomPipeId() + ";urp;uno.ComponentContext"; + + // raise core UNO process to register/run a component, + // javavm service uses unorc next to executable to retrieve deployed + // jar typelibs + + std::vector<OUString> args{ +#if OSL_DEBUG_LEVEL == 0 + "--quiet", +#endif + "--singleaccept", + "-u", + connectStr, + // don't inherit from unorc: + "-env:INIFILENAME=" }; + + //now add the bootstrap variables which were supplied on the command line + std::vector<OUString> bootvars = getCmdBootstrapVariables(); + args.insert(args.end(), bootvars.begin(), bootvars.end()); + + oslProcess hProcess; + try { + hProcess = raiseProcess(url, comphelper::containerToSequence(args)); + } + catch (...) { + OUStringBuffer sMsg = "error starting process: " + url; + for (const auto& arg : args) { + sMsg.append(" " + arg); + } + throw css::uno::RuntimeException(sMsg.makeStringAndClear()); + } + try { + // from desktop/source/deployment/misc/dp_misc.cxx + Reference<css::bridge::XUnoUrlResolver> const xUnoUrlResolver( + css::bridge::UnoUrlResolver::create(xContext) ); + + for (int i = 0; i <= 40; ++i) // 20 seconds + { + try { + return Reference<XComponentContext>( + xUnoUrlResolver->resolve(connectStr), + UNO_QUERY_THROW ); + } + catch (const css::connection::NoConnectException &) { + if (i < 40) { + ::osl::Thread::wait( std::chrono::milliseconds(500) ); + } + else throw; + } + } + return nullptr; // warning C4715 + } + catch (...) { + // try to terminate process: + if ( osl_terminateProcess( hProcess ) != osl_Process_E_None ) + { + OSL_ASSERT( false ); + } + throw; + } +} + +class JavaComponentLoader + : protected ::cppu::BaseMutex + , public WeakComponentImplHelper<XImplementationLoader, XServiceInfo> { + /** local context */ css::uno::Reference<XComponentContext> m_xComponentContext; + + /** possible remote process' context (use depends on configuration). + note: lifetime must be effectively "static" as this JavaComponentLoader + has no control over the lifetime of the services created via this + context; hence JavaComponentLoader is a single-instance service. + */ + css::uno::Reference<XComponentContext> m_xRemoteComponentContext; + /** Do not use m_javaLoader directly. Instead use getJavaLoader. + This is either an in-process loader implemented in Java, + or a remote instance of JavaComponentLoader running in uno process, + acting as a proxy. */ css::uno::Reference<XImplementationLoader> m_javaLoader; /** The returned Reference contains a null pointer if the office is not configured @@ -76,7 +245,7 @@ class JavaComponentLoader : public WeakImplHelper<XImplementationLoader, XServic If the Java implementation of the loader could not be obtained, for reasons other then that java was not configured the RuntimeException is thrown. */ - const css::uno::Reference<XImplementationLoader> & getJavaLoader(); + const css::uno::Reference<XImplementationLoader> & getJavaLoader(OUString &); public: @@ -89,6 +258,8 @@ public: virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override; virtual Sequence<OUString> SAL_CALL getSupportedServiceNames() override; + virtual void SAL_CALL disposing() override; + // XImplementationLoader virtual css::uno::Reference<XInterface> SAL_CALL activate( const OUString& implementationName, const OUString& implementationLoaderUrl, @@ -98,7 +269,21 @@ public: const OUString& implementationLoaderUrl, const OUString& locationUrl) override; }; -const css::uno::Reference<XImplementationLoader> & JavaComponentLoader::getJavaLoader() +void JavaComponentLoader::disposing() +{ + // Explicitly drop all remote refs to shut down the uno.bin process + // and particularly the connection to it, so that it can't do more calls + // during late shutdown. + m_javaLoader.clear(); + if (m_xRemoteComponentContext.is()) { + Reference<XComponent> const xComp(m_xRemoteComponentContext, UNO_QUERY); + assert(xComp.is()); + xComp->dispose(); + m_xRemoteComponentContext.clear(); + } +} + +const css::uno::Reference<XImplementationLoader> & JavaComponentLoader::getJavaLoader(OUString & rRemoteArg) { static Mutex ourMutex; MutexGuard aGuard(ourMutex); @@ -106,6 +291,42 @@ const css::uno::Reference<XImplementationLoader> & JavaComponentLoader::getJavaL if (m_javaLoader.is()) return m_javaLoader; + // check if the JVM should be instantiated out-of-process + if (rRemoteArg.isEmpty()) { + if (!m_xRemoteComponentContext.is()) { + Reference<css::container::XHierarchicalNameAccess> const xConf( + m_xComponentContext->getServiceManager()->createInstanceWithArgumentsAndContext( + "com.sun.star.configuration.ReadOnlyAccess", + { Any(OUString("*")) }, // locale isn't relevant here + m_xComponentContext), + UNO_QUERY); + + // configmgr is not part of URE, so may not exist! + if (xConf.is()) { + Any const value(xConf->getByHierarchicalName( + "org.openoffice.Office.Java/VirtualMachine/RunUnoComponentsOutOfProcess")); + bool b; + if ((value >>= b) && b) { + SAL_INFO("stoc.java", "JavaComponentLoader: starting uno process"); + m_xRemoteComponentContext = raise_uno_process(m_xComponentContext); + } + } + } + if (m_xRemoteComponentContext.is()) { + SAL_INFO("stoc.java", "JavaComponentLoader: creating remote instance to start JVM in uno process"); + // create JVM service in remote uno.bin process + Reference<XImplementationLoader> const xLoader( + m_xRemoteComponentContext->getServiceManager()->createInstanceWithContext( + "com.sun.star.loader.Java2", m_xRemoteComponentContext), + UNO_QUERY_THROW); + assert(xLoader.is()); + m_javaLoader = xLoader; + rRemoteArg = "remote"; + SAL_INFO("stoc.java", "JavaComponentLoader: remote proxy instance created: " << m_javaLoader.get()); + return m_javaLoader; + } + } + uno_Environment * pJava_environment = nullptr; uno_Environment * pUno_environment = nullptr; typelib_InterfaceTypeDescription * pType_XImplementationLoader = nullptr; @@ -264,9 +485,9 @@ const css::uno::Reference<XImplementationLoader> & JavaComponentLoader::getJavaL return m_javaLoader; } -JavaComponentLoader::JavaComponentLoader(const css::uno::Reference<XComponentContext> & xCtx) : - m_xComponentContext(xCtx) - +JavaComponentLoader::JavaComponentLoader(const css::uno::Reference<XComponentContext> & xCtx) + : WeakComponentImplHelper(m_aMutex) + , m_xComponentContext(xCtx) { } @@ -293,10 +514,11 @@ sal_Bool SAL_CALL JavaComponentLoader::writeRegistryInfo( const css::uno::Reference<XRegistryKey> & xKey, const OUString & blabla, const OUString & rLibName) { - const css::uno::Reference<XImplementationLoader> & loader = getJavaLoader(); + OUString remoteArg(blabla); + const css::uno::Reference<XImplementationLoader> & loader = getJavaLoader(remoteArg); if (!loader.is()) throw CannotRegisterImplementationException("Could not create Java implementation loader"); - return loader->writeRegistryInfo(xKey, blabla, rLibName); + return loader->writeRegistryInfo(xKey, remoteArg, rLibName); } @@ -304,10 +526,11 @@ css::uno::Reference<XInterface> SAL_CALL JavaComponentLoader::activate( const OUString & rImplName, const OUString & blabla, const OUString & rLibName, const css::uno::Reference<XRegistryKey> & xKey) { - const css::uno::Reference<XImplementationLoader> & loader = getJavaLoader(); + OUString remoteArg(blabla); + const css::uno::Reference<XImplementationLoader> & loader = getJavaLoader(remoteArg); if (!loader.is()) throw CannotActivateFactoryException("Could not create Java implementation loader"); - return loader->activate(rImplName, blabla, rLibName, xKey); + return loader->activate(rImplName, remoteArg, rLibName, xKey); } extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface* @@ -315,7 +538,9 @@ stoc_JavaComponentLoader_get_implementation( css::uno::XComponentContext* context, css::uno::Sequence<css::uno::Any> const&) { try { - return cppu::acquire(new JavaComponentLoader(context)); + static Reference<XInterface> xSingleton(static_cast<::cppu::OWeakObject*>(new JavaComponentLoader(context))); + xSingleton->acquire(); + return xSingleton.get(); } catch(const RuntimeException & runtimeException) { SAL_INFO( commit 4cdf613f7890e5515c7631cb8690f6929e041aa1 Author: Noel Grandin <noelgran...@gmail.com> AuthorDate: Mon Jul 13 22:15:36 2020 +0200 Commit: Michael Stahl <michael.st...@allotropia.de> CommitDate: Thu May 12 17:50:46 2022 +0200 stoc/javaloader: create instances with uno constructors See tdf#74608 for motivation. Reviewed-on: https://gerrit.libreoffice.org/c/core/+/98698 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> (cherry picked from commit 37f5ad41ed9928a4394b80050cdc00fd6d830a07) Change-Id: Ic1ce8431bfb116c1e64116e2019fa0d3bcf8344c diff --git a/stoc/source/javaloader/javaloader.component b/stoc/source/javaloader/javaloader.component index 9299097c4fd0..cc4ae610bdb2 100644 --- a/stoc/source/javaloader/javaloader.component +++ b/stoc/source/javaloader/javaloader.component @@ -18,8 +18,9 @@ --> <component loader="com.sun.star.loader.SharedLibrary" environment="@CPPU_ENV@" - prefix="javaloader" xmlns="http://openoffice.org/2010/uno-components"> - <implementation name="com.sun.star.comp.stoc.JavaComponentLoader"> + xmlns="http://openoffice.org/2010/uno-components"> + <implementation name="com.sun.star.comp.stoc.JavaComponentLoader" + constructor="stoc_JavaComponentLoader_get_implementation"> <service name="com.sun.star.loader.Java"/> <service name="com.sun.star.loader.Java2"/> </implementation> diff --git a/stoc/source/javaloader/javaloader.cxx b/stoc/source/javaloader/javaloader.cxx index 269cdb182bc7..2e986e82a708 100644 --- a/stoc/source/javaloader/javaloader.cxx +++ b/stoc/source/javaloader/javaloader.cxx @@ -63,21 +63,6 @@ using namespace ::osl; namespace stoc_javaloader { -static Mutex & getInitMutex(); - -static Sequence< OUString > loader_getSupportedServiceNames() -{ - Sequence< OUString > seqNames(2); - seqNames.getArray()[0] = "com.sun.star.loader.Java"; - seqNames.getArray()[1] = "com.sun.star.loader.Java2"; - return seqNames; -} - -static OUString loader_getImplementationName() -{ - return OUString( "com.sun.star.comp.stoc.JavaComponentLoader" ); -} - class JavaComponentLoader : public WeakImplHelper<XImplementationLoader, XServiceInfo> { css::uno::Reference<XComponentContext> m_xComponentContext; @@ -115,7 +100,8 @@ public: const css::uno::Reference<XImplementationLoader> & JavaComponentLoader::getJavaLoader() { - MutexGuard aGuard(getInitMutex()); + static Mutex ourMutex; + MutexGuard aGuard(ourMutex); if (m_javaLoader.is()) return m_javaLoader; @@ -288,7 +274,7 @@ JavaComponentLoader::JavaComponentLoader(const css::uno::Reference<XComponentCon // XServiceInfo OUString SAL_CALL JavaComponentLoader::getImplementationName() { - return loader_getImplementationName(); + return "com.sun.star.comp.stoc.JavaComponentLoader"; } sal_Bool SAL_CALL JavaComponentLoader::supportsService(const OUString & ServiceName) @@ -298,7 +284,7 @@ sal_Bool SAL_CALL JavaComponentLoader::supportsService(const OUString & ServiceN Sequence<OUString> SAL_CALL JavaComponentLoader::getSupportedServiceNames() { - return loader_getSupportedServiceNames(); + return { "com.sun.star.loader.Java", "com.sun.star.loader.Java2" }; } @@ -324,18 +310,12 @@ css::uno::Reference<XInterface> SAL_CALL JavaComponentLoader::activate( return loader->activate(rImplName, blabla, rLibName, xKey); } -static Mutex & getInitMutex() -{ - static Mutex ourMutex; - - return ourMutex; -} - -/// @throws Exception -static css::uno::Reference<XInterface> JavaComponentLoader_CreateInstance(const css::uno::Reference<XComponentContext> & xCtx) +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface* +stoc_JavaComponentLoader_get_implementation( + css::uno::XComponentContext* context, css::uno::Sequence<css::uno::Any> const&) { try { - return *new JavaComponentLoader(xCtx); + return cppu::acquire(new JavaComponentLoader(context)); } catch(const RuntimeException & runtimeException) { SAL_INFO( @@ -348,25 +328,5 @@ static css::uno::Reference<XInterface> JavaComponentLoader_CreateInstance(const } //end namespace -using namespace stoc_javaloader; - -static const struct ImplementationEntry g_entries[] = -{ - { - JavaComponentLoader_CreateInstance, loader_getImplementationName, - loader_getSupportedServiceNames, createOneInstanceComponentFactory, - nullptr , 0 - }, - { nullptr, nullptr, nullptr, nullptr, nullptr, 0 } -}; - -extern "C" -{ -SAL_DLLPUBLIC_EXPORT void * javaloader_component_getFactory( - const sal_Char * pImplName, void * pServiceManager, void * pRegistryKey ) -{ - return component_getFactoryHelper( pImplName, pServiceManager, pRegistryKey , g_entries ); -} -} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ commit 17c4c24294ac302ed78586362ffe0e4142bd120d Author: Stephan Bergmann <sberg...@redhat.com> AuthorDate: Thu May 12 17:41:38 2022 +0200 Commit: Michael Stahl <michael.st...@allotropia.de> CommitDate: Thu May 12 17:50:46 2022 +0200 Properly use createOneInstanceComponentFactory for javaloader After 424a7f404565e068995e2a9827d5bc6f76920ec8 "add some more libs to libmerged" had added javaloader to libmerged, destruction of static xStaticRef started to cause problems at least during CppunitTest_services of --enable-mergedlib Windows builds (presumably because the relative order of static variable destruction had changed). Reviewed-on: https://gerrit.libreoffice.org/c/core/+/90254 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sberg...@redhat.com> (cherry picked from commit 9ed75e2c65544b4f71c73e1c51a68d74e31d544b) Change-Id: I8307570222cc9a3d9511d090d0dae7f7dfe7a9ad diff --git a/stoc/source/javaloader/javaloader.cxx b/stoc/source/javaloader/javaloader.cxx index 760f6d356a3c..269cdb182bc7 100644 --- a/stoc/source/javaloader/javaloader.cxx +++ b/stoc/source/javaloader/javaloader.cxx @@ -334,14 +334,8 @@ static Mutex & getInitMutex() /// @throws Exception static css::uno::Reference<XInterface> JavaComponentLoader_CreateInstance(const css::uno::Reference<XComponentContext> & xCtx) { - css::uno::Reference<XInterface> xRet; - try { - MutexGuard guard( getInitMutex() ); - // The javaloader is never destroyed and there can be only one! - // Note that the first context wins .... - static css::uno::Reference< XInterface > xStaticRef = *new JavaComponentLoader(xCtx); - xRet = xStaticRef; + return *new JavaComponentLoader(xCtx); } catch(const RuntimeException & runtimeException) { SAL_INFO( @@ -349,8 +343,6 @@ static css::uno::Reference<XInterface> JavaComponentLoader_CreateInstance(const "could not init javaloader due to " << runtimeException); throw; } - - return xRet; } } //end namespace @@ -362,7 +354,7 @@ static const struct ImplementationEntry g_entries[] = { { JavaComponentLoader_CreateInstance, loader_getImplementationName, - loader_getSupportedServiceNames, createSingleComponentFactory, + loader_getSupportedServiceNames, createOneInstanceComponentFactory, nullptr , 0 }, { nullptr, nullptr, nullptr, nullptr, nullptr, 0 }