[Libreoffice-commits] core.git: Branch 'libreoffice-6-0' - framework/source

Michael Stahl mstahl at redhat.com
Thu Nov 30 21:46:27 UTC 2017


 framework/source/services/desktop.cxx |   30 +++++++++++++++++++++++++-----
 1 file changed, 25 insertions(+), 5 deletions(-)

New commits:
commit 95f643cd9c14f3eb8ca3a265d0d0ea8f4b7c8865
Author: Michael Stahl <mstahl at redhat.com>
Date:   Wed Nov 29 15:18:12 2017 +0100

    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 at collabora.com>
    Tested-by: Jenkins <ci at libreoffice.org>
    (cherry picked from commit fa9c083c6071a0a4dc812f3c34731f347ddbabf7)
    Reviewed-on: https://gerrit.libreoffice.org/45557
    Reviewed-by: Michael Stahl <mstahl at redhat.com>

diff --git a/framework/source/services/desktop.cxx b/framework/source/services/desktop.cxx
index fd52af489998..119dd5d69697 100644
--- a/framework/source/services/desktop.cxx
+++ b/framework/source/services/desktop.cxx
@@ -1796,10 +1796,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);
+}
 
 }
 
@@ -1808,7 +1828,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: */


More information about the Libreoffice-commits mailing list