server: destroy the socket event source on display destroy
authorPekka Paalanen <ppaalanen@gmail.com>
Thu, 22 Dec 2011 14:52:37 +0000 (16:52 +0200)
committerKristian Høgsberg <krh@bitplanet.net>
Thu, 22 Dec 2011 15:40:39 +0000 (10:40 -0500)
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.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
src/wayland-server.c

index 87e4ed5..415173b 100644 (file)
@@ -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);