summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2017-11-29 15:18:12 +0100
committerAndras Timar <andras.timar@collabora.com>2017-12-01 22:51:00 +0100
commit0cf210ce702d8a9fc99c326962b05c10cf4cedde (patch)
tree2e081a99762166b005bb5ed9b0db3b1b355a84b4
parent6fea94f8c2b31ac9ab7c92ae81b6dc07ffe6dd28 (diff)
tdf#114025 framework: avoid deadlock between Desktop init ...
... and SolarMutex: the problem is that rtl::StaticWithArg will first lock the implicit mutex of the C++11 static variable, and then the SolarMutex. So if one thread creates the Desktop singleton with SolarMutex locked and another thread without SolarMutex locked, this can deadlock. If we use rtl_Instance directly with SolarMutex, then there is still a static variable, but the SolarMutex will always be locked first, preventing this deadlock. Change-Id: Ibd37fdfa96a4a2b57f661be3814dd597eb52d338 Reviewed-on: https://gerrit.libreoffice.org/45508 Reviewed-by: Michael Meeks <michael.meeks@collabora.com> Tested-by: Jenkins <ci@libreoffice.org> (cherry picked from commit fa9c083c6071a0a4dc812f3c34731f347ddbabf7) Reviewed-on: https://gerrit.libreoffice.org/45672 Reviewed-by: Andras Timar <andras.timar@collabora.com> Tested-by: Andras Timar <andras.timar@collabora.com>
-rw-r--r--framework/source/services/desktop.cxx30
1 files changed, 25 insertions, 5 deletions
diff --git a/framework/source/services/desktop.cxx b/framework/source/services/desktop.cxx
index 20afab1ef700..81c29ab973c3 100644
--- a/framework/source/services/desktop.cxx
+++ b/framework/source/services/desktop.cxx
@@ -1789,10 +1789,30 @@ struct Instance {
rtl::Reference<framework::Desktop> instance;
};
-struct Singleton:
- public rtl::StaticWithArg<
- Instance, css::uno::Reference<css::uno::XComponentContext>, Singleton>
-{};
+struct InstanceInit {
+ Instance * operator() (css::uno::Reference<css::uno::XComponentContext> const& xContext) {
+ static Instance instance(xContext);
+ return &instance;
+ }
+};
+
+struct GetSolarMutex {
+ comphelper::SolarMutex * operator() ()
+ {
+ return &Application::GetSolarMutex();
+ }
+};
+
+Instance & getInstance(css::uno::Reference<css::uno::XComponentContext> const& xContext)
+{
+ // tdf#114025 init with SolarMutex to avoid deadlock
+ return *rtl_Instance<Instance,
+ InstanceInit,
+ osl::Guard<comphelper::SolarMutex>,
+ GetSolarMutex,
+ css::uno::Reference<css::uno::XComponentContext> const>
+ ::create(InstanceInit(), GetSolarMutex(), xContext);
+}
}
@@ -1801,7 +1821,7 @@ com_sun_star_comp_framework_Desktop_get_implementation(
css::uno::XComponentContext *context,
css::uno::Sequence<css::uno::Any> const &)
{
- return cppu::acquire(Singleton::get(context).instance.get());
+ return cppu::acquire(getInstance(context).instance.get());
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */