shell: Cleanup ping_timer code.

- Added ping_timer_destroy() to simplify cleanup.
 - Changed timeout and fade step to more realistic values.
 - Renamed ping_timeout_fade_frame() to unresponsive_fade_frame().
Scott Moreau 13 years ago committed by Kristian Høgsberg
parent adb624a297
commit 9521d5e553
  1. 57
      src/shell.c

@ -97,7 +97,6 @@ enum shell_surface_type {
struct ping_timer { struct ping_timer {
struct wl_event_source *source; struct wl_event_source *source;
uint32_t pong_received;
uint32_t serial; uint32_t serial;
}; };
@ -315,13 +314,13 @@ unresponsive_surface_fade(struct shell_surface *shsurf, bool reverse)
} }
static void static void
ping_timeout_fade_frame(struct weston_animation *animation, unresponsive_fade_frame(struct weston_animation *animation,
struct weston_output *output, uint32_t msecs) struct weston_output *output, uint32_t msecs)
{ {
struct shell_surface *shsurf = struct shell_surface *shsurf =
container_of(animation, struct shell_surface, unresponsive_animation.current); container_of(animation, struct shell_surface, unresponsive_animation.current);
struct weston_surface *surface = shsurf->surface; struct weston_surface *surface = shsurf->surface;
unsigned int step = 32; unsigned int step = 8;
if (!surface || !shsurf) if (!surface || !shsurf)
return; return;
@ -362,22 +361,27 @@ ping_timeout_fade_frame(struct weston_animation *animation,
weston_surface_damage(surface); weston_surface_damage(surface);
} }
static void
ping_timer_destroy(struct shell_surface *shsurf)
{
if (!shsurf || !shsurf->ping_timer)
return;
if (shsurf->ping_timer->source)
wl_event_source_remove(shsurf->ping_timer->source);
free(shsurf->ping_timer);
shsurf->ping_timer = NULL;
}
static int static int
ping_timeout_handler(void *data) ping_timeout_handler(void *data)
{ {
struct shell_surface *shsurf = data; struct shell_surface *shsurf = data;
if (!shsurf || !shsurf->ping_timer) /* Client is not responding */
return 1; shsurf->unresponsive = 1;
unresponsive_surface_fade(shsurf, false);
if (shsurf->ping_timer->pong_received) {
free(shsurf->ping_timer);
shsurf->ping_timer = NULL;
} else {
/* Client is not responding */
shsurf->unresponsive = 1;
unresponsive_surface_fade(shsurf, false);
}
return 1; return 1;
} }
@ -388,7 +392,7 @@ ping_handler(struct weston_surface *surface, uint32_t serial)
struct shell_surface *shsurf; struct shell_surface *shsurf;
shsurf = get_shell_surface(surface); shsurf = get_shell_surface(surface);
struct wl_event_loop *loop; struct wl_event_loop *loop;
int ping_timeout = 15000; int ping_timeout = 2500;
if (!shsurf) if (!shsurf)
return; return;
@ -399,7 +403,6 @@ ping_handler(struct weston_surface *surface, uint32_t serial)
return; return;
shsurf->ping_timer->serial = serial; shsurf->ping_timer->serial = serial;
shsurf->ping_timer->pong_received = 0;
loop = wl_display_get_event_loop(surface->compositor->wl_display); loop = wl_display_get_event_loop(surface->compositor->wl_display);
shsurf->ping_timer->source = shsurf->ping_timer->source =
wl_event_loop_add_timer(loop, ping_timeout_handler, shsurf); wl_event_loop_add_timer(loop, ping_timeout_handler, shsurf);
@ -415,18 +418,13 @@ shell_surface_pong(struct wl_client *client, struct wl_resource *resource,
{ {
struct shell_surface *shsurf = resource->data; struct shell_surface *shsurf = resource->data;
if (!shsurf || !shsurf->ping_timer)
return;
if (shsurf->ping_timer->serial == serial) { if (shsurf->ping_timer->serial == serial) {
if (shsurf->unresponsive) { if (shsurf->unresponsive) {
/* Received pong from previously unresponsive client */ /* Received pong from previously unresponsive client */
unresponsive_surface_fade(shsurf, true); unresponsive_surface_fade(shsurf, true);
} }
shsurf->ping_timer->pong_received = 1;
shsurf->unresponsive = 0; shsurf->unresponsive = 0;
free(shsurf->ping_timer); ping_timer_destroy(shsurf);
shsurf->ping_timer = NULL;
} }
} }
@ -1054,8 +1052,7 @@ destroy_shell_surface(struct wl_resource *resource)
*/ */
wl_list_remove(&shsurf->surface_destroy_listener.link); wl_list_remove(&shsurf->surface_destroy_listener.link);
shsurf->surface->configure = NULL; shsurf->surface->configure = NULL;
if (shsurf->ping_timer) ping_timer_destroy(shsurf);
free(shsurf->ping_timer);
wl_list_remove(&shsurf->link); wl_list_remove(&shsurf->link);
free(shsurf); free(shsurf);
@ -1122,7 +1119,7 @@ shell_get_shell_surface(struct wl_client *client,
shsurf->unresponsive = 0; shsurf->unresponsive = 0;
shsurf->unresponsive_animation.exists = 0; shsurf->unresponsive_animation.exists = 0;
shsurf->unresponsive_animation.fading_in = 0; shsurf->unresponsive_animation.fading_in = 0;
shsurf->unresponsive_animation.current.frame = ping_timeout_fade_frame; shsurf->unresponsive_animation.current.frame = unresponsive_fade_frame;
shsurf->resource.destroy = destroy_shell_surface; shsurf->resource.destroy = destroy_shell_surface;
shsurf->resource.object.id = id; shsurf->resource.object.id = id;
@ -2380,22 +2377,12 @@ debug_repaint_binding(struct wl_input_device *device, uint32_t time,
static void static void
shell_destroy(struct wl_listener *listener, void *data) shell_destroy(struct wl_listener *listener, void *data)
{ {
struct weston_surface *surface;
struct shell_surface *shsurf;
struct desktop_shell *shell = struct desktop_shell *shell =
container_of(listener, struct desktop_shell, destroy_listener); container_of(listener, struct desktop_shell, destroy_listener);
if (shell->child.client) if (shell->child.client)
wl_client_destroy(shell->child.client); wl_client_destroy(shell->child.client);
wl_list_for_each(surface, &shell->compositor->surface_list, link) {
shsurf = get_shell_surface(surface);
if (!shsurf)
continue;
if (shsurf->ping_timer)
free(shsurf->ping_timer);
}
free(shell->screensaver.path); free(shell->screensaver.path);
free(shell); free(shell);
} }

Loading…
Cancel
Save