[Libreoffice-commits] core.git: desktop/source include/sal sal/Library_sal.mk sal/osl

Stephan Bergmann (via logerrit) logerrit at kemper.freedesktop.org
Fri Aug 30 12:49:13 UTC 2019


 desktop/source/app/sofficemain.cxx |    3 ++
 include/sal/main.h                 |    7 ++++++
 sal/Library_sal.mk                 |    1 
 sal/osl/unx/salinit.cxx            |    6 +++++
 sal/osl/unx/signal.cxx             |   40 +------------------------------------
 sal/osl/unx/soffice.cxx            |   25 +++++++++++++++++++++++
 sal/osl/unx/soffice.hxx            |   26 ++++++++++++++++++++++++
 sal/osl/w32/salinit.cxx            |    4 +++
 8 files changed, 74 insertions(+), 38 deletions(-)

New commits:
commit 629dfff3c7289f185268c7088e67931f6bbd9ce0
Author:     Stephan Bergmann <sbergman at redhat.com>
AuthorDate: Fri Aug 30 09:16:55 2019 +0200
Commit:     Stephan Bergmann <sbergman at redhat.com>
CommitDate: Fri Aug 30 14:48:26 2019 +0200

    Replace is_soffice_Impl hack with a better(?) hack
    
    ...that involves adding a second, one-off special meaning to the existing
    sal_detail_initialize function.  This at least gets rid of the
    "osl_getExecutableFile contains 'soffice' substring" guesswork (and of the
    osl_systemPathGetFileNameOrLastDirectoryPart call there, which is what I'm
    actually after, for a different change to come).
    
    Change-Id: I4dd6eef1fd0411bf66943ffea415876c92d08526
    Reviewed-on: https://gerrit.libreoffice.org/78291
    Tested-by: Jenkins
    Reviewed-by: Stephan Bergmann <sbergman at redhat.com>

diff --git a/desktop/source/app/sofficemain.cxx b/desktop/source/app/sofficemain.cxx
index 805c4f07602e..2a692fdae8d4 100644
--- a/desktop/source/app/sofficemain.cxx
+++ b/desktop/source/app/sofficemain.cxx
@@ -32,6 +32,7 @@
 #include <osl/file.hxx>
 #include <rtl/bootstrap.hxx>
 #include <sal/log.hxx>
+#include <sal/main.h>
 #include <tools/extendapplicationenvironment.hxx>
 #include <vcl/glxtestprocess.hxx>
 #include <vcl/svmain.hxx>
@@ -108,6 +109,8 @@ static bool dumpCallback(const wchar_t* path, const wchar_t* id,
 #endif
 extern "C" int DESKTOP_DLLPUBLIC soffice_main()
 {
+    sal_detail_initialize(sal::detail::InitializeSoffice, nullptr);
+
 #if HAVE_FEATURE_BREAKPAD
 
 #if defined( UNX ) && !defined MACOSX && !defined IOS && !defined ANDROID
diff --git a/include/sal/main.h b/include/sal/main.h
index 9b5ba2b8d69b..d8a87c3e7f61 100644
--- a/include/sal/main.h
+++ b/include/sal/main.h
@@ -33,6 +33,13 @@
 extern "C" {
 #endif
 
+#if defined LIBO_INTERNAL_ONLY && defined __cplusplus
+// Special token for sal_detail_initialize argc parameter, used by the soffice.bin process to tell
+// SAL that it is running as part of that process (see sal/osl/unx/soffice.hxx); argv should be null
+// in such a sal_detail_initialize call:
+namespace sal::detail { constexpr int InitializeSoffice = -1; }
+#endif
+
 SAL_DLLPUBLIC void SAL_CALL sal_detail_initialize(int argc, char ** argv);
 SAL_DLLPUBLIC void SAL_CALL sal_detail_deinitialize(void);
 
diff --git a/sal/Library_sal.mk b/sal/Library_sal.mk
index a02c333852b7..86f2158f039a 100644
--- a/sal/Library_sal.mk
+++ b/sal/Library_sal.mk
@@ -175,6 +175,7 @@ $(eval $(call gb_Library_add_exception_objects,sal,\
 	sal/osl/unx/security \
 	sal/osl/unx/signal \
 	sal/osl/unx/socket \
+	sal/osl/unx/soffice \
 	sal/osl/unx/tempfile \
 	sal/osl/unx/thread \
 	sal/osl/unx/time \
diff --git a/sal/osl/unx/salinit.cxx b/sal/osl/unx/salinit.cxx
index 81a2d02ca31e..9424089dbba0 100644
--- a/sal/osl/unx/salinit.cxx
+++ b/sal/osl/unx/salinit.cxx
@@ -34,6 +34,7 @@
 #include <sal/types.h>
 
 #include "saltime.hxx"
+#include "soffice.hxx"
 #include <salusesyslog.hxx>
 
 #if HAVE_SYSLOG_H
@@ -45,6 +46,11 @@
 extern "C" {
 
 void sal_detail_initialize(int argc, char ** argv) {
+    if (argc == sal::detail::InitializeSoffice)
+    {
+        sal::detail::setSoffice();
+        return;
+    }
 #if defined MACOSX && !HAVE_FEATURE_MACOSX_SANDBOX
     // On macOS when not sandboxed, soffice can restart itself via exec (see
     // restartOnMac in desktop/source/app/app.cxx), which leaves all file
diff --git a/sal/osl/unx/signal.cxx b/sal/osl/unx/signal.cxx
index 085f14d8ec0c..55d09b4f6249 100644
--- a/sal/osl/unx/signal.cxx
+++ b/sal/osl/unx/signal.cxx
@@ -23,6 +23,7 @@
 
 #include <config_features.h>
 
+#include "soffice.hxx"
 /* system headers */
 #include "system.hxx"
 
@@ -54,8 +55,6 @@
 
 #include <osl/diagnose.h>
 #include <osl/signal.h>
-#include <osl/process.h>
-#include <osl/thread.h>
 #include <sal/log.hxx>
 #include <sal/macros.h>
 #include <rtl/bootstrap.h>
@@ -155,41 +154,6 @@ bool bSetILLHandler = false;
 
 void signalHandlerFunction(int, siginfo_t *, void *);
 
-void getExecutableName_Impl (rtl_String ** ppstrProgName)
-{
-    rtl_uString* ustrProgFile = nullptr;
-    osl_getExecutableFile (&ustrProgFile);
-    if (ustrProgFile)
-    {
-        rtl_uString * ustrProgName = nullptr;
-        osl_systemPathGetFileNameOrLastDirectoryPart (ustrProgFile, &ustrProgName);
-        if (ustrProgName != nullptr)
-        {
-            rtl_uString2String (
-                ppstrProgName,
-                rtl_uString_getStr (ustrProgName), rtl_uString_getLength (ustrProgName),
-                osl_getThreadTextEncoding(),
-                OUSTRING_TO_OSTRING_CVTFLAGS);
-            rtl_uString_release (ustrProgName);
-        }
-        rtl_uString_release (ustrProgFile);
-    }
-}
-
-bool is_soffice_Impl()
-{
-    sal_Int32 idx = -1;
-    rtl_String* strProgName = nullptr;
-
-    getExecutableName_Impl (&strProgName);
-    if (strProgName)
-    {
-        idx = rtl_str_indexOfStr (rtl_string_getStr (strProgName), "soffice");
-        rtl_string_release (strProgName);
-    }
-    return (idx != -1);
-}
-
 #if HAVE_FEATURE_BREAKPAD
 bool is_unset_signal(int signal)
 {
@@ -208,7 +172,7 @@ bool is_unset_signal(int signal)
 
 bool onInitSignal()
 {
-    if (is_soffice_Impl())
+    if (sal::detail::isSoffice())
     {
         // WORKAROUND FOR SEGV HANDLER CONFLICT
         //
diff --git a/sal/osl/unx/soffice.cxx b/sal/osl/unx/soffice.cxx
new file mode 100644
index 000000000000..bcead388ba4c
--- /dev/null
+++ b/sal/osl/unx/soffice.cxx
@@ -0,0 +1,25 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <sal/config.h>
+
+#include <atomic>
+
+#include "soffice.hxx"
+
+namespace
+{
+std::atomic<bool> flag(false);
+}
+
+void sal::detail::setSoffice() { flag = true; }
+
+bool sal::detail::isSoffice() { return flag; }
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/sal/osl/unx/soffice.hxx b/sal/osl/unx/soffice.hxx
new file mode 100644
index 000000000000..da1b684af4ab
--- /dev/null
+++ b/sal/osl/unx/soffice.hxx
@@ -0,0 +1,26 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_SAL_OSL_UNX_SOFFICE_HXX
+#define INCLUDED_SAL_OSL_UNX_SOFFICE_HXX
+
+#include <sal/config.h>
+
+// Used to communicate special sal::detail::InitializeSoffice sal_detail_initialize call:
+
+namespace sal::detail
+{
+void setSoffice();
+
+bool isSoffice();
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/sal/osl/w32/salinit.cxx b/sal/osl/w32/salinit.cxx
index 77cb5da781e5..9b89cebc20ab 100644
--- a/sal/osl/w32/salinit.cxx
+++ b/sal/osl/w32/salinit.cxx
@@ -32,6 +32,10 @@ extern "C" {
 
 void sal_detail_initialize(int argc, char ** argv)
 {
+    if (argc == sal::detail::InitializeSoffice)
+    {
+        return;
+    }
     sal_initGlobalTimer();
 #ifndef _WIN64
     SetProcessDEPPolicy(PROCESS_DEP_ENABLE);


More information about the Libreoffice-commits mailing list