[PATCH weston v2] desktop-shell: Send fewer pings

Derek Foreman derekf at osg.samsung.com
Fri Jul 8 18:20:46 UTC 2016


Currently we can end up sending pings to popups every screen redraw and every
pointer move when they're focused.  Instead let's send a maximum of 1 every 200ms
by letting the ping timer expire before we send another ping.

With the old code I've logged 400+ pings per second on the right click pop-up.
This is easily reproducible with a high refresh rate mouse.

Signed-off-by: Derek Foreman <derekf at osg.samsung.com>
---
Changes from v1:
Bill caught me - I've now removed the always-true conditional...

 desktop-shell/shell.c | 23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
index 4945bc1..f0b6596 100644
--- a/desktop-shell/shell.c
+++ b/desktop-shell/shell.c
@@ -243,6 +243,7 @@ struct shell_client {
 	uint32_t ping_serial;
 	int unresponsive;
 	struct wl_list surface_list;
+	bool ponged;
 };
 
 static struct desktop_shell *
@@ -2092,6 +2093,11 @@ xdg_ping_timeout_handler(void *data)
 	struct weston_seat *seat;
 	struct shell_surface *shsurf;
 
+	if (sc->ponged) {
+		wl_event_source_remove(sc->ping_timer);
+		sc->ping_timer = NULL;
+		return 1;
+	}
 	/* Client is not responding */
 	sc->unresponsive = 1;
 	wl_list_for_each(seat, &sc->shell->compositor->seat_list, link) {
@@ -2125,13 +2131,16 @@ handle_xdg_ping(struct shell_surface *shsurf)
 		return;
 	}
 
+	if (sc->ping_timer)
+		return;
+
 	serial = wl_display_next_serial(compositor->wl_display);
 	sc->ping_serial = serial;
 	loop = wl_display_get_event_loop(compositor->wl_display);
-	if (sc->ping_timer == NULL)
-		sc->ping_timer =
-			wl_event_loop_add_timer(loop,
-						xdg_ping_timeout_handler, sc);
+	sc->ponged = false;
+	sc->ping_timer = wl_event_loop_add_timer(loop,
+						 xdg_ping_timeout_handler,
+						 sc);
 	if (sc->ping_timer == NULL)
 		return;
 
@@ -2218,11 +2227,7 @@ shell_client_pong(struct shell_client *sc, uint32_t serial)
 	sc->unresponsive = 0;
 	end_busy_cursor(sc->shell->compositor, sc->client);
 
-	if (sc->ping_timer) {
-		wl_event_source_remove(sc->ping_timer);
-		sc->ping_timer = NULL;
-	}
-
+	sc->ponged = true;
 }
 
 static void
-- 
2.8.1



More information about the wayland-devel mailing list