|
 |
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 |
|