Blame SOURCES/0005-Resolves-rhbz-144437-make-gnome-documents-not-crash-.patch

dc0b3e
From 226b7436988f7a0e4c7d06353c630f10047ac7f6 Mon Sep 17 00:00:00 2001
dc0b3e
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
dc0b3e
Date: Mon, 8 May 2017 15:26:22 +0100
dc0b3e
Subject: [PATCH] Resolves: rhbz#144437 make gnome-documents not crash the
dc0b3e
 whole time
dc0b3e
dc0b3e
accept that once initted that LibreOffice cannot be deinitted and reinited
dc0b3e
(without lots of work), but allow the main loop to quit and restart so LOKs
dc0b3e
thread can run and exit successfully, new LOK connections will restart the main
dc0b3e
loop.
dc0b3e
dc0b3e
The buckets of global state continues to be valid the whole time this way
dc0b3e
dc0b3e
Change-Id: Ide54c0df2ce4065f7c192ae8c2cedfaaa2b58d72
dc0b3e
---
dc0b3e
 desktop/source/app/app.cxx               |  2 +-
dc0b3e
 desktop/source/app/officeipcthread.cxx   |  9 +++++++--
dc0b3e
 desktop/source/app/officeipcthread.hxx   |  2 +-
dc0b3e
 desktop/source/lib/init.cxx              |  5 ++++-
dc0b3e
 framework/source/services/desktop.cxx    |  8 +++++---
dc0b3e
 libreofficekit/source/gtk/lokdocview.cxx | 27 ++++++++++++++++++---------
dc0b3e
 vcl/source/app/svmain.cxx                |  8 ++++++++
dc0b3e
 7 files changed, 44 insertions(+), 17 deletions(-)
dc0b3e
dc0b3e
diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx
dc0b3e
index df79f41..dc7ff1e 100644
dc0b3e
--- a/desktop/source/app/app.cxx
dc0b3e
+++ b/desktop/source/app/app.cxx
dc0b3e
@@ -1998,7 +1998,7 @@ IMPL_LINK_NOARG(Desktop, OpenClients_Impl, void*, void)
dc0b3e
         // When this server closes down it attempts to recreate the pipe (in RequestHandler::Disable()).
dc0b3e
         // It's possible that the client has a pending connection request.
dc0b3e
         // When the IPC thread is not running, this connection locks (because maPipe.accept()) is never called
dc0b3e
-        RequestHandler::SetReady();
dc0b3e
+        RequestHandler::SetReady(true);
dc0b3e
         OpenClients();
dc0b3e
 
dc0b3e
         CloseSplashScreen();
dc0b3e
diff --git a/desktop/source/app/officeipcthread.cxx b/desktop/source/app/officeipcthread.cxx
dc0b3e
index 7a2fd46..5ea5f41 100644
dc0b3e
--- a/desktop/source/app/officeipcthread.cxx
dc0b3e
+++ b/desktop/source/app/officeipcthread.cxx
dc0b3e
@@ -939,6 +939,8 @@ void RequestHandler::Disable()
dc0b3e
             handler->mIpcThread->join();
dc0b3e
             handler->mIpcThread.clear();
dc0b3e
         }
dc0b3e
+
dc0b3e
+        handler->cReady.reset();
dc0b3e
     }
dc0b3e
 }
dc0b3e
 
dc0b3e
@@ -953,12 +955,15 @@ RequestHandler::~RequestHandler()
dc0b3e
     assert(!mIpcThread.is());
dc0b3e
 }
dc0b3e
 
dc0b3e
-void RequestHandler::SetReady()
dc0b3e
+void RequestHandler::SetReady(bool bIsReady)
dc0b3e
 {
dc0b3e
     osl::MutexGuard g(GetMutex());
dc0b3e
     if (pGlobal.is())
dc0b3e
     {
dc0b3e
-        pGlobal->cReady.set();
dc0b3e
+        if (bIsReady)
dc0b3e
+            pGlobal->cReady.set();
dc0b3e
+        else
dc0b3e
+            pGlobal->cReady.reset();
dc0b3e
     }
dc0b3e
 }
dc0b3e
 
dc0b3e
diff --git a/desktop/source/app/officeipcthread.hxx b/desktop/source/app/officeipcthread.hxx
dc0b3e
index 2826aba..2b58ce4 100644
dc0b3e
--- a/desktop/source/app/officeipcthread.hxx
dc0b3e
+++ b/desktop/source/app/officeipcthread.hxx
dc0b3e
@@ -122,7 +122,7 @@ class RequestHandler: public salhelper::SimpleReferenceObject
dc0b3e
     static Status               Enable(bool ipc);
dc0b3e
     static void                 Disable();
dc0b3e
     // start dispatching events...
dc0b3e
-    static void                 SetReady();
dc0b3e
+    static void                 SetReady(bool bIsReady);
dc0b3e
     static void                 WaitForReady();
dc0b3e
 
dc0b3e
     bool                        AreRequestsEnabled() const { return mState == State::RequestsEnabled; }
dc0b3e
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
dc0b3e
index 9df6471..14c7bfd 100644
dc0b3e
--- a/desktop/source/lib/init.cxx
dc0b3e
+++ b/desktop/source/lib/init.cxx
dc0b3e
@@ -2742,10 +2742,12 @@ static void lo_startmain(void*)
dc0b3e
 {
dc0b3e
     osl_setThreadName("lo_startmain");
dc0b3e
 
dc0b3e
-    if (GetpApp())
dc0b3e
+    if (comphelper::SolarMutex::get())
dc0b3e
         Application::GetSolarMutex().tryToAcquire();
dc0b3e
 
dc0b3e
     soffice_main();
dc0b3e
+
dc0b3e
+    Application::ReleaseSolarMutex();
dc0b3e
 }
dc0b3e
 
dc0b3e
 static bool bInitialized = false;
dc0b3e
@@ -2912,6 +2914,7 @@ static int lo_initialize(LibreOfficeKit* pThis, const char* pAppPath, const char
dc0b3e
             SAL_INFO("lok", "Enabling RequestHandler");
dc0b3e
             RequestHandler::Enable(false);
dc0b3e
             SAL_INFO("lok", "Starting soffice_main");
dc0b3e
+            RequestHandler::SetReady(false);
dc0b3e
             pLib->maThread = osl_createThread(lo_startmain, nullptr);
dc0b3e
             SAL_INFO("lok", "Waiting for RequestHandler");
dc0b3e
             RequestHandler::WaitForReady();
dc0b3e
diff --git a/framework/source/services/desktop.cxx b/framework/source/services/desktop.cxx
dc0b3e
index 20afab1..6f6412a 100644
dc0b3e
--- a/framework/source/services/desktop.cxx
dc0b3e
+++ b/framework/source/services/desktop.cxx
dc0b3e
@@ -59,6 +59,7 @@
dc0b3e
 #include <com/sun/star/frame/XTerminateListener2.hpp>
dc0b3e
 
dc0b3e
 #include <comphelper/sequence.hxx>
dc0b3e
+#include <comphelper/lok.hxx>
dc0b3e
 #include <cppuhelper/supportsservice.hxx>
dc0b3e
 #include <rtl/instance.hxx>
dc0b3e
 #include <vcl/svapp.hxx>
dc0b3e
@@ -228,8 +229,9 @@ sal_Bool SAL_CALL Desktop::terminate()
dc0b3e
 
dc0b3e
     // try to close all open frames.
dc0b3e
     // Allow using of any UI ... because Desktop.terminate() was designed as UI functionality in the past.
dc0b3e
-    bool bIsEventTestingMode = Application::IsEventTestingModeEnabled();
dc0b3e
-    bool bFramesClosed = impl_closeFrames(!bIsEventTestingMode);
dc0b3e
+    bool bRestartableMainLoop = Application::IsEventTestingModeEnabled() ||
dc0b3e
+                                comphelper::LibreOfficeKit::isActive();
dc0b3e
+    bool bFramesClosed = impl_closeFrames(!bRestartableMainLoop);
dc0b3e
 
dc0b3e
     // Ask normal terminate listener. They could stop terminating the process.
dc0b3e
     Desktop::TTerminateListenerList lCalledTerminationListener;
dc0b3e
@@ -241,7 +243,7 @@ sal_Bool SAL_CALL Desktop::terminate()
dc0b3e
         return false;
dc0b3e
     }
dc0b3e
 
dc0b3e
-    if (bIsEventTestingMode)
dc0b3e
+    if (bRestartableMainLoop)
dc0b3e
     {
dc0b3e
         Application::Quit();
dc0b3e
         return true;
dc0b3e
diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx
dc0b3e
index 6d05b7a..5d64d7b 100644
dc0b3e
--- a/libreofficekit/source/gtk/lokdocview.cxx
dc0b3e
+++ b/libreofficekit/source/gtk/lokdocview.cxx
dc0b3e
@@ -2610,16 +2610,25 @@ static void lok_doc_view_destroy (GtkWidget* widget)
dc0b3e
 
dc0b3e
     aGuard.unlock();
dc0b3e
 
dc0b3e
-    if (priv->m_pDocument && priv->m_pDocument->pClass->getViewsCount(priv->m_pDocument) > 1)
dc0b3e
-    {
dc0b3e
-        priv->m_pDocument->pClass->destroyView(priv->m_pDocument, priv->m_nViewId);
dc0b3e
-    }
dc0b3e
-    else
dc0b3e
+    if (priv->m_pDocument)
dc0b3e
     {
dc0b3e
-        if (priv->m_pDocument)
dc0b3e
-            priv->m_pDocument->pClass->destroy (priv->m_pDocument);
dc0b3e
-        if (priv->m_pOffice)
dc0b3e
-            priv->m_pOffice->pClass->destroy (priv->m_pOffice);
dc0b3e
+        if (priv->m_pDocument->pClass->getViewsCount(priv->m_pDocument) > 1)
dc0b3e
+        {
dc0b3e
+            priv->m_pDocument->pClass->destroyView(priv->m_pDocument, priv->m_nViewId);
dc0b3e
+        }
dc0b3e
+        else
dc0b3e
+        {
dc0b3e
+            if (priv->m_pDocument)
dc0b3e
+            {
dc0b3e
+                priv->m_pDocument->pClass->destroy (priv->m_pDocument);
dc0b3e
+                priv->m_pDocument = nullptr;
dc0b3e
+            }
dc0b3e
+            if (priv->m_pOffice)
dc0b3e
+            {
dc0b3e
+                priv->m_pOffice->pClass->destroy (priv->m_pOffice);
dc0b3e
+                priv->m_pOffice = nullptr;
dc0b3e
+            }
dc0b3e
+        }
dc0b3e
     }
dc0b3e
 
dc0b3e
     GTK_WIDGET_CLASS (lok_doc_view_parent_class)->destroy (widget);
dc0b3e
diff --git a/vcl/source/app/svmain.cxx b/vcl/source/app/svmain.cxx
dc0b3e
index 2cd6137..a5f7807 100644
dc0b3e
--- a/vcl/source/app/svmain.cxx
dc0b3e
+++ b/vcl/source/app/svmain.cxx
dc0b3e
@@ -84,6 +84,7 @@
dc0b3e
 #include <com/sun/star/lang/XComponent.hpp>
dc0b3e
 #include <com/sun/star/frame/Desktop.hpp>
dc0b3e
 
dc0b3e
+#include <comphelper/lok.hxx>
dc0b3e
 #include <cppuhelper/implbase.hxx>
dc0b3e
 #include <uno/current_context.hxx>
dc0b3e
 
dc0b3e
@@ -361,6 +362,13 @@ VCLUnoWrapperDeleter::disposing(lang::EventObject const& /* rSource */)
dc0b3e
 
dc0b3e
 void DeInitVCL()
dc0b3e
 {
dc0b3e
+    //rhbz#1444437, when using LibreOffice like a library you can't realistically
dc0b3e
+    //tear everything down and recreate them on the next call, there's too many
dc0b3e
+    //(c++) singletons that point to stuff that gets deleted during shutdown
dc0b3e
+    //which won't be recreated on restart.
dc0b3e
+    if (comphelper::LibreOfficeKit::isActive())
dc0b3e
+        return;
dc0b3e
+
dc0b3e
     {
dc0b3e
         SolarMutexReleaser r; // unblock threads blocked on that so we can join
dc0b3e
         ::comphelper::JoinAsyncEventNotifiers();
dc0b3e
-- 
dc0b3e
2.13.0
dc0b3e