Revision: 23333 http://trac.macosforge.org/projects/launchd/changeset/23333 Author: zarzycki@apple.com Date: 2007-08-14 09:06:10 -0700 (Tue, 14 Aug 2007) Log Message: ----------- <rdar://problem/5321044> Bug: launchd_core_logic.c:3012 (23294):2: kevent_mod(si->fd, EVFILT_VNODE, EV_ADD, fflags, 0, j) != -1 Modified Paths: -------------- trunk/launchd/src/launchd_core_logic.c trunk/launchd/src/launchd_runtime.c Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2007-08-13 23:05:27 UTC (rev 23332) +++ trunk/launchd/src/launchd_core_logic.c 2007-08-14 16:06:10 UTC (rev 23333) @@ -3044,22 +3044,31 @@ return; } - if (si->fd == -1) { - if ((si->fd = _fd(open(which_path, O_EVTONLY|O_NOCTTY))) == -1) { - which_path = parentdir_path; - si->fd = _fd(open(which_path, O_EVTONLY|O_NOCTTY)); + do { + if (si->fd == -1) { + if ((si->fd = _fd(open(which_path, O_EVTONLY|O_NOCTTY))) == -1) { + which_path = parentdir_path; + si->fd = _fd(open(which_path, O_EVTONLY|O_NOCTTY)); + } } - } - if (si->fd == -1) { - return job_log_error(j, LOG_ERR, "Watchpath monitoring failed on \"%s\"", which_path); - } + if (si->fd == -1) { + return job_log_error(j, LOG_ERR, "Watchpath monitoring failed on \"%s\"", which_path); + } - job_log(j, LOG_DEBUG, "Watching Vnode: %d", si->fd); - if (!job_assumes(j, kevent_mod(si->fd, EVFILT_VNODE, EV_ADD, fflags, 0, j) != -1)) { - /* Extra logging for 5321044 */ - job_log(j, LOG_ERR, "Bug (5321044): si->why == %u si->fd == %d fflags = 0x%x j == %p", si->why, si->fd, fflags, j); - } + job_log(j, LOG_DEBUG, "Watching Vnode: %d", si->fd); + + if (kevent_mod(si->fd, EVFILT_VNODE, EV_ADD, fflags, 0, j) == -1) { + /* + * The FD can be revoked between the open() and kevent(). + * This is similar to the inability for kevents to be + * attached to short lived zombie processes after fork() + * but before kevent(). + */ + job_assumes(j, runtime_close(si->fd) == 0); + si->fd = -1; + } + } while (si->fd == -1); } void Modified: trunk/launchd/src/launchd_runtime.c =================================================================== --- trunk/launchd/src/launchd_runtime.c 2007-08-13 23:05:27 UTC (rev 23332) +++ trunk/launchd/src/launchd_runtime.c 2007-08-14 16:06:10 UTC (rev 23333) @@ -720,22 +720,17 @@ r = kevent(mainkq, &kev, 1, &kev, 1, NULL); -#define BUG_5321044_RESEARCH 1 -#if BUG_5321044_RESEARCH - if (r != 1) { - runtime_syslog(LOG_ERR, "Bug (5321044): kevent_mod() == %d", r); + if (!launchd_assumes(r == 1)) { return -1; } if (launchd_assumes(kev.flags & EV_ERROR)) { - if ((flags & EV_ADD) && kev.data) { - runtime_syslog(LOG_ERR, "Bug (5321044): See next line."); + if ((flags & EV_ADD) && !launchd_assumes(kev.data == 0)) { log_kevent_struct(LOG_ERR, &kev, 0); errno = kev.data; return -1; } } -#endif return r; }
participants (1)
-
source_changes@macosforge.org