[Libreoffice-commits] core.git: Branch 'feature/calctiledrendering4' - 3 commits - desktop/source

Andrzej Hunt andrzej.hunt at collabora.com
Fri Jul 18 01:02:50 PDT 2014


 desktop/source/app/officeipcthread.cxx |   12 ++++++++++
 desktop/source/app/officeipcthread.hxx |    3 ++
 desktop/source/lib/init.cxx            |   38 ++++++++++++++++++---------------
 3 files changed, 36 insertions(+), 17 deletions(-)

New commits:
commit 6942d9b6ae3c3a8802fadf16feacd5984f55b273
Author: Andrzej Hunt <andrzej.hunt at collabora.com>
Date:   Fri Jul 18 10:02:48 2014 +0200

    Use OfficeIPCThread::WaitForReady rather than sleeping.
    
    This way we actually continue when we're ready to, rather than
    dumbly hoping we wait for long enough.
    
    This isn't entirely unproblematic though -- if we have no config
    pre-prepared (i.e. first-run), then we just end up hanging on this
    since soffice_main exits without doing anything to the OfficeIPCThread.
    (Which is especially problematic for unit tests which specifically run
     on an empty config.)
    
    Change-Id: I064fb500a224cfe37a0d3ba24b6154ffd72a71a3

diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index 0be5f8d..76d05f3 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -60,8 +60,10 @@
 
 // We also need to hackily be able to start the main libreoffice thread
 #include "../app/sofficemain.h"
+#include "../app/officeipcthread.hxx"
 
 using namespace css;
+using namespace desktop;
 using namespace utl;
 
 using namespace boost;
@@ -637,22 +639,27 @@ static int lo_initialize(LibreOfficeKit* pThis, const char* pAppPath)
 
         // Force headless -- this is only for bitmap rendering.
         rtl::Bootstrap::set("SAL_USE_VCLPLUGIN", "svp");
-//         InitVCL();
-        // InitVCL() happens in soffice_main for us -- and we can't call InitVCL twice
-        // unfortunately -- which is annoying since (see below)
 
+        // We could use InitVCL() here -- and used to before using soffice_main,
+        // however that now deals with the initialisation for us (and it's not
+        // possible to try to set up VCL twice.
+
+        // Instead VCL init is done for us by soffice_main in a separate thread,
+        // however we specifically can't proceed until this setup is complete
+        // (or you get segfaults trying to use VCL and/or deadlocks due to other
+        //  setup within soffice_main). Specifically the various Application::
+        // functions depend on VCL being ready -- the deadlocks would happen
+        // if you try to use loadDocument too early.
+
+        // The OfficeIPCThread is specifically set to be read when all the other
+        // init in Desktop::Main (run from soffice_main) is done. We can "enable"
+        // the Thread from wherever (it's done again in Desktop::Main), and can
+        // then use it to wait until we're definitely ready to continue.
+
+        OfficeIPCThread::EnableOfficeIPCThread();
         pthread_t thread;
         pthread_create(&thread, 0, lo_startmain, NULL);
-        sleep(10);
-        // We'll segfault trying to access Application if we're too fast...
-        // Specifically pImplSVData doesn't exist until InitVCL has been called,
-        // and that won't be immediate, but we can't call InitVCL ourselves
-        // as soffice_main already does so, but InitVCL would then fail
-        // within soffice_main if we have already called it earlier.
-        //
-        // And there's also a chance of deadlock if we try to open documents
-        // too early -- when running in a debugger we therefore need quite
-        // a large delay here (for now).
+        OfficeIPCThread::WaitForReady();
 
         Application::EnableHeadlessMode(true);
 
commit 13c5fb87f76655e7aa05040a4c737843561d1f44
Author: Andrzej Hunt <andrzej.hunt at collabora.com>
Date:   Fri Jul 18 10:00:42 2014 +0200

    Bin outdated / incorrect comment.
    
    Change-Id: I7b8f97377b9606a2228f172f772d8051a64703d2

diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index e9a1eed..0be5f8d 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -635,10 +635,7 @@ static int lo_initialize(LibreOfficeKit* pThis, const char* pAppPath)
         initialize_uno(aAppURL);
         force_c_locale();
 
-        // Force headless
-        // the "svp" headless vcl backend isn't able to do tiled rendering for
-        // us -- we need to use a full featured backend, i.e. "gen" or "gtk",
-        // gtk seems to be somewhat better.
+        // Force headless -- this is only for bitmap rendering.
         rtl::Bootstrap::set("SAL_USE_VCLPLUGIN", "svp");
 //         InitVCL();
         // InitVCL() happens in soffice_main for us -- and we can't call InitVCL twice
commit 2dbf8c516f880e3ba9f5025a619a5729b6342112
Author: Andrzej Hunt <andrzej.hunt at collabora.com>
Date:   Fri Jul 18 09:48:47 2014 +0200

    Add OfficeIPCThread::WaitForReady.
    
    For LibreOfficeKit we need to start up the event loop, and can't continue
    initialisation until all the related (VCL etc.) setup is complete -- the
    OfficeIPCThread is also enabled as one of the last items, and can be
    used to indicate whether or not we can start actually working with VCL.
    
    Change-Id: I0450b65584ddf6e8d02ce0c6e66e06f47841d1b7

diff --git a/desktop/source/app/officeipcthread.cxx b/desktop/source/app/officeipcthread.cxx
index aed17b9..93cd339 100644
--- a/desktop/source/app/officeipcthread.cxx
+++ b/desktop/source/app/officeipcthread.cxx
@@ -669,6 +669,18 @@ void OfficeIPCThread::SetReady(
     }
 }
 
+void OfficeIPCThread::WaitForReady(
+    rtl::Reference< OfficeIPCThread > const & pThread)
+
+{
+    rtl::Reference< OfficeIPCThread > const & t(
+        pThread.is() ? pThread : pGlobalOfficeIPCThread);
+    if (t.is())
+    {
+        t->cReady.wait();
+    }
+}
+
 void OfficeIPCThread::execute()
 {
 #if HAVE_FEATURE_DESKTOP
diff --git a/desktop/source/app/officeipcthread.hxx b/desktop/source/app/officeipcthread.hxx
index 4628eca..9c1d751 100644
--- a/desktop/source/app/officeipcthread.hxx
+++ b/desktop/source/app/officeipcthread.hxx
@@ -125,6 +125,9 @@ class OfficeIPCThread : public salhelper::Thread
     static void                 SetReady(
         rtl::Reference< OfficeIPCThread > const & pThread =
             rtl::Reference< OfficeIPCThread >());
+    static void                 WaitForReady(
+        rtl::Reference< OfficeIPCThread > const & pThread =
+            rtl::Reference< OfficeIPCThread >());
 
     bool                        AreRequestsEnabled() const { return mbRequestsEnabled && ! mbDowning; }
 };


More information about the Libreoffice-commits mailing list