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

Reply via email to