ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libev/ev_kqueue.c
(Generate patch)

Comparing libev/ev_kqueue.c (file contents):
Revision 1.53 by root, Sun Feb 12 08:39:38 2012 UTC vs.
Revision 1.54 by root, Mon Apr 2 18:39:54 2012 UTC

153} 153}
154 154
155int inline_size 155int inline_size
156kqueue_init (EV_P_ int flags) 156kqueue_init (EV_P_ int flags)
157{ 157{
158 /* Initialize the kernel queue */ 158 /* initialize the kernel queue */
159 kqueue_fd_pid = getpid ();
159 if ((backend_fd = kqueue ()) < 0) 160 if ((backend_fd = kqueue ()) < 0)
160 return 0; 161 return 0;
161 162
162 fcntl (backend_fd, F_SETFD, FD_CLOEXEC); /* not sure if necessary, hopefully doesn't hurt */ 163 fcntl (backend_fd, F_SETFD, FD_CLOEXEC); /* not sure if necessary, hopefully doesn't hurt */
163 164
183} 184}
184 185
185void inline_size 186void inline_size
186kqueue_fork (EV_P) 187kqueue_fork (EV_P)
187{ 188{
189 /* some BSD kernels don't just destroy the kqueue itself,
190 * but also close the fd, which isn't documented, and
191 * impossible to support properly.
192 * we remember the pid of the kqueue call and only close
193 * the fd if the pid is still the same.
194 * this leaks fds on sane kernels, but BSD interfaces are
195 * notoriously buggy and rarely get fixed.
196 */
197 pid_t newpid = getpid ();
198
199 if (newpid == kqueue_fd_pid)
188 close (backend_fd); 200 close (backend_fd);
189 201
202 kqueue_fd_pid = newpid;
190 while ((backend_fd = kqueue ()) < 0) 203 while ((backend_fd = kqueue ()) < 0)
191 ev_syserr ("(libev) kqueue"); 204 ev_syserr ("(libev) kqueue");
192 205
193 fcntl (backend_fd, F_SETFD, FD_CLOEXEC); 206 fcntl (backend_fd, F_SETFD, FD_CLOEXEC);
194 207

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines