[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