From 7debb1125bfc13f6582dd10a63af27e8cc47358d Mon Sep 17 00:00:00 2001 From: winnerym100 Date: Tue, 30 Dec 2025 09:33:54 +0800 Subject: [PATCH] Fix the issue where the lightdm service is blocked after failing to connect to the X server upon receiving signal 10 from xorg, and add a retry mechanism --- src/x-server-local.c | 6 +++++- src/x-server.c | 28 ++++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/x-server-local.c b/src/x-server-local.c index 6c540d18..d5ead292 100644 --- a/src/x-server-local.c +++ b/src/x-server-local.c @@ -373,7 +373,11 @@ got_signal_cb (Process *process, int signum, XServerLocal *server) l_debug (server, "Got signal from X server :%d", priv->display_number); // FIXME: Check return value - DISPLAY_SERVER_CLASS (x_server_local_parent_class)->start (DISPLAY_SERVER (server)); + gboolean start_result = DISPLAY_SERVER_CLASS (x_server_local_parent_class)->start (DISPLAY_SERVER (server)); + if (!start_result) { + priv->got_signal = FALSE; + l_debug (server, "X service start failed for rewait signal"); + } } } diff --git a/src/x-server.c b/src/x-server.c index f17a842d..f2b46f6c 100644 --- a/src/x-server.c +++ b/src/x-server.c @@ -159,9 +159,33 @@ x_server_start (DisplayServer *display_server) /* Open connection */ l_debug (server, "Connecting to XServer %s", x_server_get_address (server)); priv->connection = xcb_connect_to_display_with_auth_info (x_server_get_address (server), auth, NULL); - if (xcb_connection_has_error (priv->connection)) + int error_code = xcb_connection_has_error (priv->connection); + if (error_code) { - l_debug (server, "Error connecting to XServer %s", x_server_get_address (server)); + l_debug (server, "Error connecting to XServer %s, error code:%d", x_server_get_address (server), error_code); + switch (error_code) { + case XCB_CONN_ERROR: + l_debug (server, "XCB connection error: Socket, Pipe or I/O error\n"); + break; + case XCB_CONN_CLOSED_EXT_NOTSUPPORTED: + l_debug (server, "XCB connection error: Extension not supported\n"); + break; + case XCB_CONN_CLOSED_MEM_INSUFFICIENT: + l_debug (server, "XCB connection error: Memory insufficient\n"); + break; + case XCB_CONN_CLOSED_REQ_LEN_EXCEED: + l_debug (server, "XCB connection error: Request length exceeded\n"); + break; + case XCB_CONN_CLOSED_PARSE_ERR: + l_debug (server, "XCB connection error: Can't parse display string\n"); + break; + case XCB_CONN_CLOSED_INVALID_SCREEN: + l_debug (server, "XCB connection error: Invalid screen\n"); + break; + default: + l_debug (server, "XCB connection error: Unknown error (%d)\n", error_code); + break; + } return FALSE; }