summaryrefslogtreecommitdiff
path: root/framework/source/services
diff options
context:
space:
mode:
authorMarkus Mohrhard <markus.mohrhard@googlemail.com>2017-01-09 05:58:00 +0100
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2017-01-10 13:23:43 +0000
commitad915fafd54f9115faea7147f82d80a942af2d68 (patch)
treec119ea25cc8e07f337af9f280a19c32d63ecb701 /framework/source/services
parent11e5668f12565ad9b1acb5c0085653c7a22ca329 (diff)
tdf#104830, need an own termination listener for lib objects
The destruction of the SwDLL object happens already through the normal termination listener but the other termination listeners might still depend on it. Also the outstanding events might need the SwDLL instance to be still around. This makes the destruction of the instance explicit and at a time when it should be safe. We should use the same code for calc, impress, math and base as well. Change-Id: I50b8f30426f5a4a54e362e748fe962839abca73e Reviewed-on: https://gerrit.libreoffice.org/32856 Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk> Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
Diffstat (limited to 'framework/source/services')
-rw-r--r--framework/source/services/desktop.cxx29
1 files changed, 29 insertions, 0 deletions
diff --git a/framework/source/services/desktop.cxx b/framework/source/services/desktop.cxx
index 9ab71a9f32a2..22a8360d5335 100644
--- a/framework/source/services/desktop.cxx
+++ b/framework/source/services/desktop.cxx
@@ -347,6 +347,14 @@ sal_Bool SAL_CALL Desktop::terminate()
if ( xPipeTerminator.is() )
xPipeTerminator->notifyTermination( aEvent );
+ // we need a copy here as the notifyTermination call might cause a removeTerminateListener call
+ std::vector< css::uno::Reference<css::frame::XTerminateListener> > xComponentDllListeners = m_xComponentDllListeners;
+ for (auto& xListener : xComponentDllListeners)
+ {
+ xListener->notifyTermination(aEvent);
+ }
+ m_xComponentDllListeners.clear();
+
// Must be really the last listener to be called.
// Because it shutdown the whole process asynchronous !
if ( xSfxTerminator.is() )
@@ -424,6 +432,11 @@ void SAL_CALL Desktop::addTerminateListener( const css::uno::Reference< css::fra
m_xSWThreadManager = xListener;
return;
}
+ else if ( sImplementationName == "com.sun.star.comp.ComponentDLLListener" )
+ {
+ m_xComponentDllListeners.push_back(xListener);
+ return;
+ }
}
// No lock required ... container is threadsafe by itself.
@@ -471,6 +484,13 @@ void SAL_CALL Desktop::removeTerminateListener( const css::uno::Reference< css::
m_xSWThreadManager.clear();
return;
}
+ else if (sImplementationName == "com.sun.star.comp.ComponentDLLListener")
+ {
+ m_xComponentDllListeners.erase(
+ std::remove(m_xComponentDllListeners.begin(), m_xComponentDllListeners.end(), xListener),
+ m_xComponentDllListeners.end());
+ return;
+ }
}
// No lock required ... container is threadsafe by itself.
@@ -1100,6 +1120,15 @@ void SAL_CALL Desktop::disposing()
m_xQuickLauncher.clear();
m_xStarBasicQuitGuard.clear();
m_xSWThreadManager.clear();
+
+ // we need a copy because the notifyTermination might call the removeEventListener method
+ std::vector< css::uno::Reference<css::frame::XTerminateListener> > xComponentDllListeners = m_xComponentDllListeners;
+ for (auto& xListener: xComponentDllListeners)
+ {
+ xListener->notifyTermination(aEvent);
+ }
+ xComponentDllListeners.clear();
+ m_xComponentDllListeners.clear();
m_xSfxTerminator.clear();
m_xCommandOptions.reset();