xserver: Branch 'master' - 8 commits

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Feb 6 23:42:48 UTC 2025


 dix/dixfonts.c                                      |    8 
 dix/getevents.c                                     |   10 -
 dix/ptrveloc.c                                      |    2 
 glx/glxdri2.c                                       |    2 
 hw/xfree86/common/xf86Init.c                        |   10 -
 hw/xfree86/drivers/inputtest/xf86-input-inputtest.c |    6 
 hw/xfree86/int10/xf86x86emu.c                       |    2 
 hw/xfree86/loader/loader.c                          |    2 
 hw/xfree86/loader/loadmod.c                         |    4 
 hw/xfree86/parser/configProcs.h                     |    2 
 hw/xfree86/parser/scan.c                            |    4 
 hw/xwayland/xwayland-screen.c                       |    2 
 hw/xwin/InitOutput.c                                |    3 
 hw/xwin/win.h                                       |    4 
 hw/xwin/winerror.c                                  |   17 -
 hw/xwin/winprocarg.c                                |    6 
 include/misc.h                                      |    8 
 include/os.h                                        |   22 --
 mi/mieq.c                                           |   18 -
 os/backtrace.c                                      |   65 +++---
 os/log.c                                            |  190 +++++---------------
 os/osdep.h                                          |    4 
 os/osinit.c                                         |   12 -
 test/signal-logging.c                               |   62 +++---
 24 files changed, 162 insertions(+), 303 deletions(-)

New commits:
commit f4eb217f1152c01a3319f76e9d5552b7a600514a
Author: Enrico Weigelt, metux IT consult <info at metux.net>
Date:   Fri Sep 13 13:02:47 2024 +0200

    os: log: replace VErrorF() by LogVMessageVerb()
    
    Since LogVMessageVerb() is now signal safe, we can use this one instead.
    Leaving VErrorF() macro for backwards compat with drivers.
    
    Signed-off-by: Enrico Weigelt, metux IT consult <info at metux.net>
    Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1691>

diff --git a/dix/dixfonts.c b/dix/dixfonts.c
index e67ad0f8d..dd617d99c 100644
--- a/dix/dixfonts.c
+++ b/dix/dixfonts.c
@@ -2026,12 +2026,18 @@ static uint32_t wrap_time_in_millis(void)
     return GetTimeInMillis();
 }
 
+static void verrorf(const char *f, va_list args) _X_ATTRIBUTE_PRINTF(1, 0);
+static void verrorf(const char *f, va_list args)
+{
+    LogVMessageVerb(X_NONE, -1, f, args);
+}
+
 static const xfont2_client_funcs_rec xfont2_client_funcs = {
     .version = XFONT2_CLIENT_FUNCS_VERSION,
     .client_auth_generation = _client_auth_generation,
     .client_signal = ClientSignal,
     .delete_font_client_id = delete_font_client_id,
-    .verrorf = VErrorF,
+    .verrorf = verrorf,
     .find_old_font = find_old_font,
     .get_client_resolutions = get_client_resolutions,
     .get_default_point_size = get_default_point_size,
diff --git a/hw/xfree86/int10/xf86x86emu.c b/hw/xfree86/int10/xf86x86emu.c
index 1dc695d2c..5a3a5484f 100644
--- a/hw/xfree86/int10/xf86x86emu.c
+++ b/hw/xfree86/int10/xf86x86emu.c
@@ -85,6 +85,6 @@ printk(const char *fmt, ...)
     va_list argptr;
 
     va_start(argptr, fmt);
-    VErrorF(fmt, argptr);
+    LogVMessageVerb(X_NONE, -1, fmt, argptr);
     va_end(argptr);
 }
diff --git a/hw/xfree86/parser/configProcs.h b/hw/xfree86/parser/configProcs.h
index 39399b7bc..93e3e6706 100644
--- a/hw/xfree86/parser/configProcs.h
+++ b/hw/xfree86/parser/configProcs.h
@@ -145,6 +145,4 @@ xf86freeExtensions(XF86ConfExtensionsPtr ptr);
 /* Externally provided functions */
 void
 ErrorF(const char *f, ...);
-void
-VErrorF(const char *f, va_list args);
 #endif
diff --git a/hw/xfree86/parser/scan.c b/hw/xfree86/parser/scan.c
index bf5a8d13b..3655eb777 100644
--- a/hw/xfree86/parser/scan.c
+++ b/hw/xfree86/parser/scan.c
@@ -974,7 +974,7 @@ xf86parseError(const char *format, ...)
     ErrorF("Parse error on line %d of section %s in file %s\n\t",
            configLineNo, configSection, filename);
     va_start(ap, format);
-    VErrorF(format, ap);
+    LogVMessageVerb(X_NONE, -1, format, ap);
     va_end(ap);
 
     ErrorF("\n");
@@ -989,7 +989,7 @@ xf86validationError(const char *format, ...)
 
     ErrorF("Data incomplete in file %s\n\t", filename);
     va_start(ap, format);
-    VErrorF(format, ap);
+    LogVMessageVerb(X_NONE, -1, format, ap);
     va_end(ap);
 
     ErrorF("\n");
diff --git a/hw/xwayland/xwayland-screen.c b/hw/xwayland/xwayland-screen.c
index 8435410c2..8b5b7c38e 100644
--- a/hw/xwayland/xwayland-screen.c
+++ b/hw/xwayland/xwayland-screen.c
@@ -89,7 +89,7 @@ xwl_give_up(const char *f, ...)
     va_list args;
 
     va_start(args, f);
-    VErrorF(f, args);
+    LogVMessageVerb(X_NONE, -1, f, args);
     va_end(args);
 
     CloseWellKnownConnections();
diff --git a/include/os.h b/include/os.h
index 3304c15d1..e26664d9a 100644
--- a/include/os.h
+++ b/include/os.h
@@ -388,9 +388,6 @@ _X_ATTRIBUTE_PRINTF(1, 2)
 #define DebugF(...)             /* */
 #endif
 
-extern _X_EXPORT void
-VErrorF(const char *f, va_list args)
-_X_ATTRIBUTE_PRINTF(1, 0);
 extern _X_EXPORT void
 ErrorF(const char *f, ...)
 _X_ATTRIBUTE_PRINTF(1, 2);
@@ -411,5 +408,6 @@ typedef _sigset_t sigset_t;
 #define LogMessageVerbSigSafe(...) LogMessageVerb(__VA_ARGS__)
 #define ErrorFSigSafe(...) ErrorF(__VA_ARGS__)
 #define VErrorFSigSafe(...) VErrorF(__VA_ARGS__)
+#define VErrorF(...) LogVMessageVerb(X_NONE, -1, __VA_ARGS__)
 
 #endif                          /* OS_H */
diff --git a/os/log.c b/os/log.c
index 6ce2ec04c..fe0c94560 100644
--- a/os/log.c
+++ b/os/log.c
@@ -892,7 +892,7 @@ FatalError(const char *f, ...)
         va_end(apple_args);
     }
 #endif
-    VErrorF(f, args);
+    LogVMessageVerb(X_NONE, -1, f, args);
     va_end(args);
     ErrorF("\n");
     if (!beenhere)
@@ -906,19 +906,13 @@ FatalError(const char *f, ...)
         OsAbort();
  /*NOTREACHED*/}
 
-void
-VErrorF(const char *f, va_list args)
-{
-    LogVMessageVerb(X_NONE, -1, f, args);
-}
-
 void
 ErrorF(const char *f, ...)
 {
     va_list args;
 
     va_start(args, f);
-    VErrorF(f, args);
+    LogVMessageVerb(X_NONE, -1, f, args);
     va_end(args);
 }
 
commit 9652bc73e2f655487bc9823719014e024a28f226
Author: Enrico Weigelt, metux IT consult <info at metux.net>
Date:   Fri Sep 13 12:02:58 2024 +0200

    xwin: drop duplicate OsVendorVErrorF()
    
    It really doesn't seem to be necessary to protect a LogVMessageVerb()
    call by extra mutex on windows only, while obviously not needed on
    any other platform.
    
    Signed-off-by: Enrico Weigelt, metux IT consult <info at metux.net>
    Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1691>

diff --git a/hw/xwin/InitOutput.c b/hw/xwin/InitOutput.c
index 541503552..a8a8cac24 100644
--- a/hw/xwin/InitOutput.c
+++ b/hw/xwin/InitOutput.c
@@ -633,9 +633,6 @@ OsVendorInit(void)
 
     winFixupPaths();
 
-    if (!OsVendorVErrorFProc)
-        OsVendorVErrorFProc = OsVendorVErrorF;
-
     if (!g_fLogInited) {
         /* keep this order. If LogInit fails it calls Abort which then calls
          * ddxGiveUp where LogInit is called again and creates an infinite
diff --git a/hw/xwin/win.h b/hw/xwin/win.h
index 49a2031d3..44736a08b 100644
--- a/hw/xwin/win.h
+++ b/hw/xwin/win.h
@@ -742,10 +742,6 @@ void
  * winerror.c
  */
 
-void
-OsVendorVErrorF(const char *pszFormat, va_list va_args)
-_X_ATTRIBUTE_PRINTF(1, 0);
-
 void
 winMessageBoxF(const char *pszError, UINT uType, ...)
 _X_ATTRIBUTE_PRINTF(1, 3);
diff --git a/hw/xwin/winerror.c b/hw/xwin/winerror.c
index bdf03f053..401481327 100644
--- a/hw/xwin/winerror.c
+++ b/hw/xwin/winerror.c
@@ -39,23 +39,6 @@
 
 #include "dix/input_priv.h"
 
-void
-OsVendorVErrorF(const char *pszFormat, va_list va_args)
-{
-    /* make sure the clipboard and multiwindow threads do not interfere the
-     * main thread */
-    static pthread_mutex_t s_pmPrinting = PTHREAD_MUTEX_INITIALIZER;
-
-    /* Lock the printing mutex */
-    pthread_mutex_lock(&s_pmPrinting);
-
-    /* Print the error message to a log file, could be stderr */
-    LogVMessageVerb(X_NONE, 0, pszFormat, va_args);
-
-    /* Unlock the printing mutex */
-    pthread_mutex_unlock(&s_pmPrinting);
-}
-
 /*
  * os/log.c:FatalError () calls our vendor ErrorF, so the message
  * from a FatalError will be logged.
diff --git a/hw/xwin/winprocarg.c b/hw/xwin/winprocarg.c
index 4f753982f..d87c40936 100644
--- a/hw/xwin/winprocarg.c
+++ b/hw/xwin/winprocarg.c
@@ -225,12 +225,6 @@ ddxProcessArgument(int argc, char *argv[], int i)
 
     /* Initialize once */
     if (!s_fBeenHere) {
-        /*
-         * This initialises our hook into VErrorF () for catching log messages
-         * that are generated before OsInit () is called.
-         */
-        OsVendorVErrorFProc = OsVendorVErrorF;
-
         s_fBeenHere = TRUE;
 
         /* Initialize only if option is not -help */
diff --git a/os/log.c b/os/log.c
index 131bd7239..6ce2ec04c 100644
--- a/os/log.c
+++ b/os/log.c
@@ -105,8 +105,6 @@ OR PERFORMANCE OF THIS SOFTWARE.
 #pragma clang diagnostic ignored "-Wformat-nonliteral"
 #endif
 
-void (*OsVendorVErrorFProc) (const char *, va_list args) = NULL;
-
 /* Default logging parameters. */
 #define DEFAULT_LOG_VERBOSITY		0
 #define DEFAULT_LOG_FILE_VERBOSITY	3
@@ -911,10 +909,7 @@ FatalError(const char *f, ...)
 void
 VErrorF(const char *f, va_list args)
 {
-    if (OsVendorVErrorFProc)
-        OsVendorVErrorFProc(f, args);
-    else
-        LogVMessageVerb(X_NONE, -1, f, args);
+    LogVMessageVerb(X_NONE, -1, f, args);
 }
 
 void
diff --git a/os/osdep.h b/os/osdep.h
index 8d2f0678e..3319ee188 100644
--- a/os/osdep.h
+++ b/os/osdep.h
@@ -176,10 +176,6 @@ int os_move_fd(int fd);
    depending on whether multithreading is used */
 int xthread_sigmask(int how, const sigset_t *set, sigset_t *oldest);
 
-/* callback for DDX specific error printing, if any (may be NULL) */
-extern void (*OsVendorVErrorFProc) (const char *, va_list args)
-    _X_ATTRIBUTE_PRINTF(1, 0);
-
 typedef void (*OsSigHandlerPtr) (int sig);
 
 /* install signal handler */
commit da22bc9ae07dc358ec3a01d0bc8b312e7ea5c3b6
Author: Enrico Weigelt, metux IT consult <info at metux.net>
Date:   Thu Sep 12 17:39:33 2024 +0200

    os: log: replace VErrorFSigSafe() by VErrorF()
    
    Since VErrorF() is now signal safe, we can use this one instead.
    Leaving VErrorFSigSafe() macro for backwards compat with drivers.
    
    Signed-off-by: Enrico Weigelt, metux IT consult <info at metux.net>
    Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1691>

diff --git a/hw/xwayland/xwayland-screen.c b/hw/xwayland/xwayland-screen.c
index 764176df5..8435410c2 100644
--- a/hw/xwayland/xwayland-screen.c
+++ b/hw/xwayland/xwayland-screen.c
@@ -89,7 +89,7 @@ xwl_give_up(const char *f, ...)
     va_list args;
 
     va_start(args, f);
-    VErrorFSigSafe(f, args);
+    VErrorF(f, args);
     va_end(args);
 
     CloseWellKnownConnections();
diff --git a/include/os.h b/include/os.h
index 02edbdaf8..3304c15d1 100644
--- a/include/os.h
+++ b/include/os.h
@@ -395,9 +395,6 @@ extern _X_EXPORT void
 ErrorF(const char *f, ...)
 _X_ATTRIBUTE_PRINTF(1, 2);
 extern _X_EXPORT void
-VErrorFSigSafe(const char *f, va_list args)
-_X_ATTRIBUTE_PRINTF(1, 0);
-extern _X_EXPORT void
 LogPrintMarkers(void);
 
 extern _X_EXPORT void
@@ -413,5 +410,6 @@ typedef _sigset_t sigset_t;
 #define LogVMessageVerbSigSafe(...) LogVMessageVerb(__VA_ARGS__)
 #define LogMessageVerbSigSafe(...) LogMessageVerb(__VA_ARGS__)
 #define ErrorFSigSafe(...) ErrorF(__VA_ARGS__)
+#define VErrorFSigSafe(...) VErrorF(__VA_ARGS__)
 
 #endif                          /* OS_H */
diff --git a/os/log.c b/os/log.c
index 22af59534..131bd7239 100644
--- a/os/log.c
+++ b/os/log.c
@@ -894,7 +894,7 @@ FatalError(const char *f, ...)
         va_end(apple_args);
     }
 #endif
-    VErrorFSigSafe(f, args);
+    VErrorF(f, args);
     va_end(args);
     ErrorF("\n");
     if (!beenhere)
@@ -927,12 +927,6 @@ ErrorF(const char *f, ...)
     va_end(args);
 }
 
-void
-VErrorFSigSafe(const char *f, va_list args)
-{
-    LogVMessageVerb(X_ERROR, -1, f, args);
-}
-
 void
 LogPrintMarkers(void)
 {
commit 2d18c353b450da370b9adb53fd96923a26627860
Author: Enrico Weigelt, metux IT consult <info at metux.net>
Date:   Thu Sep 12 17:31:00 2024 +0200

    os: log: replace ErrorFSigSafe() by ErrorF()
    
    Since ErrorF() is now signal safe, we can use this one instead.
    Leaving ErrorFSigSafe() macro for backwards compat with drivers.
    
    Signed-off-by: Enrico Weigelt, metux IT consult <info at metux.net>
    Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1691>

diff --git a/dix/getevents.c b/dix/getevents.c
index b036ff2e4..18a78fac5 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -1965,8 +1965,8 @@ GetTouchEvents(InternalEvent *events, DeviceIntPtr dev, uint32_t ddx_touchid,
 
     ti = TouchFindByDDXID(dev, ddx_touchid, (type == XI_TouchBegin));
     if (!ti) {
-        ErrorFSigSafe("[dix] %s: unable to %s touch point %u\n", dev->name,
-                      type == XI_TouchBegin ? "begin" : "find", ddx_touchid);
+        ErrorF("[dix] %s: unable to %s touch point %u\n", dev->name,
+               type == XI_TouchBegin ? "begin" : "find", ddx_touchid);
         return 0;
     }
     client_id = ti->client_id;
@@ -1999,16 +1999,14 @@ GetTouchEvents(InternalEvent *events, DeviceIntPtr dev, uint32_t ddx_touchid,
         if (!mask_in ||
             !valuator_mask_isset(mask_in, 0) ||
             !valuator_mask_isset(mask_in, 1)) {
-            ErrorFSigSafe("%s: Attempted to start touch without x/y "
-                          "(driver bug)\n", dev->name);
+            ErrorF("%s: Attempted to start touch without x/y (driver bug)\n", dev->name);
             return 0;
         }
         break;
     case XI_TouchUpdate:
         event->type = ET_TouchUpdate;
         if (!mask_in || valuator_mask_num_valuators(mask_in) <= 0) {
-            ErrorFSigSafe("%s: TouchUpdate with no valuators? Driver bug\n",
-                          dev->name);
+            ErrorF("%s: TouchUpdate with no valuators? Driver bug\n", dev->name);
         }
         break;
     case XI_TouchEnd:
diff --git a/dix/ptrveloc.c b/dix/ptrveloc.c
index 192c0f5bb..63fe07b10 100644
--- a/dix/ptrveloc.c
+++ b/dix/ptrveloc.c
@@ -78,7 +78,7 @@ DeletePredictableAccelerationProperties(DeviceIntPtr,
 /*#define PTRACCEL_DEBUGGING*/
 
 #ifdef PTRACCEL_DEBUGGING
-#define DebugAccelF(...) ErrorFSigSafe("dix/ptraccel: " __VA_ARGS__)
+#define DebugAccelF(...) ErrorF("dix/ptraccel: " __VA_ARGS__)
 #else
 #define DebugAccelF(...)        /* */
 #endif
diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index a21afe04b..92004dd79 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -857,12 +857,12 @@ ddxGiveUp(enum ExitCode error)
 void
 OsVendorFatalError(const char *f, va_list args)
 {
-    ErrorFSigSafe("\nPlease consult the " XVENDORNAME " support \n\t at "
-                 __VENDORDWEBSUPPORT__ "\n for help. \n");
+    ErrorF("\nPlease consult the " XVENDORNAME " support \n\t at "
+           __VENDORDWEBSUPPORT__ "\n for help. \n");
     if (xf86LogFile && xf86LogFileWasOpened)
-        ErrorFSigSafe("Please also check the log file at \"%s\" for additional "
-                     "information.\n", xf86LogFile);
-    ErrorFSigSafe("\n");
+        ErrorF("Please also check the log file at \"%s\" for additional "
+               "information.\n", xf86LogFile);
+    ErrorF("\n");
 }
 
 void
diff --git a/include/misc.h b/include/misc.h
index 7cc05c4f6..615da815d 100644
--- a/include/misc.h
+++ b/include/misc.h
@@ -413,10 +413,10 @@ extern _X_EXPORT unsigned long serverGeneration;
 /* Don't use this directly, use BUG_WARN or BUG_WARN_MSG instead */
 #define __BUG_WARN_MSG(cond, with_msg, ...)                                \
           do { if (cond) {                                                \
-              ErrorFSigSafe("BUG: triggered 'if (" #cond ")'\n");          \
-              ErrorFSigSafe("BUG: %s:%u in %s()\n",                        \
-                           __FILE__, __LINE__, __func__);                 \
-              if (with_msg) ErrorFSigSafe(__VA_ARGS__);                    \
+              ErrorF("BUG: triggered 'if (" #cond ")'\n");          \
+              ErrorF("BUG: %s:%u in %s()\n",                        \
+                     __FILE__, __LINE__, __func__);                 \
+              if (with_msg) ErrorF(__VA_ARGS__);                    \
               xorg_backtrace();                                           \
           } } while(0)
 
diff --git a/include/os.h b/include/os.h
index d93bf7c40..02edbdaf8 100644
--- a/include/os.h
+++ b/include/os.h
@@ -398,9 +398,6 @@ extern _X_EXPORT void
 VErrorFSigSafe(const char *f, va_list args)
 _X_ATTRIBUTE_PRINTF(1, 0);
 extern _X_EXPORT void
-ErrorFSigSafe(const char *f, ...)
-_X_ATTRIBUTE_PRINTF(1, 2);
-extern _X_EXPORT void
 LogPrintMarkers(void);
 
 extern _X_EXPORT void
@@ -415,5 +412,6 @@ typedef _sigset_t sigset_t;
 /* should not be used anymore, just for backwards compat with drivers */
 #define LogVMessageVerbSigSafe(...) LogVMessageVerb(__VA_ARGS__)
 #define LogMessageVerbSigSafe(...) LogMessageVerb(__VA_ARGS__)
+#define ErrorFSigSafe(...) ErrorF(__VA_ARGS__)
 
 #endif                          /* OS_H */
diff --git a/mi/mieq.c b/mi/mieq.c
index 852732b98..6d9e3eb87 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -227,22 +227,22 @@ mieqEnqueue(DeviceIntPtr pDev, InternalEvent *e)
              */
             miEventQueue.dropped++;
             if (miEventQueue.dropped == 1) {
-                ErrorFSigSafe("[mi] EQ overflowing.  Additional events will be "
-                              "discarded until existing events are processed.\n");
+                ErrorF("[mi] EQ overflowing.  Additional events will be "
+                       "discarded until existing events are processed.\n");
                 xorg_backtrace();
-                ErrorFSigSafe("[mi] These backtraces from mieqEnqueue may point to "
-                              "a culprit higher up the stack.\n");
-                ErrorFSigSafe("[mi] mieq is *NOT* the cause.  It is a victim.\n");
+                ErrorF("[mi] These backtraces from mieqEnqueue may point to "
+                       "a culprit higher up the stack.\n");
+                ErrorF("[mi] mieq is *NOT* the cause.  It is a victim.\n");
             }
             else if (miEventQueue.dropped % QUEUE_DROP_BACKTRACE_FREQUENCY == 0 &&
                      miEventQueue.dropped / QUEUE_DROP_BACKTRACE_FREQUENCY <=
                      QUEUE_DROP_BACKTRACE_MAX) {
-                ErrorFSigSafe("[mi] EQ overflow continuing.  %zu events have been "
-                              "dropped.\n", miEventQueue.dropped);
+                ErrorF("[mi] EQ overflow continuing.  %zu events have been "
+                       "dropped.\n", miEventQueue.dropped);
                 if (miEventQueue.dropped / QUEUE_DROP_BACKTRACE_FREQUENCY ==
                     QUEUE_DROP_BACKTRACE_MAX) {
-                    ErrorFSigSafe("[mi] No further overflow reports will be "
-                                  "reported until the clog is cleared.\n");
+                    ErrorF("[mi] No further overflow reports will be "
+                           "reported until the clog is cleared.\n");
                 }
                 xorg_backtrace();
             }
diff --git a/os/backtrace.c b/os/backtrace.c
index 767f909b7..421d9fae4 100644
--- a/os/backtrace.c
+++ b/os/backtrace.c
@@ -82,21 +82,21 @@ print_registers(int frame, unw_cursor_t cursor)
     frame++;
     ret = unw_step(&cursor);
     if (ret < 0) {
-        ErrorFSigSafe("unw_step failed: %s [%d]\n", unw_strerror(ret), ret);
+        ErrorF("unw_step failed: %s [%d]\n", unw_strerror(ret), ret);
         return;
     }
 
-    ErrorFSigSafe("\n");
-    ErrorFSigSafe("Registers at frame #%d:\n", frame);
+    ErrorF("\n");
+    ErrorF("Registers at frame #%d:\n", frame);
 
     for (i = 0; i < num_regs; i++) {
         uint64_t val;
         ret = unw_get_reg(&cursor, regs[i].regnum, &val);
         if (ret < 0) {
-            ErrorFSigSafe("unw_get_reg(%s) failed: %s [%d]\n",
+            ErrorF("unw_get_reg(%s) failed: %s [%d]\n",
                           regs[i].name, unw_strerror(ret), ret);
         } else {
-            ErrorFSigSafe("  %s: 0x%" PRIx64 "\n", regs[i].name, val);
+            ErrorF("  %s: 0x%" PRIx64 "\n", regs[i].name, val);
         }
     }
 }
@@ -117,26 +117,23 @@ xorg_backtrace(void)
     pip.unwind_info = NULL;
     ret = unw_getcontext(&context);
     if (ret) {
-        ErrorFSigSafe("unw_getcontext failed: %s [%d]\n", unw_strerror(ret),
-                ret);
+        ErrorF("unw_getcontext failed: %s [%d]\n", unw_strerror(ret), ret);
         return;
     }
 
     ret = unw_init_local(&cursor, &context);
     if (ret) {
-        ErrorFSigSafe("unw_init_local failed: %s [%d]\n", unw_strerror(ret),
-                ret);
+        ErrorF("unw_init_local failed: %s [%d]\n", unw_strerror(ret), ret);
         return;
     }
 
-    ErrorFSigSafe("\n");
-    ErrorFSigSafe("Backtrace:\n");
+    ErrorF("\n");
+    ErrorF("Backtrace:\n");
     ret = unw_step(&cursor);
     while (ret > 0) {
         ret = unw_get_proc_info(&cursor, &pip);
         if (ret) {
-            ErrorFSigSafe("unw_get_proc_info failed: %s [%d]\n",
-                    unw_strerror(ret), ret);
+            ErrorF("unw_get_proc_info failed: %s [%d]\n", unw_strerror(ret), ret);
             break;
         }
 
@@ -144,8 +141,7 @@ xorg_backtrace(void)
         ret = unw_get_proc_name(&cursor, procname, 256, &off);
         if (ret && ret != -UNW_ENOMEM) {
             if (ret != -UNW_EUNSPEC)
-                ErrorFSigSafe("unw_get_proc_name failed: %s [%d]\n",
-                        unw_strerror(ret), ret);
+                ErrorF("unw_get_proc_name failed: %s [%d]\n", unw_strerror(ret), ret);
             procname[0] = '?';
             procname[1] = 0;
         }
@@ -163,22 +159,22 @@ xorg_backtrace(void)
             signal_cursor = cursor;
             signal_frame = i;
 
-            ErrorFSigSafe("%u: <signal handler called>\n", i++);
+            ErrorF("%u: <signal handler called>\n", i++);
         } else {
-            ErrorFSigSafe("%u: %s (%s%s+0x%x) [%p]\n", i++, filename, procname,
-                ret == -UNW_ENOMEM ? "..." : "", (int)off,
+            ErrorF("%u: %s (%s%s+0x%x) [%p]\n", i++, filename, procname,
+                   ret == -UNW_ENOMEM ? "..." : "", (int)off,
                 (void *)(uintptr_t)(ip));
         }
 
         ret = unw_step(&cursor);
         if (ret < 0)
-            ErrorFSigSafe("unw_step failed: %s [%d]\n", unw_strerror(ret), ret);
+            ErrorF("unw_step failed: %s [%d]\n", unw_strerror(ret), ret);
     }
 
     if (signal_frame >= 0)
         print_registers(signal_frame, signal_cursor);
 
-    ErrorFSigSafe("\n");
+    ErrorF("\n");
 }
 #else /* HAVE_LIBUNWIND */
 #ifdef HAVE_BACKTRACE
@@ -197,19 +193,19 @@ xorg_backtrace(void)
     int size, i;
     Dl_info info;
 
-    ErrorFSigSafe("\n");
-    ErrorFSigSafe("Backtrace:\n");
+    ErrorF("\n");
+    ErrorF("Backtrace:\n");
     size = backtrace(array, BT_SIZE);
     for (i = 0; i < size; i++) {
         int rc = dladdr(array[i], &info);
 
         if (rc == 0) {
-            ErrorFSigSafe("%u: ?? [%p]\n", i, array[i]);
+            ErrorF("%u: ?? [%p]\n", i, array[i]);
             continue;
         }
         mod = (info.dli_fname && *info.dli_fname) ? info.dli_fname : "(vdso)";
         if (info.dli_saddr)
-            ErrorFSigSafe(
+            ErrorF(
                 "%u: %s (%s+0x%x) [%p]\n",
                 i,
                 mod,
@@ -218,7 +214,7 @@ xorg_backtrace(void)
                                (char *) info.dli_saddr),
                 array[i]);
         else
-            ErrorFSigSafe(
+            ErrorF(
                 "%u: %s (%p+0x%x) [%p]\n",
                 i,
                 mod,
@@ -227,7 +223,7 @@ xorg_backtrace(void)
                                (char *) info.dli_fbase),
                 array[i]);
     }
-    ErrorFSigSafe("\n");
+    ErrorF("\n");
 }
 
 #else                           /* not glibc or glibc < 2.1 */
@@ -265,7 +261,7 @@ xorg_backtrace_frame(uintptr_t pc, int signo, void *arg)
             strcpy(signame, "unknown");
         }
 
-        ErrorFSigSafe("** Signal %u (%s)\n", signo, signame);
+        ErrorF("** Signal %u (%s)\n", signo, signame);
     }
 
     snprintf(header, sizeof(header), "%d: 0x%lx", depth, pc);
@@ -283,8 +279,7 @@ xorg_backtrace_frame(uintptr_t pc, int signo, void *arg)
             symname = "<section start>";
             offset = pc - (uintptr_t) dlinfo.dli_fbase;
         }
-        ErrorFSigSafe("%s: %s:%s+0x%x\n", header, dlinfo.dli_fname, symname,
-                     offset);
+        ErrorF("%s: %s:%s+0x%x\n", header, dlinfo.dli_fname, symname, offset);
 
     }
     else {
@@ -292,7 +287,7 @@ xorg_backtrace_frame(uintptr_t pc, int signo, void *arg)
          * probably poke elfloader here, but haven't written that code yet,
          * so we just print the pc.
          */
-        ErrorFSigSafe("%s\n", header);
+        ErrorF("%s\n", header);
     }
 
     return 0;
@@ -346,7 +341,7 @@ xorg_backtrace_pstack(void)
 
             if (bytesread > 0) {
                 btline[bytesread] = 0;
-                ErrorFSigSafe("%s", btline);
+                ErrorF("%s", btline);
             }
             else if ((bytesread < 0) || ((errno != EINTR) && (errno != EAGAIN)))
                 done = 1;
@@ -366,8 +361,8 @@ void
 xorg_backtrace(void)
 {
 
-    ErrorFSigSafe("\n");
-    ErrorFSigSafe("Backtrace:\n");
+    ErrorF("\n");
+    ErrorF("Backtrace:\n");
 
 #ifdef HAVE_PSTACK
 /* First try fork/exec of pstack - otherwise fall back to walkcontext
@@ -384,9 +379,9 @@ xorg_backtrace(void)
             walkcontext(&u, xorg_backtrace_frame, &depth);
         else
 #endif
-            ErrorFSigSafe("Failed to get backtrace info: %s\n", strerror(errno));
+            ErrorF("Failed to get backtrace info: %s\n", strerror(errno));
     }
-    ErrorFSigSafe("\n");
+    ErrorF("\n");
 }
 
 #else
diff --git a/os/log.c b/os/log.c
index ec3dac925..22af59534 100644
--- a/os/log.c
+++ b/os/log.c
@@ -875,9 +875,9 @@ FatalError(const char *f, ...)
     static Bool beenhere = FALSE;
 
     if (beenhere)
-        ErrorFSigSafe("\nFatalError re-entered, aborting\n");
+        ErrorF("\nFatalError re-entered, aborting\n");
     else
-        ErrorFSigSafe("\nFatal server error:\n");
+        ErrorF("\nFatal server error:\n");
 
     va_start(args, f);
 
@@ -896,7 +896,7 @@ FatalError(const char *f, ...)
 #endif
     VErrorFSigSafe(f, args);
     va_end(args);
-    ErrorFSigSafe("\n");
+    ErrorF("\n");
     if (!beenhere)
         OsVendorFatalError(f, args2);
     va_end(args2);
@@ -933,16 +933,6 @@ VErrorFSigSafe(const char *f, va_list args)
     LogVMessageVerb(X_ERROR, -1, f, args);
 }
 
-void
-ErrorFSigSafe(const char *f, ...)
-{
-    va_list args;
-
-    va_start(args, f);
-    VErrorFSigSafe(f, args);
-    va_end(args);
-}
-
 void
 LogPrintMarkers(void)
 {
diff --git a/os/osinit.c b/os/osinit.c
index f95490b13..71c943a38 100644
--- a/os/osinit.c
+++ b/os/osinit.c
@@ -136,8 +136,8 @@ OsSigHandler(int signo)
 
 #ifdef SA_SIGINFO
     if (sip->si_code == SI_USER) {
-        ErrorFSigSafe("Received signal %u sent by process %u, uid %u\n", signo,
-                     sip->si_pid, sip->si_uid);
+        ErrorF("Received signal %u sent by process %u, uid %u\n", signo,
+               sip->si_pid, sip->si_uid);
     }
     else {
         switch (signo) {
@@ -145,7 +145,7 @@ OsSigHandler(int signo)
         case SIGBUS:
         case SIGILL:
         case SIGFPE:
-            ErrorFSigSafe("%s at address %p\n", strsignal(signo), sip->si_addr);
+            ErrorF("%s at address %p\n", strsignal(signo), sip->si_addr);
         }
     }
 #endif
commit dd37cc4855f4b53aa35059dadac85a2b3173e796
Author: Enrico Weigelt, metux IT consult <info at metux.net>
Date:   Thu Sep 12 17:14:05 2024 +0200

    os: log: replace LogMessageVerbSigSafe() by LogMessageVerb()
    
    Since LogMessageVerb() is now signal safe, we can use this one instead.
    Leaving LogMessageVerbSigSafe() macro for backwards compat with drivers.
    
    Signed-off-by: Enrico Weigelt, metux IT consult <info at metux.net>
    Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1691>

diff --git a/glx/glxdri2.c b/glx/glxdri2.c
index c4e02b7b7..4c5bc8446 100644
--- a/glx/glxdri2.c
+++ b/glx/glxdri2.c
@@ -805,7 +805,7 @@ glxDRILeaveVT(ScrnInfoPtr scrn)
     __GLXDRIscreen *screen = (__GLXDRIscreen *)
         glxGetScreen(xf86ScrnToScreen(scrn));
 
-    LogMessageVerbSigSafe(X_INFO, -1, "AIGLX: Suspending AIGLX clients for VT switch\n");
+    LogMessageVerb(X_INFO, -1, "AIGLX: Suspending AIGLX clients for VT switch\n");
 
     glxSuspendClients();
 
diff --git a/hw/xfree86/drivers/inputtest/xf86-input-inputtest.c b/hw/xfree86/drivers/inputtest/xf86-input-inputtest.c
index 76ba62e44..8feca9428 100644
--- a/hw/xfree86/drivers/inputtest/xf86-input-inputtest.c
+++ b/hw/xfree86/drivers/inputtest/xf86-input-inputtest.c
@@ -126,9 +126,9 @@ notify_sync_finished(ClientPtr ptr, void *closure)
         already shut down and the descriptor is closed.
     */
     if (write(fd, &response, response.header.length) != response.header.length) {
-        LogMessageVerbSigSafe(X_ERROR, 0,
-                              "inputtest: Failed to write sync response: %s\n",
-                              strerror(errno));
+        LogMessageVerb(X_ERROR, 0,
+                       "inputtest: Failed to write sync response: %s\n",
+                       strerror(errno));
     }
     input_unlock();
     return TRUE;
diff --git a/hw/xfree86/loader/loader.c b/hw/xfree86/loader/loader.c
index cd3493166..61fe04060 100644
--- a/hw/xfree86/loader/loader.c
+++ b/hw/xfree86/loader/loader.c
@@ -141,7 +141,7 @@ LoaderSymbolFromModule(void *handle, const char *name)
 void
 LoaderUnload(const char *name, void *handle)
 {
-    LogMessageVerbSigSafe(X_INFO, 1, "Unloading %s\n", name);
+    LogMessageVerb(X_INFO, 1, "Unloading %s\n", name);
     if (handle)
         dlclose(handle);
 }
diff --git a/hw/xfree86/loader/loadmod.c b/hw/xfree86/loader/loadmod.c
index 39763453c..2edc14ac7 100644
--- a/hw/xfree86/loader/loadmod.c
+++ b/hw/xfree86/loader/loadmod.c
@@ -853,9 +853,9 @@ UnloadModule(ModuleDescPtr mod)
         const char *name = mod->VersionInfo->modname;
 
         if (mod->parent)
-            LogMessageVerbSigSafe(X_INFO, 3, "UnloadSubModule: \"%s\"\n", name);
+            LogMessageVerb(X_INFO, 3, "UnloadSubModule: \"%s\"\n", name);
         else
-            LogMessageVerbSigSafe(X_INFO, 3, "UnloadModule: \"%s\"\n", name);
+            LogMessageVerb(X_INFO, 3, "UnloadModule: \"%s\"\n", name);
 
         if (mod->TearDownData != ModuleDuplicated) {
             if ((mod->TearDownProc) && (mod->TearDownData))
diff --git a/include/os.h b/include/os.h
index 3bc9ee03b..d93bf7c40 100644
--- a/include/os.h
+++ b/include/os.h
@@ -363,9 +363,6 @@ _X_ATTRIBUTE_PRINTF(3, 4);
 extern _X_EXPORT void
 LogMessage(MessageType type, const char *format, ...)
 _X_ATTRIBUTE_PRINTF(2, 3);
-extern _X_EXPORT void
-LogMessageVerbSigSafe(MessageType type, int verb, const char *format, ...)
-_X_ATTRIBUTE_PRINTF(3, 4);
 
 extern _X_EXPORT void
 LogVHdrMessageVerb(MessageType type, int verb,
@@ -417,5 +414,6 @@ typedef _sigset_t sigset_t;
 
 /* should not be used anymore, just for backwards compat with drivers */
 #define LogVMessageVerbSigSafe(...) LogVMessageVerb(__VA_ARGS__)
+#define LogMessageVerbSigSafe(...) LogMessageVerb(__VA_ARGS__)
 
 #endif                          /* OS_H */
diff --git a/os/log.c b/os/log.c
index 817db20ff..ec3dac925 100644
--- a/os/log.c
+++ b/os/log.c
@@ -302,7 +302,7 @@ LogClose(enum ExitCode error)
 {
     if (logFile) {
         int msgtype = (error == EXIT_NO_ERROR) ? X_INFO : X_ERROR;
-        LogMessageVerbSigSafe(msgtype, -1,
+        LogMessageVerb(msgtype, -1,
                 "Server terminated %s (%d). Closing log file.\n",
                 (error == EXIT_NO_ERROR) ? "successfully" : "with error",
                 error);
@@ -694,7 +694,7 @@ LogVMessageVerb(MessageType type, int verb, const char *format, va_list args)
     writeLog(verb, buf, len);
 }
 
-/* Log message with verbosity level specified. */
+/* Log message with verbosity level specified. -- signal safe */
 void
 LogMessageVerb(MessageType type, int verb, const char *format, ...)
 {
@@ -716,16 +716,6 @@ LogMessage(MessageType type, const char *format, ...)
     va_end(ap);
 }
 
-/* Log a message using only signal safe functions. */
-void
-LogMessageVerbSigSafe(MessageType type, int verb, const char *format, ...)
-{
-    va_list ap;
-    va_start(ap, format);
-    LogVMessageVerb(type, verb, format, ap);
-    va_end(ap);
-}
-
 void
 LogVHdrMessageVerb(MessageType type, int verb, const char *msg_format,
                    va_list msg_args, const char *hdr_format, va_list hdr_args)
diff --git a/os/osinit.c b/os/osinit.c
index 6e1d822e2..f95490b13 100644
--- a/os/osinit.c
+++ b/os/osinit.c
@@ -119,10 +119,8 @@ OsSigHandler(int signo)
     if (signo == SIGNAL_FOR_RTLD_ERROR) {
         const char *dlerr = dlerror();
 
-        if (dlerr) {
-            LogMessageVerbSigSafe(X_ERROR, 1,
-                                  "Dynamic loader error: %s\n", dlerr);
-        }
+        if (dlerr)
+            LogMessageVerb(X_ERROR, 1, "Dynamic loader error: %s\n", dlerr);
     }
 #endif                          /* RTLD_DI_SETSIGNAL */
 
diff --git a/test/signal-logging.c b/test/signal-logging.c
index db8efa852..22a01631c 100644
--- a/test/signal-logging.c
+++ b/test/signal-logging.c
@@ -202,59 +202,59 @@ static void logging_format(void)
     } while (0)
 
     /* boring test message */
-    LogMessageVerbSigSafe(X_ERROR, 1, "test message\n");
+    LogMessageVerb(X_ERROR, 1, "test message\n");
     read_log_msg(logmsg);
     assert(strcmp(logmsg, "(EE) test message\n") == 0);
 
     /* long buf is truncated to "....en\n" */
-    LogMessageVerbSigSafe(X_ERROR, 1, buf);
+    LogMessageVerb(X_ERROR, 1, buf);
     read_log_msg(logmsg);
     assert(strcmp(&logmsg[strlen(logmsg) - 3], "en\n") == 0);
 
     /* same thing, this time as string substitution */
-    LogMessageVerbSigSafe(X_ERROR, 1, "%s", buf);
+    LogMessageVerb(X_ERROR, 1, "%s", buf);
     read_log_msg(logmsg);
     assert(strcmp(&logmsg[strlen(logmsg) - 3], "en\n") == 0);
 
     /* strings containing placeholders should just work */
-    LogMessageVerbSigSafe(X_ERROR, 1, "%s\n", str);
+    LogMessageVerb(X_ERROR, 1, "%s\n", str);
     read_log_msg(logmsg);
     assert(strcmp(logmsg, "(EE) %s %d %u %% %p %i\n") == 0);
 
     /* literal % */
-    LogMessageVerbSigSafe(X_ERROR, 1, "test %%\n");
+    LogMessageVerb(X_ERROR, 1, "test %%\n");
     read_log_msg(logmsg);
     assert(strcmp(logmsg, "(EE) test %\n") == 0);
 
     /* character */
-    LogMessageVerbSigSafe(X_ERROR, 1, "test %c\n", 'a');
+    LogMessageVerb(X_ERROR, 1, "test %c\n", 'a');
     read_log_msg(logmsg);
     assert(strcmp(logmsg, "(EE) test a\n") == 0);
 
     /* something unsupported % */
-    LogMessageVerbSigSafe(X_ERROR, 1, "test %Q\n");
+    LogMessageVerb(X_ERROR, 1, "test %Q\n");
     read_log_msg(logmsg);
     assert(strstr(logmsg, "BUG") != NULL);
-    LogMessageVerbSigSafe(X_ERROR, 1, "\n");
+    LogMessageVerb(X_ERROR, 1, "\n");
     fseek(f, 0, SEEK_END);
 
     /* string substitution */
-    LogMessageVerbSigSafe(X_ERROR, 1, "%s\n", "substituted string");
+    LogMessageVerb(X_ERROR, 1, "%s\n", "substituted string");
     read_log_msg(logmsg);
     assert(strcmp(logmsg, "(EE) substituted string\n") == 0);
 
     /* Invalid format */
-    LogMessageVerbSigSafe(X_ERROR, 1, "%4", 4);
+    LogMessageVerb(X_ERROR, 1, "%4", 4);
     read_log_msg(logmsg);
     assert(strcmp(logmsg, "(EE) ") == 0);
-    LogMessageVerbSigSafe(X_ERROR, 1, "\n");
+    LogMessageVerb(X_ERROR, 1, "\n");
     fseek(f, 0, SEEK_END);
 
     /* %hld is bogus */
-    LogMessageVerbSigSafe(X_ERROR, 1, "%hld\n", 4);
+    LogMessageVerb(X_ERROR, 1, "%hld\n", 4);
     read_log_msg(logmsg);
     assert(strstr(logmsg, "BUG") != NULL);
-    LogMessageVerbSigSafe(X_ERROR, 1, "\n");
+    LogMessageVerb(X_ERROR, 1, "\n");
     fseek(f, 0, SEEK_END);
 
     /* number substitution */
@@ -262,12 +262,12 @@ static void logging_format(void)
     do {
         char expected[30];
         sprintf(expected, "(EE) %u\n", ui);
-        LogMessageVerbSigSafe(X_ERROR, 1, "%u\n", ui);
+        LogMessageVerb(X_ERROR, 1, "%u\n", ui);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
         sprintf(expected, "(EE) %x\n", ui);
-        LogMessageVerbSigSafe(X_ERROR, 1, "%x\n", ui);
+        LogMessageVerb(X_ERROR, 1, "%x\n", ui);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
@@ -281,21 +281,21 @@ static void logging_format(void)
     do {
         char expected[30];
         sprintf(expected, "(EE) %lu\n", lui);
-        LogMessageVerbSigSafe(X_ERROR, 1, "%lu\n", lui);
+        LogMessageVerb(X_ERROR, 1, "%lu\n", lui);
         read_log_msg(logmsg);
 
         sprintf(expected, "(EE) %lld\n", (unsigned long long)ui);
-        LogMessageVerbSigSafe(X_ERROR, 1, "%lld\n", (unsigned long long)ui);
+        LogMessageVerb(X_ERROR, 1, "%lld\n", (unsigned long long)ui);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
         sprintf(expected, "(EE) %lx\n", lui);
-        LogMessageVerbSigSafe(X_ERROR, 1, "%lx\n", lui);
+        LogMessageVerb(X_ERROR, 1, "%lx\n", lui);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
         sprintf(expected, "(EE) %llx\n", (unsigned long long)ui);
-        LogMessageVerbSigSafe(X_ERROR, 1, "%llx\n", (unsigned long long)ui);
+        LogMessageVerb(X_ERROR, 1, "%llx\n", (unsigned long long)ui);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
@@ -310,12 +310,12 @@ static void logging_format(void)
     do {
         char expected[30];
         sprintf(expected, "(EE) %d\n", i);
-        LogMessageVerbSigSafe(X_ERROR, 1, "%d\n", i);
+        LogMessageVerb(X_ERROR, 1, "%d\n", i);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
         sprintf(expected, "(EE) %d\n", i | INT_MIN);
-        LogMessageVerbSigSafe(X_ERROR, 1, "%d\n", i | INT_MIN);
+        LogMessageVerb(X_ERROR, 1, "%d\n", i | INT_MIN);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
@@ -329,22 +329,22 @@ static void logging_format(void)
     do {
         char expected[30];
         sprintf(expected, "(EE) %ld\n", li);
-        LogMessageVerbSigSafe(X_ERROR, 1, "%ld\n", li);
+        LogMessageVerb(X_ERROR, 1, "%ld\n", li);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
         sprintf(expected, "(EE) %ld\n", li | LONG_MIN);
-        LogMessageVerbSigSafe(X_ERROR, 1, "%ld\n", li | LONG_MIN);
+        LogMessageVerb(X_ERROR, 1, "%ld\n", li | LONG_MIN);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
         sprintf(expected, "(EE) %lld\n", (long long)li);
-        LogMessageVerbSigSafe(X_ERROR, 1, "%lld\n", (long long)li);
+        LogMessageVerb(X_ERROR, 1, "%lld\n", (long long)li);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
         sprintf(expected, "(EE) %lld\n", (long long)(li | LONG_MIN));
-        LogMessageVerbSigSafe(X_ERROR, 1, "%lld\n", (long long)(li | LONG_MIN));
+        LogMessageVerb(X_ERROR, 1, "%lld\n", (long long)(li | LONG_MIN));
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
@@ -357,7 +357,7 @@ static void logging_format(void)
 
     /* pointer substitution */
     /* we print a null-pointer differently to printf */
-    LogMessageVerbSigSafe(X_ERROR, 1, "%p\n", NULL);
+    LogMessageVerb(X_ERROR, 1, "%p\n", NULL);
     read_log_msg(logmsg);
     assert(strcmp(logmsg, "(EE) 0x0\n") == 0);
 
@@ -369,7 +369,7 @@ static void logging_format(void)
 #else
         sprintf(expected, "(EE) %p\n", (void*)ptr);
 #endif
-        LogMessageVerbSigSafe(X_ERROR, 1, "%p\n", (void*)ptr);
+        LogMessageVerb(X_ERROR, 1, "%p\n", (void*)ptr);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
         ptr <<= 1;
@@ -380,20 +380,20 @@ static void logging_format(void)
         double d = float_tests[i];
         char expected[30];
         sprintf(expected, "(EE) %.2f\n", d);
-        LogMessageVerbSigSafe(X_ERROR, 1, "%f\n", d);
+        LogMessageVerb(X_ERROR, 1, "%f\n", d);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
         /* test for length modifiers, we just ignore them atm */
-        LogMessageVerbSigSafe(X_ERROR, 1, "%.3f\n", d);
+        LogMessageVerb(X_ERROR, 1, "%.3f\n", d);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
-        LogMessageVerbSigSafe(X_ERROR, 1, "%3f\n", d);
+        LogMessageVerb(X_ERROR, 1, "%3f\n", d);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
-        LogMessageVerbSigSafe(X_ERROR, 1, "%.0f\n", d);
+        LogMessageVerb(X_ERROR, 1, "%.0f\n", d);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
     }
commit 5962211612decdbe173a1389cc00c26d1a8a8724
Author: Enrico Weigelt, metux IT consult <info at metux.net>
Date:   Thu Sep 12 16:42:19 2024 +0200

    os: log: make LogVMessageVerb() signal safe
    
    We already have our own signal safe vnsprintf() implementation, which is used
    for formatting log messages while being in a signal handler, there's no need
    to have two separate implementations of all the logging functions.
    
    Signed-off-by: Enrico Weigelt, metux IT consult <info at metux.net>
    Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1691>

diff --git a/include/os.h b/include/os.h
index 9e0af6b05..3bc9ee03b 100644
--- a/include/os.h
+++ b/include/os.h
@@ -366,9 +366,6 @@ _X_ATTRIBUTE_PRINTF(2, 3);
 extern _X_EXPORT void
 LogMessageVerbSigSafe(MessageType type, int verb, const char *format, ...)
 _X_ATTRIBUTE_PRINTF(3, 4);
-extern _X_EXPORT void
-LogVMessageVerbSigSafe(MessageType type, int verb, const char *format, va_list args)
-_X_ATTRIBUTE_PRINTF(3, 0);
 
 extern _X_EXPORT void
 LogVHdrMessageVerb(MessageType type, int verb,
@@ -418,4 +415,7 @@ xorg_backtrace(void);
 typedef _sigset_t sigset_t;
 #endif
 
+/* should not be used anymore, just for backwards compat with drivers */
+#define LogVMessageVerbSigSafe(...) LogVMessageVerb(__VA_ARGS__)
+
 #endif                          /* OS_H */
diff --git a/os/log.c b/os/log.c
index 51b812008..817db20ff 100644
--- a/os/log.c
+++ b/os/log.c
@@ -679,21 +679,17 @@ static inline void writeLog(int verb, char *buf, int len)
     LogSWrite(verb, buf, len, (buf[len - 1] == '\n'));
 }
 
+/* signal safe */
 void
 LogVMessageVerb(MessageType type, int verb, const char *format, va_list args)
 {
     char buf[LOG_MSG_BUF_SIZE];
 
-    if (inSignalContext) {
-        LogVMessageVerbSigSafe(type, verb, format, args);
-        return;
-    }
-
     size_t len = prepMsgHdr(type, verb, buf);
     if (len == -1)
         return;
 
-    len += Xvscnprintf(&buf[len], sizeof(buf) - len, format, args);
+    len += vpnprintf(&buf[len], sizeof(buf) - len, format, args);
 
     writeLog(verb, buf, len);
 }
@@ -726,41 +722,25 @@ LogMessageVerbSigSafe(MessageType type, int verb, const char *format, ...)
 {
     va_list ap;
     va_start(ap, format);
-    LogVMessageVerbSigSafe(type, verb, format, ap);
+    LogVMessageVerb(type, verb, format, ap);
     va_end(ap);
 }
 
-void
-LogVMessageVerbSigSafe(MessageType type, int verb, const char *format, va_list args)
-{
-    char buf[LOG_MSG_BUF_SIZE];
-
-    int len = prepMsgHdr(type, verb, buf);
-    if (len == -1)
-        return;
-
-    len += vpnprintf(&buf[len], sizeof(buf) - len, format, args);
-
-    writeLog(verb, buf, len);
-}
-
 void
 LogVHdrMessageVerb(MessageType type, int verb, const char *msg_format,
                    va_list msg_args, const char *hdr_format, va_list hdr_args)
 {
     char buf[LOG_MSG_BUF_SIZE];
-    int (*vprintf_func)(char *, int, const char* _X_RESTRICT_KYWD f, va_list args)
-            _X_ATTRIBUTE_PRINTF(3, 0) = (inSignalContext ? vpnprintf : Xvscnprintf);
 
     size_t len = prepMsgHdr(type, verb, buf);
     if (len == -1)
         return;
 
     if (hdr_format && sizeof(buf) - len > 1)
-        len += vprintf_func(&buf[len], sizeof(buf) - len, hdr_format, hdr_args);
+        len += vpnprintf(&buf[len], sizeof(buf) - len, hdr_format, hdr_args);
 
     if (msg_format && sizeof(buf) - len > 1)
-        len += vprintf_func(&buf[len], sizeof(buf) - len, msg_format, msg_args);
+        len += vpnprintf(&buf[len], sizeof(buf) - len, msg_format, msg_args);
 
     writeLog(verb, buf, len);
 }
@@ -960,7 +940,7 @@ ErrorF(const char *f, ...)
 void
 VErrorFSigSafe(const char *f, va_list args)
 {
-    LogVMessageVerbSigSafe(X_ERROR, -1, f, args);
+    LogVMessageVerb(X_ERROR, -1, f, args);
 }
 
 void
commit 71b89535979ab8f64eba11b104c473e543d781bb
Author: Enrico Weigelt, metux IT consult <info at metux.net>
Date:   Thu Sep 12 14:53:11 2024 +0200

    os: log: consolidate log formatting functions
    
    Simplify log formatting functions and remove redundancies, e.g.:
    
    * common function for line termination
    * copy prefix directly instead of *printf'ing it
    * now just exactly one LogSWrite() call per message
      (good for other log targets like syslog)
    
    Signed-off-by: Enrico Weigelt, metux IT consult <info at metux.net>
    Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1691>

diff --git a/os/log.c b/os/log.c
index 637366efd..51b812008 100644
--- a/os/log.c
+++ b/os/log.c
@@ -550,19 +550,6 @@ vpnprintf(char *string, int size_in, const char *f, va_list args)
     return s_idx;
 }
 
-static int
-pnprintf(char *string, int size, const char *f, ...)
-{
-    int rc;
-    va_list args;
-
-    va_start(args, f);
-    rc = vpnprintf(string, size, f, args);
-    va_end(args);
-
-    return rc;
-}
-
 /* This function does the actual log message writes. It must be signal safe.
  * When attempting to call non-signal-safe functions, guard them with a check
  * of the inSignalContext global variable. */
@@ -665,34 +652,50 @@ LogMessageTypeVerbString(MessageType type, int verb)
     }
 }
 
+#define LOG_MSG_BUF_SIZE 1024
+
+static ssize_t prepMsgHdr(MessageType type, int verb, char *buf)
+{
+    const char *type_str = LogMessageTypeVerbString(type, verb);
+    if (!type_str)
+        return -1;
+
+    size_t prefixLen = strlen_sigsafe(type_str);
+    if (prefixLen) {
+        memcpy(buf, type_str, prefixLen + 1); // rely on buffer being big enough
+        buf[prefixLen] = ' ';
+        prefixLen++;
+    }
+    buf[prefixLen] = 0;
+    return prefixLen;
+}
+
+static inline void writeLog(int verb, char *buf, int len)
+{
+    /* Force '\n' at end of truncated line */
+    if (LOG_MSG_BUF_SIZE  - len == 1)
+        buf[len - 1] = '\n';
+
+    LogSWrite(verb, buf, len, (buf[len - 1] == '\n'));
+}
+
 void
 LogVMessageVerb(MessageType type, int verb, const char *format, va_list args)
 {
-    const char *type_str;
-    char buf[1024];
-    size_t len = 0;
+    char buf[LOG_MSG_BUF_SIZE];
 
     if (inSignalContext) {
         LogVMessageVerbSigSafe(type, verb, format, args);
         return;
     }
 
-    type_str = LogMessageTypeVerbString(type, verb);
-    if (!type_str)
+    size_t len = prepMsgHdr(type, verb, buf);
+    if (len == -1)
         return;
 
-    /* if type_str is not "", prepend it and ' ', to message */
-    if (type_str[0] != '\0')
-        len += Xscnprintf(&buf[len], sizeof(buf) - len, "%s ", type_str);
-
-    if (sizeof(buf) - len > 1)
-        len += Xvscnprintf(&buf[len], sizeof(buf) - len, format, args);
-
-    /* Force '\n' at end of truncated line */
-    if (sizeof(buf) - len == 1)
-        buf[len - 1] = '\n';
+    len += Xvscnprintf(&buf[len], sizeof(buf) - len, format, args);
 
-    LogSWrite(verb, buf, len, (buf[len - 1] == '\n'));
+    writeLog(verb, buf, len);
 }
 
 /* Log message with verbosity level specified. */
@@ -730,68 +733,36 @@ LogMessageVerbSigSafe(MessageType type, int verb, const char *format, ...)
 void
 LogVMessageVerbSigSafe(MessageType type, int verb, const char *format, va_list args)
 {
-    const char *type_str;
-    char buf[1024];
-    int len;
+    char buf[LOG_MSG_BUF_SIZE];
 
-    type_str = LogMessageTypeVerbString(type, verb);
-    if (!type_str)
+    int len = prepMsgHdr(type, verb, buf);
+    if (len == -1)
         return;
 
-    /* if type_str is not "", prepend it and ' ', to message */
-    if (type_str[0] != '\0') {
-        LogSWrite(verb, type_str, strlen_sigsafe(type_str), FALSE);
-        LogSWrite(verb, " ", 1, FALSE);
-    }
-
-    len = vpnprintf(buf, sizeof(buf), format, args);
-
-    /* Force '\n' at end of truncated line */
-    if (sizeof(buf) - len == 1)
-        buf[len - 1] = '\n';
+    len += vpnprintf(&buf[len], sizeof(buf) - len, format, args);
 
-    LogSWrite(verb, buf, len, (len > 0 && buf[len - 1] == '\n'));
+    writeLog(verb, buf, len);
 }
 
 void
 LogVHdrMessageVerb(MessageType type, int verb, const char *msg_format,
                    va_list msg_args, const char *hdr_format, va_list hdr_args)
 {
-    const char *type_str;
-    char buf[1024];
-    size_t len = 0;
+    char buf[LOG_MSG_BUF_SIZE];
     int (*vprintf_func)(char *, int, const char* _X_RESTRICT_KYWD f, va_list args)
-            _X_ATTRIBUTE_PRINTF(3, 0);
-    int (*printf_func)(char *, int, const char* _X_RESTRICT_KYWD f, ...)
-            _X_ATTRIBUTE_PRINTF(3, 4);
+            _X_ATTRIBUTE_PRINTF(3, 0) = (inSignalContext ? vpnprintf : Xvscnprintf);
 
-    type_str = LogMessageTypeVerbString(type, verb);
-    if (!type_str)
+    size_t len = prepMsgHdr(type, verb, buf);
+    if (len == -1)
         return;
 
-    if (inSignalContext) {
-        vprintf_func = vpnprintf;
-        printf_func = pnprintf;
-    } else {
-        vprintf_func = Xvscnprintf;
-        printf_func = Xscnprintf;
-    }
-
-    /* if type_str is not "", prepend it and ' ', to message */
-    if (type_str[0] != '\0')
-        len += printf_func(&buf[len], sizeof(buf) - len, "%s ", type_str);
-
     if (hdr_format && sizeof(buf) - len > 1)
         len += vprintf_func(&buf[len], sizeof(buf) - len, hdr_format, hdr_args);
 
     if (msg_format && sizeof(buf) - len > 1)
         len += vprintf_func(&buf[len], sizeof(buf) - len, msg_format, msg_args);
 
-    /* Force '\n' at end of truncated line */
-    if (sizeof(buf) - len == 1)
-        buf[len - 1] = '\n';
-
-    LogSWrite(verb, buf, len, (buf[len - 1] == '\n'));
+    writeLog(verb, buf, len);
 }
 
 void
commit f5fe8a63796eb358992cb199810aaf13dbf0792c
Author: Enrico Weigelt, metux IT consult <info at metux.net>
Date:   Thu Sep 12 14:06:22 2024 +0200

    os: log: drop unused variables
    
    Drop some unneeded variabes, whose values can be computed at compile-time.
    
    Signed-off-by: Enrico Weigelt, metux IT consult <info at metux.net>
    Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1691>

diff --git a/os/log.c b/os/log.c
index 440997a15..637366efd 100644
--- a/os/log.c
+++ b/os/log.c
@@ -670,8 +670,6 @@ LogVMessageVerb(MessageType type, int verb, const char *format, va_list args)
 {
     const char *type_str;
     char buf[1024];
-    const size_t size = sizeof(buf);
-    Bool newline;
     size_t len = 0;
 
     if (inSignalContext) {
@@ -685,17 +683,16 @@ LogVMessageVerb(MessageType type, int verb, const char *format, va_list args)
 
     /* if type_str is not "", prepend it and ' ', to message */
     if (type_str[0] != '\0')
-        len += Xscnprintf(&buf[len], size - len, "%s ", type_str);
+        len += Xscnprintf(&buf[len], sizeof(buf) - len, "%s ", type_str);
 
-    if (size - len > 1)
-        len += Xvscnprintf(&buf[len], size - len, format, args);
+    if (sizeof(buf) - len > 1)
+        len += Xvscnprintf(&buf[len], sizeof(buf) - len, format, args);
 
     /* Force '\n' at end of truncated line */
-    if (size - len == 1)
+    if (sizeof(buf) - len == 1)
         buf[len - 1] = '\n';
 
-    newline = (buf[len - 1] == '\n');
-    LogSWrite(verb, buf, len, newline);
+    LogSWrite(verb, buf, len, (buf[len - 1] == '\n'));
 }
 
 /* Log message with verbosity level specified. */
@@ -736,7 +733,6 @@ LogVMessageVerbSigSafe(MessageType type, int verb, const char *format, va_list a
     const char *type_str;
     char buf[1024];
     int len;
-    Bool newline;
 
     type_str = LogMessageTypeVerbString(type, verb);
     if (!type_str)
@@ -754,8 +750,7 @@ LogVMessageVerbSigSafe(MessageType type, int verb, const char *format, va_list a
     if (sizeof(buf) - len == 1)
         buf[len - 1] = '\n';
 
-    newline = (len > 0 && buf[len - 1] == '\n');
-    LogSWrite(verb, buf, len, newline);
+    LogSWrite(verb, buf, len, (len > 0 && buf[len - 1] == '\n'));
 }
 
 void
@@ -764,8 +759,6 @@ LogVHdrMessageVerb(MessageType type, int verb, const char *msg_format,
 {
     const char *type_str;
     char buf[1024];
-    const size_t size = sizeof(buf);
-    Bool newline;
     size_t len = 0;
     int (*vprintf_func)(char *, int, const char* _X_RESTRICT_KYWD f, va_list args)
             _X_ATTRIBUTE_PRINTF(3, 0);
@@ -786,20 +779,19 @@ LogVHdrMessageVerb(MessageType type, int verb, const char *msg_format,
 
     /* if type_str is not "", prepend it and ' ', to message */
     if (type_str[0] != '\0')
-        len += printf_func(&buf[len], size - len, "%s ", type_str);
+        len += printf_func(&buf[len], sizeof(buf) - len, "%s ", type_str);
 
-    if (hdr_format && size - len > 1)
-        len += vprintf_func(&buf[len], size - len, hdr_format, hdr_args);
+    if (hdr_format && sizeof(buf) - len > 1)
+        len += vprintf_func(&buf[len], sizeof(buf) - len, hdr_format, hdr_args);
 
-    if (msg_format && size - len > 1)
-        len += vprintf_func(&buf[len], size - len, msg_format, msg_args);
+    if (msg_format && sizeof(buf) - len > 1)
+        len += vprintf_func(&buf[len], sizeof(buf) - len, msg_format, msg_args);
 
     /* Force '\n' at end of truncated line */
-    if (size - len == 1)
+    if (sizeof(buf) - len == 1)
         buf[len - 1] = '\n';
 
-    newline = (buf[len - 1] == '\n');
-    LogSWrite(verb, buf, len, newline);
+    LogSWrite(verb, buf, len, (buf[len - 1] == '\n'));
 }
 
 void


More information about the xorg-commit mailing list