diff options
-rw-r--r-- | Changes | 4 | ||||
-rw-r--r-- | ev.c | 24 |
2 files changed, 26 insertions, 2 deletions
@@ -1,11 +1,15 @@ Revision history for libev, a high-performance and full-featured event loop. - backport inotify code to C89. + - inotify file descriptors were not properly recreated after a fork, + and could leak into child processes. - implement EV_WIN32_HANDLE_TO_FD and EV_WIN32_CLOSE_FD configuration symbols to make it easier for apps to do their own fd management. - support EV_IDLE_ENABLE being disabled in ev++.h (patch by Didier Spezia). - point out the unspecified signal mask in the documentation. + - take advantage of inotify_init1, if available, to set cloexec/nonblock + on fd creation, to avoid races. - changed minimum glibc requirement from glibc 2.9 to 2.7, for signalfd. @@ -2999,6 +2999,17 @@ check_2625 (EV_P) fs_2625 = 1; } +inline_size int +infy_newfd (void) +{ +#if defined (IN_CLOEXEC) && defined (IN_NONBLOCK) + int fd = inotify_init1 (IN_CLOEXEC | IN_NONBLOCK); + if (fd >= 0) + return fd; +#endif + return inotify_init (); +} + inline_size void infy_init (EV_P) { @@ -3009,10 +3020,11 @@ infy_init (EV_P) check_2625 (EV_A); - fs_fd = inotify_init (); + fs_fd = infy_newfd (); if (fs_fd >= 0) { + fd_intern (fs_fd); ev_io_init (&fs_w, infy_cb, fs_fd, EV_READ); ev_set_priority (&fs_w, EV_MAXPRI); ev_io_start (EV_A_ &fs_w); @@ -3027,8 +3039,16 @@ infy_fork (EV_P) if (fs_fd < 0) return; + ev_io_stop (EV_A_ &fs_w); close (fs_fd); - fs_fd = inotify_init (); + fs_fd = infy_newfd (); + + if (fs_fd >= 0) + { + fd_intern (fs_fd); + ev_io_set (&fs_w, fs_fd, EV_READ); + ev_io_start (EV_A_ &fs_w); + } for (slot = 0; slot < EV_INOTIFY_HASHSIZE; ++slot) { |