diff options
author | Kristian Høgsberg <krh@bitplanet.net> | 2012-05-08 10:42:42 -0400 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2012-05-08 10:42:42 -0400 |
commit | c49f632dae67ee3055e4874f028f723663486da6 (patch) | |
tree | 1b8b9d6da272385d3e2010ed9ef7d4f5c4bfe7d7 | |
parent | f42d763cd0454559a882e88ce071892f071db791 (diff) |
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.
-rw-r--r-- | src/event-loop.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/event-loop.c b/src/event-loop.c index b881a0d..a839daf 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); |