[Libreoffice-commits] core.git: desktop/inc desktop/source vcl/inc vcl/unx
Stephan Bergmann
sbergman at redhat.com
Thu Apr 19 14:50:25 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 | 16 ++++++++++++++++
5 files changed, 32 insertions(+)
New commits:
commit 4bacf58f4af44ac8c4632b43289ccfcc07e5820c
Author: Stephan Bergmann <sbergman at redhat.com>
Date: Thu Apr 19 13:59:16 2018 +0200
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.
Change-Id: I4ea9c9d54b83c9695a3b72317e68fed0c410da0e
Reviewed-on: https://gerrit.libreoffice.org/53154
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Stephan Bergmann <sbergman at redhat.com>
diff --git a/desktop/inc/app.hxx b/desktop/inc/app.hxx
index 672229683144..01224c68ffeb 100644
--- a/desktop/inc/app.hxx
+++ b/desktop/inc/app.hxx
@@ -183,6 +183,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 e452529fbac3..e13263d9b51d 100644
--- a/desktop/source/app/app.cxx
+++ b/desktop/source/app/app.cxx
@@ -1587,6 +1587,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 e27b48d8b93a..4fb84d39d2d1 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 b0cdde234c2b..70d34fb7318d 100644
--- a/vcl/unx/glxtest.cxx
+++ b/vcl/unx/glxtest.cxx
@@ -27,6 +27,8 @@
#include <string.h>
#include <signal.h>
+#include <sys/wait.h>
+
#include <opengl/x11/glxtest.hxx>
#ifdef __SUNPRO_CC
@@ -36,6 +38,8 @@
#include <X11/Xlib.h>
#include <X11/Xutil.h>
+#include <sal/log.hxx>
+
// stuff from glx.h
typedef struct __GLXcontextRec *GLXContext;
typedef XID GLXPixmap;
@@ -275,3 +279,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