Hi, looks good. Reviewed-by: Giulio Camuffo <[email protected]>
2016-07-08 20:20 GMT+02:00 Derek Foreman <[email protected]>: > 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 <[email protected]> > --- > 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 > > _______________________________________________ > wayland-devel mailing list > [email protected] > https://lists.freedesktop.org/mailman/listinfo/wayland-devel _______________________________________________ wayland-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/wayland-devel
