xserver: Branch 'server-21.1-branch' - 3 commits

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Dec 21 09:30:01 UTC 2022


 hw/xquartz/mach-startup/bundle-main.c |    3 ++
 hw/xquartz/xpr/xprFrame.c             |   26 ++++----------------
 miext/rootless/rootlessCommon.c       |   44 +++++++++++++++++++++++++++++++---
 3 files changed, 50 insertions(+), 23 deletions(-)

New commits:
commit a0216de2367429788be4ef430026ada215106ff5
Author: Jeremy Huddleston Sequoia <jeremyhu at apple.com>
Date:   Wed Dec 14 23:45:13 2022 -0800

    rootless: Add additional debug logging to help triage XQuartz fb/rootless/damage crashes
    
    Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu at apple.com>
    (cherry picked from commit 07ed1a623a4b36cdb741a322008ba53d913dc765)

diff --git a/miext/rootless/rootlessCommon.c b/miext/rootless/rootlessCommon.c
index 504362790..44c2c3789 100644
--- a/miext/rootless/rootlessCommon.c
+++ b/miext/rootless/rootlessCommon.c
@@ -134,6 +134,23 @@ RootlessResolveColormap(ScreenPtr pScreen, int first_color,
     return TRUE;
 }
 
+unsigned long RootlessWID(WindowPtr pWindow) {
+    ScreenPtr pScreen = pWindow->drawable.pScreen;
+    WindowPtr top = TopLevelParent(pWindow);
+    RootlessWindowRec *winRec;
+    PixmapPtr curPixmap;
+
+    if (top == NULL) {
+        return 0;
+    }
+    winRec = WINREC(top);
+    if (winRec == NULL) {
+        return 0;
+    }
+
+    return (unsigned long)(uintptr_t)winRec->wid;
+}
+
 /*
  * RootlessStartDrawing
  *  Prepare a window for direct access to its backing buffer.
@@ -148,11 +165,15 @@ RootlessStartDrawing(WindowPtr pWindow)
     RootlessWindowRec *winRec;
     PixmapPtr curPixmap;
 
-    if (top == NULL)
+    if (top == NULL) {
+        RL_DEBUG_MSG("RootlessStartDrawing is a no-op because top == NULL.\n");
         return;
+    }
     winRec = WINREC(top);
-    if (winRec == NULL)
+    if (winRec == NULL) {
+        RL_DEBUG_MSG("RootlessStartDrawing is a no-op because winRec == NULL.\n");
         return;
+    }
 
     // Make sure the window's top-level parent is prepared for drawing.
     if (!winRec->is_drawing) {
@@ -166,10 +187,23 @@ RootlessStartDrawing(WindowPtr pWindow)
                                    top->drawable.depth,
                                    top->drawable.bitsPerPixel,
                                    winRec->bytesPerRow, winRec->pixelData);
+
+        RL_DEBUG_MSG("GetScratchPixmapHeader gave us %p %p (%d,%d %dx%d %d) for wid=%lu\n",
+                     winRec->pixmap, winRec->pixmap->devPrivate.ptr, winRec->pixmap->drawable.x,
+                     winRec->pixmap->drawable.y, winRec->pixmap->drawable.width, winRec->pixmap->drawable.height,
+                     winRec->pixmap->drawable.bitsPerPixel, RootlessWID(pWindow));
+
         SetPixmapBaseToScreen(winRec->pixmap,
                               top->drawable.x - bw, top->drawable.y - bw);
 
+        RL_DEBUG_MSG("After SetPixmapBaseToScreen(%d %d %d): %p (%d,%d %dx%d %d) for wid=%lu\n",
+                     top->drawable.x, top->drawable.y, bw, winRec->pixmap->devPrivate.ptr, winRec->pixmap->drawable.x,
+                     winRec->pixmap->drawable.y, winRec->pixmap->drawable.width, winRec->pixmap->drawable.height,
+                     winRec->pixmap->drawable.bitsPerPixel, RootlessWID(pWindow));
+
         winRec->is_drawing = TRUE;
+    } else {
+        RL_DEBUG_MSG("Skipped call to xprStartDrawing (wid: %lu) because winRec->is_drawing says we already did.\n", RootlessWID(pWindow));
     }
 
     curPixmap = pScreen->GetWindowPixmap(pWindow);
@@ -181,6 +215,10 @@ RootlessStartDrawing(WindowPtr pWindow)
         PixmapPtr oldPixmap =
             dixLookupPrivate(&pWindow->devPrivates,
                              rootlessWindowOldPixmapPrivateKey);
+
+        RL_DEBUG_MSG("curPixmap is %p %p for wid=%lu\n", curPixmap, curPixmap ? curPixmap->devPrivate.ptr : NULL, RootlessWID(pWindow));
+        RL_DEBUG_MSG("oldPixmap is %p %p for wid=%lu\n", oldPixmap, oldPixmap ? oldPixmap->devPrivate.ptr : NULL, RootlessWID(pWindow));
+
         if (oldPixmap != NULL) {
             if (oldPixmap == curPixmap)
                 RL_DEBUG_MSG
@@ -277,7 +315,7 @@ RootlessDamageRegion(WindowPtr pWindow, RegionPtr pRegion)
     WindowPtr pTop;
     BoxPtr b1, b2;
 
-    RL_DEBUG_MSG("Damaged win 0x%x ", pWindow);
+    RL_DEBUG_MSG("Damaged win %p\n", pWindow);
 
     pTop = TopLevelParent(pWindow);
     if (pTop == NULL)
commit 264272f3d76e4f1e50d984640c57de77aca9ba37
Author: Jeremy Huddleston Sequoia <jeremyhu at apple.com>
Date:   Wed Dec 14 17:07:46 2022 -0800

    xquartz: Use xorg_backtrace() instead of rolling our own for debugging
    
    Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu at apple.com>
    (cherry picked from commit d1a9a50792110683ae3f993eeeffeee79cf9cbce)

diff --git a/hw/xquartz/xpr/xprFrame.c b/hw/xquartz/xpr/xprFrame.c
index ba84548b5..57d16d42f 100644
--- a/hw/xquartz/xpr/xprFrame.c
+++ b/hw/xquartz/xpr/xprFrame.c
@@ -45,10 +45,6 @@
 
 #include <dispatch/dispatch.h>
 
-#ifdef DEBUG_XP_LOCK_WINDOW
-#include <execinfo.h>
-#endif
-
 #define DEFINE_ATOM_HELPER(func, atom_name)                      \
     static Atom func(void) {                                       \
         static int generation;                                      \
@@ -353,15 +349,8 @@ xprStartDrawing(RootlessFrameID wid, char **pixelData, int *bytesPerRow)
     xp_error err;
 
 #ifdef DEBUG_XP_LOCK_WINDOW
-    void* callstack[128];
-    int i, frames = backtrace(callstack, 128);
-    char** strs = backtrace_symbols(callstack, frames);
-
     ErrorF("=== LOCK %d ===\n", (int)x_cvt_vptr_to_uint(wid));
-    for (i = 0; i < frames; ++i) {
-        ErrorF("    %s\n", strs[i]);
-    }
-    free(strs);
+    xorg_backtrace();
 #endif
 
     err = xp_lock_window(x_cvt_vptr_to_uint(
@@ -371,6 +360,10 @@ xprStartDrawing(RootlessFrameID wid, char **pixelData, int *bytesPerRow)
                    (int)x_cvt_vptr_to_uint(
                        wid), (int)err);
 
+#ifdef DEBUG_XP_LOCK_WINDOW
+    ErrorF("  bits: %p\n", *data);
+#endif
+
     *pixelData = data[0];
     *bytesPerRow = rowbytes[0];
 }
@@ -384,15 +377,8 @@ xprStopDrawing(RootlessFrameID wid, Bool flush)
     xp_error err;
 
 #ifdef DEBUG_XP_LOCK_WINDOW
-    void* callstack[128];
-    int i, frames = backtrace(callstack, 128);
-    char** strs = backtrace_symbols(callstack, frames);
-
     ErrorF("=== UNLOCK %d ===\n", (int)x_cvt_vptr_to_uint(wid));
-    for (i = 0; i < frames; ++i) {
-        ErrorF("    %s\n", strs[i]);
-    }
-    free(strs);
+    xorg_backtrace();
 #endif
 
     err = xp_unlock_window(x_cvt_vptr_to_uint(wid), flush);
commit 20f380c6d93be3ef561251584163d1fe1ae2d966
Author: Jeremy Huddleston Sequoia <jeremyhu at apple.com>
Date:   Wed Dec 21 01:18:11 2022 -0800

    xquartz: Ignore SIGPIPE at process launch
    
    Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu at apple.com>
    (cherry picked from commit 9a66690eaf67c19b90e07f39b16436d34b59e27a)

diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c
index 363bf5ac1..353e1d2bc 100644
--- a/hw/xquartz/mach-startup/bundle-main.c
+++ b/hw/xquartz/mach-startup/bundle-main.c
@@ -626,6 +626,9 @@ main(int argc, char **argv, char **envp)
     mach_port_t mp;
     kern_return_t kr;
 
+    /* Ignore SIGPIPE */
+    signal(SIGPIPE, SIG_IGN);
+
     /* Setup our environment for our children */
     setup_env();
 


More information about the xorg-commit mailing list