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.6 by root, Sat Nov 3 21:58:51 2007 UTC vs.
Revision 1.10 by root, Tue Nov 6 00:52:33 2007 UTC

83 ts.tv_nsec = (long)(timeout - (ev_tstamp)ts.tv_sec) * 1e9; 83 ts.tv_nsec = (long)(timeout - (ev_tstamp)ts.tv_sec) * 1e9;
84 res = kevent (kqueue_fd, kqueue_changes, kqueue_changecnt, kqueue_events, kqueue_eventmax, &ts); 84 res = kevent (kqueue_fd, kqueue_changes, kqueue_changecnt, kqueue_events, kqueue_eventmax, &ts);
85 kqueue_changecnt = 0; 85 kqueue_changecnt = 0;
86 86
87 if (res < 0) 87 if (res < 0)
88 {
89 if (errno != EINTR)
90 syserr ("(libev) kevent");
91
88 return; 92 return;
93 }
89 94
90 for (i = 0; i < res; ++i) 95 for (i = 0; i < res; ++i)
91 { 96 {
92 if (kqueue_events [i].flags & EV_ERROR) 97 if (kqueue_events [i].flags & EV_ERROR)
93 { 98 {
116 ); 121 );
117 } 122 }
118 123
119 if (expect_false (res == kqueue_eventmax)) 124 if (expect_false (res == kqueue_eventmax))
120 { 125 {
121 free (kqueue_events); 126 ev_free (kqueue_events);
122 kqueue_eventmax = array_roundsize (kqueue_events, kqueue_eventmax << 1); 127 kqueue_eventmax = array_roundsize (kqueue_events, kqueue_eventmax << 1);
123 kqueue_events = malloc (sizeof (struct kevent) * kqueue_eventmax); 128 kqueue_events = ev_malloc (sizeof (struct kevent) * kqueue_eventmax);
124 } 129 }
125} 130}
126 131
127static int 132static int
128kqueue_init (EV_P_ int flags) 133kqueue_init (EV_P_ int flags)
130 struct kevent ch, ev; 135 struct kevent ch, ev;
131 136
132 /* Initalize the kernel queue */ 137 /* Initalize the kernel queue */
133 if ((kqueue_fd = kqueue ()) < 0) 138 if ((kqueue_fd = kqueue ()) < 0)
134 return 0; 139 return 0;
140
141 fcntl (kqueue_fd, F_SETFD, FD_CLOEXEC); /* not sure if necessary, hopefully doesn't hurt */
135 142
136 /* Check for Mac OS X kqueue bug. */ 143 /* Check for Mac OS X kqueue bug. */
137 ch.ident = -1; 144 ch.ident = -1;
138 ch.filter = EVFILT_READ; 145 ch.filter = EVFILT_READ;
139 ch.flags = EV_ADD; 146 ch.flags = EV_ADD;
155 method_fudge = 1e-3; /* needed to compensate for kevent returning early */ 162 method_fudge = 1e-3; /* needed to compensate for kevent returning early */
156 method_modify = kqueue_modify; 163 method_modify = kqueue_modify;
157 method_poll = kqueue_poll; 164 method_poll = kqueue_poll;
158 165
159 kqueue_eventmax = 64; /* intiial number of events receivable per poll */ 166 kqueue_eventmax = 64; /* intiial number of events receivable per poll */
160 kqueue_events = malloc (sizeof (struct kevent) * kqueue_eventmax); 167 kqueue_events = ev_malloc (sizeof (struct kevent) * kqueue_eventmax);
168
169 kqueue_changes = 0;
170 kqueue_changemax = 0;
171 kqueue_changecnt = 0;
161 172
162 return EVMETHOD_KQUEUE; 173 return EVMETHOD_KQUEUE;
163} 174}
164 175
176static void
177kqueue_destroy (EV_P)
178{
179 close (kqueue_fd);
180
181 ev_free (kqueue_events);
182 ev_free (kqueue_changes);
183}
184
185static void
186kqueue_fork (EV_P)
187{
188 for (;;)
189 {
190 kqueue_fd = kqueue ();
191
192 if (kqueue_fd >= 0)
193 break;
194
195 syserr ("(libev) kqueue");
196 }
197
198 fcntl (kqueue_fd, F_SETFD, FD_CLOEXEC);
199
200 /* re-register interest in fds */
201 fd_rearm_all (EV_A);
202}
203

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines