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.
This commit is contained in:
Kristian Høgsberg 2012-05-08 10:42:42 -04:00
parent f42d763cd0
commit c49f632dae

View file

@ -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;
}
wl_list_remove(&source->link);
wl_list_insert(&loop->destroy_list, &source->link);