diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2012-10-30 17:11:59 +0100 |
---|---|---|
committer | Andras Timar <atimar@suse.com> | 2013-01-13 22:00:42 +0100 |
commit | 645fc0ce677a4da7f175419b950b12e2eae76f84 (patch) | |
tree | 3445578722fbe0b2cc325f2ba83311d0fc63b2fa /desktop/source | |
parent | 1ee11a24aa30b498c0c2d741bee2085de55e69b6 (diff) |
Resolves: fdo#51638 In "unopkg gui" dispose component context from DeInitVCL
...the same way it is done in soffice.bin. framework's Desktop::dispose()
requires the solar mutex to be still alive, which is destroyed in DeInitVCL, so
if the component context/service manager is only disposed afterwards, the solar
mutex is already gone.
This required moving disposeBridges() around, but it allowed to get rid of
DisposeGuard.
(cherry picked from commit 37cc83e594fa8ca131fc5fb98506287b7daedffd)
Conflicts:
desktop/source/pkgchk/unopkg/unopkg_app.cxx
desktop/source/pkgchk/unopkg/unopkg_shared.h
Change-Id: Ibec3d19040fdae23f492cd1e29084e673403e00b
Signed-off-by: Stephan Bergmann <sbergman@redhat.com>
Diffstat (limited to 'desktop/source')
-rw-r--r-- | desktop/source/deployment/gui/dp_gui_service.cxx | 16 | ||||
-rw-r--r-- | desktop/source/deployment/inc/dp_misc.h | 8 | ||||
-rw-r--r-- | desktop/source/deployment/misc/dp_misc.cxx | 25 | ||||
-rw-r--r-- | desktop/source/pkgchk/unopkg/unopkg_app.cxx | 42 | ||||
-rw-r--r-- | desktop/source/pkgchk/unopkg/unopkg_misc.cxx | 15 | ||||
-rw-r--r-- | desktop/source/pkgchk/unopkg/unopkg_shared.h | 32 |
6 files changed, 57 insertions, 81 deletions
diff --git a/desktop/source/deployment/gui/dp_gui_service.cxx b/desktop/source/deployment/gui/dp_gui_service.cxx index 71c6ccd74ff4..cec91ad4730e 100644 --- a/desktop/source/deployment/gui/dp_gui_service.cxx +++ b/desktop/source/deployment/gui/dp_gui_service.cxx @@ -33,6 +33,7 @@ #include "cppuhelper/implbase2.hxx" #include "cppuhelper/implementationentry.hxx" #include "unotools/configmgr.hxx" +#include "comphelper/processfactory.hxx" #include "comphelper/servicedecl.hxx" #include "comphelper/unwrapargs.hxx" #include <i18npool/mslangid.hxx> @@ -47,6 +48,8 @@ #include "license_dialog.hxx" #include "dp_gui_dialog2.hxx" #include "dp_gui_extensioncmdqueue.hxx" +#include <ucbhelper/contentbroker.hxx> + using namespace ::dp_misc; using namespace ::com::sun::star; @@ -66,6 +69,7 @@ public: // Application virtual int Main(); + virtual void DeInit(); }; //______________________________________________________________________________ @@ -85,6 +89,18 @@ int MyApp::Main() } +void MyApp::DeInit() +{ + if (::ucbhelper::ContentBroker::get()) + ::ucbhelper::ContentBroker::deinitialize(); + css::uno::Reference< css::uno::XComponentContext > context( + comphelper::getProcessComponentContext()); + dp_misc::disposeBridges(context); + css::uno::Reference< css::lang::XComponent >( + context, css::uno::UNO_QUERY_THROW)->dispose(); + comphelper::setProcessServiceFactory(0); +} + namespace { struct ProductName diff --git a/desktop/source/deployment/inc/dp_misc.h b/desktop/source/deployment/inc/dp_misc.h index 06e67aa1cde8..b95a64cc27ed 100644 --- a/desktop/source/deployment/inc/dp_misc.h +++ b/desktop/source/deployment/inc/dp_misc.h @@ -159,6 +159,14 @@ void syncRepositories( ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XCommandEnvironment> const & xCmdEnv); +/** workaround: for some reason the bridge threads which communicate with the + uno.exe process are not released on time +*/ +DESKTOP_DEPLOYMENTMISC_DLLPUBLIC +void disposeBridges( + com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext > + const & ctx); + } #endif diff --git a/desktop/source/deployment/misc/dp_misc.cxx b/desktop/source/deployment/misc/dp_misc.cxx index 9ed579fbb97c..00fd352ac1ab 100644 --- a/desktop/source/deployment/misc/dp_misc.cxx +++ b/desktop/source/deployment/misc/dp_misc.cxx @@ -43,6 +43,7 @@ #include "osl/mutex.hxx" #include "com/sun/star/ucb/CommandAbortedException.hpp" #include "com/sun/star/task/XInteractionHandler.hpp" +#include "com/sun/star/bridge/XBridgeFactory.hpp" #include "com/sun/star/bridge/UnoUrlResolver.hpp" #include "com/sun/star/bridge/XUnoUrlResolver.hpp" #include "com/sun/star/deployment/ExtensionManager.hpp" @@ -631,7 +632,31 @@ void syncRepositories( } } +void disposeBridges(Reference<css::uno::XComponentContext> const & ctx) +{ + if (!ctx.is()) + return; + Reference<css::bridge::XBridgeFactory> bridgeFac( + ctx->getServiceManager()->createInstanceWithContext( + OUSTR("com.sun.star.bridge.BridgeFactory"), ctx), + UNO_QUERY_THROW); + + const Sequence< Reference<css::bridge::XBridge> >seqBridges = bridgeFac->getExistingBridges(); + for (sal_Int32 i = 0; i < seqBridges.getLength(); i++) + { + Reference<css::lang::XComponent> comp(seqBridges[i], UNO_QUERY); + if (comp.is()) + { + try { + comp->dispose(); + } + catch ( const css::lang::DisposedException& ) + { + } + } + } +} } diff --git a/desktop/source/pkgchk/unopkg/unopkg_app.cxx b/desktop/source/pkgchk/unopkg/unopkg_app.cxx index ef16ea1b6a41..938591a2c831 100644 --- a/desktop/source/pkgchk/unopkg/unopkg_app.cxx +++ b/desktop/source/pkgchk/unopkg/unopkg_app.cxx @@ -48,7 +48,6 @@ #include "com/sun/star/deployment/ui/PackageManagerDialog.hpp" #include "com/sun/star/ui/dialogs/XExecutableDialog.hpp" -#include "com/sun/star/lang/DisposedException.hpp" #include "boost/scoped_array.hpp" #include "com/sun/star/ui/dialogs/XDialogClosedListener.hpp" #include "com/sun/star/bridge/XBridgeFactory.hpp" @@ -189,42 +188,9 @@ Reference<deployment::XPackage> findPackage( } // anon namespace - -//workaround for some reason the bridge threads which communicate with the uno.exe -//process are not releases on time -void disposeBridges(Reference<css::uno::XComponentContext> ctx) -{ - if (!ctx.is()) - return; - - Reference<css::bridge::XBridgeFactory> bridgeFac( - ctx->getServiceManager()->createInstanceWithContext( - OUSTR("com.sun.star.bridge.BridgeFactory"), ctx), - UNO_QUERY); - - if (bridgeFac.is()) - { - const Sequence< Reference<css::bridge::XBridge> >seqBridges = bridgeFac->getExistingBridges(); - for (sal_Int32 i = 0; i < seqBridges.getLength(); i++) - { - Reference<css::lang::XComponent> comp(seqBridges[i], UNO_QUERY); - if (comp.is()) - { - try { - comp->dispose(); - } - catch ( const css::lang::DisposedException& ) - { - } - } - } - } -} - extern "C" DESKTOP_DLLPUBLIC int unopkg_main() { tools::extendApplicationEnvironment(); - DisposeGuard disposeGuard; bool bNoOtherErrorMsg = false; OUString subCommand; bool option_shared = false; @@ -376,8 +342,7 @@ extern "C" DESKTOP_DLLPUBLIC int unopkg_main() } xComponentContext = getUNO( - disposeGuard, option_verbose, option_shared, subcmd_gui, - xLocalComponentContext ); + option_verbose, option_shared, subcmd_gui, xLocalComponentContext ); Reference<deployment::XExtensionManager> xExtensionManager( deployment::ExtensionManager::get( xComponentContext ) ); @@ -580,6 +545,7 @@ extern "C" DESKTOP_DLLPUBLIC int unopkg_main() xDialog->startExecuteModal(xListener); dialogEnded.wait(); + return 0; } else { @@ -596,7 +562,7 @@ extern "C" DESKTOP_DLLPUBLIC int unopkg_main() if (option_verbose) dp_misc::writeConsole(OUSTR("\n" APP_NAME " done.\n")); //Force to release all bridges which connect us to the child processes - disposeBridges(xLocalComponentContext); + dp_misc::disposeBridges(xLocalComponentContext); return 0; } catch (const ucb::CommandFailedException &e) @@ -645,7 +611,7 @@ extern "C" DESKTOP_DLLPUBLIC int unopkg_main() } if (!bNoOtherErrorMsg) dp_misc::writeConsoleError("\n" APP_NAME " failed.\n"); - disposeBridges(xLocalComponentContext); + dp_misc::disposeBridges(xLocalComponentContext); return 1; } diff --git a/desktop/source/pkgchk/unopkg/unopkg_misc.cxx b/desktop/source/pkgchk/unopkg/unopkg_misc.cxx index 52b4ab884a1b..4b1da992c323 100644 --- a/desktop/source/pkgchk/unopkg/unopkg_misc.cxx +++ b/desktop/source/pkgchk/unopkg/unopkg_misc.cxx @@ -364,21 +364,14 @@ void printf_packages( } } - - namespace { //------------------------------------------------------------------------------ -Reference<XComponentContext> bootstrapStandAlone( - DisposeGuard & disposeGuard, bool /*verbose */) +Reference<XComponentContext> bootstrapStandAlone() { Reference<XComponentContext> xContext = ::cppu::defaultBootstrap_InitialComponentContext(); - // assure disposing of local component context: - disposeGuard.reset( - Reference<lang::XComponent>( xContext, UNO_QUERY ) ); - Reference<lang::XMultiServiceFactory> xServiceManager( xContext->getServiceManager(), UNO_QUERY_THROW ); // set global process service factory used by unotools config helpers @@ -392,7 +385,6 @@ Reference<XComponentContext> bootstrapStandAlone( if (! ::ucbhelper::ContentBroker::initialize( xServiceManager, ucb_args )) throw RuntimeException( OUSTR("cannot initialize UCB!"), 0 ); - disposeGuard.setDeinitUCB(); return xContext; } @@ -468,7 +460,7 @@ OUString getLockFilePath() } //============================================================================== Reference<XComponentContext> getUNO( - DisposeGuard & disposeGuard, bool verbose, bool shared, bool bGui, + bool verbose, bool shared, bool bGui, Reference<XComponentContext> & out_localContext) { // do not create any user data (for the root user) in --shared mode: @@ -480,8 +472,7 @@ Reference<XComponentContext> getUNO( // hold lock during process runtime: static ::desktop::Lockfile s_lockfile( false /* no IPC server */ ); - Reference<XComponentContext> xComponentContext( - bootstrapStandAlone( disposeGuard, verbose ) ); + Reference<XComponentContext> xComponentContext( bootstrapStandAlone() ); out_localContext = xComponentContext; if (::dp_misc::office_is_running()) { xComponentContext.set( diff --git a/desktop/source/pkgchk/unopkg/unopkg_shared.h b/desktop/source/pkgchk/unopkg/unopkg_shared.h index 400e2835199e..a592f46c563b 100644 --- a/desktop/source/pkgchk/unopkg/unopkg_shared.h +++ b/desktop/source/pkgchk/unopkg/unopkg_shared.h @@ -28,7 +28,6 @@ #include "dp_misc.h" #include "com/sun/star/uno/Exception.hpp" -#include "com/sun/star/lang/XComponent.hpp" #include "com/sun/star/uno/XComponentContext.hpp" #include "com/sun/star/ucb/XCommandEnvironment.hpp" #include "com/sun/star/deployment/XPackage.hpp" @@ -123,35 +122,6 @@ bool isBootstrapVariable(sal_uInt32 * pIndex); //############################################################################## //============================================================================== -class DisposeGuard -{ - css::uno::Reference<css::lang::XComponent> m_xComp; - bool m_bDeinitUCB; -public: - DisposeGuard(): m_bDeinitUCB(false) {} - inline ~DisposeGuard() - { - if (m_bDeinitUCB) - ::ucbhelper::ContentBroker::deinitialize(); - - if (m_xComp.is()) - m_xComp->dispose(); - } - - inline void reset( - css::uno::Reference<css::lang::XComponent> const & xComp ) - { - m_xComp = xComp; - } - - inline void setDeinitUCB() - { - m_bDeinitUCB = true; - } - -}; - -//============================================================================== css::uno::Reference<css::ucb::XCommandEnvironment> createCmdEnv( css::uno::Reference<css::uno::XComponentContext> const & xContext, ::rtl::OUString const & logFile, @@ -170,7 +140,7 @@ void printf_packages( //============================================================================== css::uno::Reference<css::uno::XComponentContext> getUNO( - DisposeGuard & disposeGuard, bool verbose, bool shared, bool bGui, + bool verbose, bool shared, bool bGui, css::uno::Reference<css::uno::XComponentContext> & out_LocalComponentContext); } |