[Libreoffice-commits] core.git: Branch 'distro/lhm/libreoffice-5-2+backports' - desktop/inc desktop/source vcl/inc vcl/unx

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Thu Nov 1 12:47:12 UTC 2018


 desktop/inc/app.hxx                |    1 +
 desktop/source/app/app.cxx         |    9 +++++++++
 desktop/source/app/sofficemain.cxx |    4 ++++
 vcl/inc/opengl/x11/glxtest.hxx     |    2 ++
 vcl/unx/glxtest.cxx                |   18 +++++++++++++++++-
 5 files changed, 33 insertions(+), 1 deletion(-)

New commits:
commit 7b3cf21513bd878dc719cf6e8089b8d4bc937653
Author:     Stephan Bergmann <sbergman at redhat.com>
AuthorDate: Thu Apr 19 13:59:16 2018 +0200
Commit:     Thorsten Behrens <Thorsten.Behrens at CIB.de>
CommitDate: Thu Nov 1 13:46:40 2018 +0100

    tdf#95843: Wait for fire_glxtest_process also in --headless mode
    
    Discussed with mmeeks on IRC that fire_glxtest_process is probably called as
    early as possible so that its reuslt is ready by the time it is needed in the
    non-headless case.  So best fix for headless is probably to just wait for the
    sub-process at an opportune point, instead of redesigning the whole mess so that
    fire_glxtest_process would only be called once its result is actually needed.
    
    Reviewed-on: https://gerrit.libreoffice.org/53154
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Stephan Bergmann <sbergman at redhat.com>
    (cherry picked from commit 4bacf58f4af44ac8c4632b43289ccfcc07e5820c)
    
    Change-Id: I4ea9c9d54b83c9695a3b72317e68fed0c410da0e
    Reviewed-on: https://gerrit.libreoffice.org/62722
    Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>
    Tested-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>

diff --git a/desktop/inc/app.hxx b/desktop/inc/app.hxx
index c90bfdb0d7d7..76c4f590dd3b 100644
--- a/desktop/inc/app.hxx
+++ b/desktop/inc/app.hxx
@@ -195,6 +195,7 @@ OUString ReplaceStringHookProc(const OUString& rStr);
 
 #if defined( UNX ) && !defined MACOSX && !defined IOS && !defined ANDROID && !defined LIBO_HEADLESS
 bool fire_glxtest_process();
+void reap_glxtest_process();
 #endif
 
 #endif // INCLUDED_DESKTOP_INC_APP_HXX
diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx
index f95e6cf1bf54..9a59b0a9712e 100644
--- a/desktop/source/app/app.cxx
+++ b/desktop/source/app/app.cxx
@@ -1617,6 +1617,15 @@ int Desktop::Main()
         CheckOpenCLCompute(xDesktop);
 #endif
 
+        // In headless mode, reap the process started by fire_glxtest_process() early in soffice_main
+        // (desktop/source/app/sofficemain.cxx), in a code block that needs to be covered by the same
+        // #if condition as this code block:
+#if defined( UNX ) && !defined MACOSX && !defined IOS && !defined ANDROID && !defined(LIBO_HEADLESS) && HAVE_FEATURE_OPENGL
+        if (rCmdLineArgs.IsHeadless()) {
+            reap_glxtest_process();
+        }
+#endif
+
         // Release solar mutex just before we wait for our client to connect
         {
             SolarMutexReleaser aReleaser;
diff --git a/desktop/source/app/sofficemain.cxx b/desktop/source/app/sofficemain.cxx
index 4534f3aba885..0c263bb3f721 100644
--- a/desktop/source/app/sofficemain.cxx
+++ b/desktop/source/app/sofficemain.cxx
@@ -125,6 +125,10 @@ extern "C" int DESKTOP_DLLPUBLIC soffice_main()
 #if defined( UNX ) && !defined MACOSX && !defined IOS && !defined ANDROID && !defined(LIBO_HEADLESS) && HAVE_FEATURE_OPENGL
     /* Run test for OpenGL support in own process to avoid crash with broken
      * OpenGL drivers. Start process as early as possible.
+     * In non-headless mode, the process will be reaped in X11OpenGLDeviceInfo::GetData
+     * (vcl/opengl/x11/X11DeviceInfo.cxx).  In headless mode, the process will be reaped late in
+     * Desktop::Main (desktop/source/app/app.cxx), in a code block that needs to be covered by the
+     * same #if condition as this code block.
      */
     bool bSuccess = fire_glxtest_process();
     SAL_WARN_IF(!bSuccess, "desktop.opengl", "problems with glxtest");
diff --git a/vcl/inc/opengl/x11/glxtest.hxx b/vcl/inc/opengl/x11/glxtest.hxx
index 979f795de139..d74436aae111 100644
--- a/vcl/inc/opengl/x11/glxtest.hxx
+++ b/vcl/inc/opengl/x11/glxtest.hxx
@@ -18,6 +18,8 @@ VCL_DLLPUBLIC pid_t* getGlxPid();
 
 bool fire_glxtest_process();
 
+void reap_glxtest_process();
+
 #endif
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/glxtest.cxx b/vcl/unx/glxtest.cxx
index efe55910d164..23b8032441a5 100644
--- a/vcl/unx/glxtest.cxx
+++ b/vcl/unx/glxtest.cxx
@@ -26,7 +26,9 @@
 #include "stdint.h"
 #include <string.h>
 
-#include "opengl/x11/glxtest.hxx"
+#include <sys/wait.h>
+
+#include <opengl/x11/glxtest.hxx>
 
 #ifdef __SUNPRO_CC
 #include <stdio.h>
@@ -35,6 +37,8 @@
 #include "X11/Xlib.h"
 #include "X11/Xutil.h"
 
+#include <sal/log.hxx>
+
 // stuff from glx.h
 typedef struct __GLXcontextRec *GLXContext;
 typedef XID GLXPixmap;
@@ -273,3 +277,15 @@ bool fire_glxtest_process()
   *glxtest_pid = pid;
   return true;
 }
+
+void reap_glxtest_process() {
+    pid_t * pid = getGlxPid();
+    if (*pid != 0) {
+        // Use WNOHANG, as it is probably better to have a (rather harmless) zombie child process
+        // hanging around for the duration of the calling process, than to potentially block the
+        // calling process here:
+        pid_t e = waitpid(*pid, nullptr, WNOHANG);
+        SAL_INFO_IF(
+            e <= 0, "vcl.opengl", "waiting for glxtest process " << *pid << " failed with " << e);
+    }
+}


More information about the Libreoffice-commits mailing list