Kaydet (Commit) fa9c083c authored tarafından Michael Stahl's avatar Michael Stahl

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/45508Reviewed-by: 's avatarMichael Meeks <michael.meeks@collabora.com>
Tested-by: 's avatarJenkins <ci@libreoffice.org>
üst b1443681
...@@ -1796,10 +1796,30 @@ struct Instance { ...@@ -1796,10 +1796,30 @@ struct Instance {
rtl::Reference<framework::Desktop> instance; rtl::Reference<framework::Desktop> instance;
}; };
struct Singleton: struct InstanceInit {
public rtl::StaticWithArg< Instance * operator() (css::uno::Reference<css::uno::XComponentContext> const& xContext) {
Instance, css::uno::Reference<css::uno::XComponentContext>, Singleton> 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);
}
} }
...@@ -1808,7 +1828,7 @@ com_sun_star_comp_framework_Desktop_get_implementation( ...@@ -1808,7 +1828,7 @@ com_sun_star_comp_framework_Desktop_get_implementation(
css::uno::XComponentContext *context, css::uno::XComponentContext *context,
css::uno::Sequence<css::uno::Any> const &) 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: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment