From c49f632dae67ee3055e4874f028f723663486da6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Tue, 8 May 2012 10:42:42 -0400 Subject: [PATCH] event-loop: Delete fd from epoll when removing event source Closing an fd will remove it from the epoll set only if it hasn't been dup'ed. In other words, the fd is only removed from epoll when all file descriptors referring to the open file has been close. We now dup fd for fd sources, so we need to use EPOLL_CTL_DEL directly now. --- src/event-loop.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/event-loop.c b/src/event-loop.c index b881a0d6..a839dafb 100644 --- a/src/event-loop.c +++ b/src/event-loop.c @@ -309,10 +309,14 @@ wl_event_source_remove(struct wl_event_source *source) { struct wl_event_loop *loop = source->loop; - if (source->fd >= 0) + /* We need to explicitly remove the fd, since closing the fd + * isn't enough in case we've dup'ed the fd. */ + if (source->fd >= 0) { + epoll_ctl(loop->epoll_fd, EPOLL_CTL_DEL, source->fd, NULL); close(source->fd); + source->fd = -1; + } - source->fd = -1; wl_list_remove(&source->link); wl_list_insert(&loop->destroy_list, &source->link);