[PATCH] server: destroy the socket event source on display destroy

Kristian Høgsberg krh at bitplanet.net
Thu Dec 22 07:41:32 PST 2011


On Thu, Dec 22, 2011 at 9:52 AM, Pekka Paalanen <ppaalanen at gmail.com> wrote:
> On wl_display_add_socket(), the listening socket fd is added to the
> event loop. However, wl_event_source object is not stored and hence
> cannot be freed, resulting in a minor leak.
>
> Store wl_event_source pointer in struct wl_socket so we can track it,
> and destroy it on wl_display_destroy(). The event loop itself must be
> destroyed after destroying the event sources linked to it.
>
> Fixes a Valgrind reported memory leak.

Nice, that looks better overall.

Kristian

> Signed-off-by: Pekka Paalanen <ppaalanen at gmail.com>
> ---
>  src/wayland-server.c |   11 +++++++----
>  1 files changed, 7 insertions(+), 4 deletions(-)
>
> diff --git a/src/wayland-server.c b/src/wayland-server.c
> index 87e4ed5..20504d7 100644
> --- a/src/wayland-server.c
> +++ b/src/wayland-server.c
> @@ -51,6 +51,7 @@ struct wl_socket {
>        struct sockaddr_un addr;
>        char lock_addr[113];
>        struct wl_list link;
> +       struct wl_event_source *source;
>  };
>
>  struct wl_client {
> @@ -667,14 +668,15 @@ wl_display_destroy(struct wl_display *display)
>        struct wl_socket *s, *next;
>        struct wl_global *global, *gnext;
>
> -       wl_event_loop_destroy(display->loop);
>        wl_list_for_each_safe(s, next, &display->socket_list, link) {
> +               wl_event_source_remove(s->source);
>                close(s->fd);
>                unlink(s->addr.sun_path);
>                close(s->fd_lock);
>                unlink(s->lock_addr);
>                free(s);
>        }
> +       wl_event_loop_destroy(display->loop);
>
>        wl_list_for_each_safe(global, gnext, &display->global_list, link)
>                free(global);
> @@ -858,9 +860,10 @@ wl_display_add_socket(struct wl_display *display, const char *name)
>                return -1;
>        }
>
> -       if (wl_event_loop_add_fd(display->loop, s->fd,
> -                                WL_EVENT_READABLE,
> -                                socket_data, display) == NULL) {
> +       s->source = wl_event_loop_add_fd(display->loop, s->fd,
> +                                        WL_EVENT_READABLE,
> +                                        socket_data, display);
> +       if (s->source == NULL) {
>                close(s->fd);
>                unlink(s->addr.sun_path);
>                free(s);
> --
> 1.7.3.4
>


More information about the wayland-devel mailing list