mirror of
https://gitlab.freedesktop.org/wayland/wayland.git
synced 2025-11-04 13:29:51 -05:00
server: destroy the socket event source on display destroy
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>
This commit is contained in:
parent
1f58d155da
commit
aad1e19058
1 changed files with 7 additions and 4 deletions
|
|
@ -51,6 +51,7 @@ struct wl_socket {
|
||||||
struct sockaddr_un addr;
|
struct sockaddr_un addr;
|
||||||
char lock_addr[113];
|
char lock_addr[113];
|
||||||
struct wl_list link;
|
struct wl_list link;
|
||||||
|
struct wl_event_source *source;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct wl_client {
|
struct wl_client {
|
||||||
|
|
@ -667,14 +668,15 @@ wl_display_destroy(struct wl_display *display)
|
||||||
struct wl_socket *s, *next;
|
struct wl_socket *s, *next;
|
||||||
struct wl_global *global, *gnext;
|
struct wl_global *global, *gnext;
|
||||||
|
|
||||||
wl_event_loop_destroy(display->loop);
|
|
||||||
wl_list_for_each_safe(s, next, &display->socket_list, link) {
|
wl_list_for_each_safe(s, next, &display->socket_list, link) {
|
||||||
|
wl_event_source_remove(s->source);
|
||||||
close(s->fd);
|
close(s->fd);
|
||||||
unlink(s->addr.sun_path);
|
unlink(s->addr.sun_path);
|
||||||
close(s->fd_lock);
|
close(s->fd_lock);
|
||||||
unlink(s->lock_addr);
|
unlink(s->lock_addr);
|
||||||
free(s);
|
free(s);
|
||||||
}
|
}
|
||||||
|
wl_event_loop_destroy(display->loop);
|
||||||
|
|
||||||
wl_list_for_each_safe(global, gnext, &display->global_list, link)
|
wl_list_for_each_safe(global, gnext, &display->global_list, link)
|
||||||
free(global);
|
free(global);
|
||||||
|
|
@ -858,9 +860,10 @@ wl_display_add_socket(struct wl_display *display, const char *name)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wl_event_loop_add_fd(display->loop, s->fd,
|
s->source = wl_event_loop_add_fd(display->loop, s->fd,
|
||||||
WL_EVENT_READABLE,
|
WL_EVENT_READABLE,
|
||||||
socket_data, display) == NULL) {
|
socket_data, display);
|
||||||
|
if (s->source == NULL) {
|
||||||
close(s->fd);
|
close(s->fd);
|
||||||
unlink(s->addr.sun_path);
|
unlink(s->addr.sun_path);
|
||||||
free(s);
|
free(s);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue