[PATCH] shell: resolve one random endless loop issue

juan.j.zhao at linux.intel.com juan.j.zhao at linux.intel.com
Mon Jul 16 00:14:55 PDT 2012


From: Juan Zhao <juan.j.zhao at linux.intel.com>

When we're launching applications, we meet weston random unresponsive issue.
Regarding the backtrace, it is caused by set_busy_cursor->shell_grab_start->
 wl_pointer_set_focus->wl_signal_emit->handle_pointer_focus->set_busy_cursor.
The busy cursor will be set by ping_timeout_handler, no need to set it again
 in handler_pointer_focus when the client is unresponsive. Or, the compositor
 will be lead to endless loop isse.

backtrace:
' #101672 wl_pointer_set_focus (pointer=0x8215a0c, surface=0x824c518,
 sx=0, sy=0) at wayland-server.c:822
' #101673 0xb694e038 in shell_grab_start (grab=0x824b370,
 interface=<value optimized out>, shsurf=0x824c738,
 pointer=0x8215a0c,
 cursor=DESKTOP_SHELL_CURSOR_BUSY) at shell.c:272
' #101674 0xb694e098 in set_busy_cursor (shsurf=0x824c738,
 pointer=0x8215a0c) at shell.c:865
' #101675 0xb7fb3b31 in wl_signal_emit (pointer=0x8215a0c,
 surface=0x824c518, sx=0, sy=0) at wayland-server.h:166
' #101676 wl_pointer_set_focus (pointer=0x8215a0c, surface=0x824c518,
 sx=0, sy=0) at wayland-server.c:822
' #101677 0xb694e038 in shell_grab_start (grab=0x824b370,
 interface=<value optimized out>, shsurf=0x824c738,
 pointer=0x8215a0c,
 cursor=DESKTOP_SHELL_CURSOR_BUSY) at shell.c:272
' #101678 0xb694e098 in set_busy_cursor (shsurf=0x824c738,
 pointer=0x8215a0c) at shell.c:865
' #101679 0xb7fb3b31 in wl_signal_emit (pointer=0x8215a0c,
 surface=0x824c518, sx=0, sy=0) at wayland-server.h:166
' #101680 wl_pointer_set_focus (pointer=0x8215a0c, surface=0x824c518,
 sx=0, sy=0) at wayland-server.c:822
' #101681 0xb694e038 in shell_grab_start (grab=0x824b370,
 interface=<value optimized out>, shsurf=0x824c738,
 pointer=0x8215a0c,
 cursor=DESKTOP_SHELL_CURSOR_BUSY) at shell.c:272
' #101682 0xb694e098 in set_busy_cursor (shsurf=0x824c738,
 pointer=0x8215a0c) at shell.c:865
' #101683 0xb7fb3b31 in wl_signal_emit (pointer=0x8215a0c,
 surface=0x824c518, sx=0, sy=0) at wayland-server.h:166
' #101684 wl_pointer_set_focus (pointer=0x8215a0c, surface=0x824c518,
 sx=0, sy=0) at wayland-server.c:822
' #101685 0xb694e038 in shell_grab_start (grab=0x824b370,
 interface=<value optimized out>, shsurf=0x824c738,
 pointer=0x8215a0c,
 cursor=DESKTOP_SHELL_CURSOR_BUSY) at shell.c:272
' #101686 0xb694e098 in set_busy_cursor (shsurf=0x824c738,
 pointer=0x8215a0c) at shell.c:865
' #101687 0xb7fb3b31 in wl_signal_emit (pointer=0x8215a0c,
 surface=0x824c518, sx=0, sy=0) at wayland-server.h:166
' #101688 wl_pointer_set_focus (pointer=0x8215a0c, surface=0x824c518,
 sx=0, sy=0) at wayland-server.c:822
' #101689 0xb694e038 in shell_grab_start (grab=0x824b370,
 interface=<value optimized out>, shsurf=0x824c738,
 pointer=0x8215a0c,
 cursor=DESKTOP_SHELL_CURSOR_BUSY) at shell.c:272
' #101690 0xb694e098 in set_busy_cursor (shsurf=0x824c738,
 pointer=0x8215a0c) at shell.c:865

Signed-off-by: Juan Zhao <juan.j.zhao at linux.intel.com>
---
 src/shell.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/src/shell.c b/src/shell.c
index d0492d9..83452fe 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -954,9 +954,7 @@ handle_pointer_focus(struct wl_listener *listener, void *data)
 	compositor = surface->compositor;
 	shsurf = get_shell_surface(surface);
 
-	if (shsurf && shsurf->unresponsive) {
-		set_busy_cursor(shsurf, pointer);
-	} else {
+	if (!(shsurf && shsurf->unresponsive)) {
 		serial = wl_display_next_serial(compositor->wl_display);
 		ping_handler(surface, serial);
 	}
-- 
1.7.11



More information about the wayland-devel mailing list