Some patches for event-loop.c -- the signal & timer fds were never closed.
In the future do you prefer patches standalone or archived? Regards, Iskren
From 4313eca27b083b18dc01f127ca927fc0849fe0ee Mon Sep 17 00:00:00 2001 From: Iskren Chernev <[email protected]> Date: Sun, 13 Mar 2011 16:54:07 +0200 Subject: [PATCH 1/4] Close timer file descriptors in event loop on remove and failure. --- wayland/event-loop.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/wayland/event-loop.c b/wayland/event-loop.c index bf2a9aa..1709f0e 100644 --- a/wayland/event-loop.c +++ b/wayland/event-loop.c @@ -175,6 +175,7 @@ wl_event_source_timer_remove(struct wl_event_source *source) int fd; fd = timer_source->fd; + close(fd); free(source); return epoll_ctl(loop->epoll_fd, EPOLL_CTL_DEL, fd, NULL); @@ -215,6 +216,7 @@ wl_event_loop_add_timer(struct wl_event_loop *loop, ep.data.ptr = source; if (epoll_ctl(loop->epoll_fd, EPOLL_CTL_ADD, source->fd, &ep) < 0) { + close(source->fd); free(source); return NULL; } -- 1.7.4
From df410078f4527d40d002df5c3892fb4d243ecf87 Mon Sep 17 00:00:00 2001 From: Iskren Chernev <[email protected]> Date: Sun, 13 Mar 2011 16:59:30 +0200 Subject: [PATCH 2/4] Fix event loop timer update. It can now handle delays greater than 2 seconds without overflowing. --- wayland/event-loop.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/wayland/event-loop.c b/wayland/event-loop.c index 1709f0e..6c0faf2 100644 --- a/wayland/event-loop.c +++ b/wayland/event-loop.c @@ -233,8 +233,8 @@ wl_event_source_timer_update(struct wl_event_source *source, int ms_delay) its.it_interval.tv_sec = 0; its.it_interval.tv_nsec = 0; - its.it_value.tv_sec = 0; - its.it_value.tv_nsec = ms_delay * 1000 * 1000; + its.it_value.tv_sec = ms_delay / 1000; + its.it_value.tv_nsec = (ms_delay % 1000) * 1000 * 1000; if (timerfd_settime(timer_source->fd, 0, &its, NULL) < 0) { fprintf(stderr, "could not set timerfd\n: %m"); return -1; -- 1.7.4
From 19b0387503827e20ba0c2208b2a5d039efeabb1d Mon Sep 17 00:00:00 2001 From: Iskren Chernev <[email protected]> Date: Sun, 13 Mar 2011 17:01:33 +0200 Subject: [PATCH 3/4] Stored signal_number in event_source structure. signal_number was not previously stored, so the callbacks didn't get a correct signal_number as their first argument. --- wayland/event-loop.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/wayland/event-loop.c b/wayland/event-loop.c index 6c0faf2..76e5555 100644 --- a/wayland/event-loop.c +++ b/wayland/event-loop.c @@ -299,6 +299,7 @@ wl_event_loop_add_signal(struct wl_event_loop *loop, source->base.interface = &signal_source_interface; source->base.loop = loop; + source->signal_number = signal_number; sigemptyset(&mask); sigaddset(&mask, signal_number); -- 1.7.4
From 8be37d9a4192c093d3865de65a1140aea301a512 Mon Sep 17 00:00:00 2001 From: Iskren Chernev <[email protected]> Date: Sun, 13 Mar 2011 17:03:12 +0200 Subject: [PATCH 4/4] Close signal file descriptor in event loop on remove and failure. --- wayland/event-loop.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/wayland/event-loop.c b/wayland/event-loop.c index 76e5555..356b829 100644 --- a/wayland/event-loop.c +++ b/wayland/event-loop.c @@ -273,6 +273,7 @@ wl_event_source_signal_remove(struct wl_event_source *source) int fd; fd = signal_source->fd; + close(fd); free(source); return epoll_ctl(loop->epoll_fd, EPOLL_CTL_DEL, fd, NULL); @@ -319,6 +320,7 @@ wl_event_loop_add_signal(struct wl_event_loop *loop, ep.data.ptr = source; if (epoll_ctl(loop->epoll_fd, EPOLL_CTL_ADD, source->fd, &ep) < 0) { + close(source->fd); free(source); return NULL; } -- 1.7.4
_______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
