Mercurial > hg > nginx
comparison src/event/modules/ngx_kqueue_module.c @ 372:c9fdfccebc49
nginx-0.0.7-2004-06-29-01:03:14 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 28 Jun 2004 21:03:14 +0000 |
parents | 780e93985b93 |
children | 018569a8f09c |
comparison
equal
deleted
inserted
replaced
371:780e93985b93 | 372:c9fdfccebc49 |
---|---|
191 | 191 |
192 ev->active = 1; | 192 ev->active = 1; |
193 ev->disabled = 0; | 193 ev->disabled = 0; |
194 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0; | 194 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0; |
195 | 195 |
196 if (nchanges > 0 | 196 if (ngx_thread_main() |
197 && nchanges > 0 | |
197 && ev->index < (u_int) nchanges | 198 && ev->index < (u_int) nchanges |
198 && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1) | 199 && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1) |
199 == (uintptr_t) ev) | 200 == (uintptr_t) ev) |
200 { | 201 { |
201 if (change_list[ev->index].flags == EV_DISABLE) { | 202 if (change_list[ev->index].flags == EV_DISABLE) { |
235 | 236 |
236 ev->active = 0; | 237 ev->active = 0; |
237 ev->disabled = 0; | 238 ev->disabled = 0; |
238 ev->posted = 0; | 239 ev->posted = 0; |
239 | 240 |
240 if (nchanges > 0 | 241 if (ngx_thread_main() |
242 && nchanges > 0 | |
241 && ev->index < (u_int) nchanges | 243 && ev->index < (u_int) nchanges |
242 && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1) | 244 && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1) |
243 == (uintptr_t) ev) | 245 == (uintptr_t) ev) |
244 { | 246 { |
245 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, | 247 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, |
278 | 280 |
279 static ngx_int_t ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags) | 281 static ngx_int_t ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags) |
280 { | 282 { |
281 struct timespec ts; | 283 struct timespec ts; |
282 ngx_connection_t *c; | 284 ngx_connection_t *c; |
285 struct kevent *kev, kv; | |
283 | 286 |
284 c = ev->data; | 287 c = ev->data; |
285 | 288 |
286 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, | 289 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, |
287 "kevent set event: %d: ft:%d fl:%04X", | 290 "kevent set event: %d: ft:%d fl:%04X", |
288 c->fd, filter, flags); | 291 c->fd, filter, flags); |
289 | 292 |
290 if (nchanges >= max_changes) { | 293 if (ngx_thread_main() && nchanges >= max_changes) { |
291 ngx_log_error(NGX_LOG_WARN, ev->log, 0, | 294 ngx_log_error(NGX_LOG_WARN, ev->log, 0, |
292 "kqueue change list is filled up"); | 295 "kqueue change list is filled up"); |
293 | 296 |
294 ts.tv_sec = 0; | 297 ts.tv_sec = 0; |
295 ts.tv_nsec = 0; | 298 ts.tv_nsec = 0; |
300 } | 303 } |
301 | 304 |
302 nchanges = 0; | 305 nchanges = 0; |
303 } | 306 } |
304 | 307 |
305 change_list[nchanges].ident = c->fd; | 308 kev = ngx_thread_main() ? &change_list[nchanges] : &kv; |
306 change_list[nchanges].filter = filter; | 309 |
307 change_list[nchanges].flags = flags; | 310 kev->ident = c->fd; |
308 change_list[nchanges].udata = (void *) ((uintptr_t) ev | ev->instance); | 311 kev->filter = filter; |
312 kev->flags = flags; | |
313 kev->udata = (void *) ((uintptr_t) ev | ev->instance); | |
309 | 314 |
310 if (filter == EVFILT_VNODE) { | 315 if (filter == EVFILT_VNODE) { |
311 change_list[nchanges].fflags = NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND | 316 kev->fflags = NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND |
312 |NOTE_ATTRIB|NOTE_RENAME | 317 |NOTE_ATTRIB|NOTE_RENAME |
313 #if (__FreeBSD__ == 4 && __FreeBSD_version >= 430000) \ | 318 #if (__FreeBSD__ == 4 && __FreeBSD_version >= 430000) \ |
314 || __FreeBSD_version >= 500018 | 319 || __FreeBSD_version >= 500018 |
315 |NOTE_REVOKE | 320 |NOTE_REVOKE |
316 #endif | 321 #endif |
317 ; | 322 ; |
318 change_list[nchanges].data = 0; | 323 kev->data = 0; |
319 | 324 |
320 } else { | 325 } else { |
321 #if (HAVE_LOWAT_EVENT) | 326 #if (HAVE_LOWAT_EVENT) |
322 if (flags & NGX_LOWAT_EVENT) { | 327 if (flags & NGX_LOWAT_EVENT) { |
323 change_list[nchanges].fflags = NOTE_LOWAT; | 328 kev->fflags = NOTE_LOWAT; |
324 change_list[nchanges].data = ev->available; | 329 kev->data = ev->available; |
325 | 330 |
326 } else { | 331 } else { |
327 change_list[nchanges].fflags = 0; | 332 kev->fflags = 0; |
328 change_list[nchanges].data = 0; | 333 kev->data = 0; |
329 } | 334 } |
330 #else | 335 #else |
331 change_list[nchanges].fflags = 0; | 336 kev->fflags = 0; |
332 change_list[nchanges].data = 0; | 337 kev->data = 0; |
333 #endif | 338 #endif |
334 } | 339 } |
335 | 340 |
336 ev->index = nchanges; | 341 if (ngx_thread_main()) { |
337 | 342 ev->index = nchanges; |
338 nchanges++; | 343 nchanges++; |
344 | |
345 } else { | |
346 ts.tv_sec = 0; | |
347 ts.tv_nsec = 0; | |
348 | |
349 if (kevent(ngx_kqueue, &kv, 1, NULL, 0, &ts) == -1) { | |
350 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "kevent() failed"); | |
351 return NGX_ERROR; | |
352 } | |
353 } | |
339 | 354 |
340 return NGX_OK; | 355 return NGX_OK; |
341 } | 356 } |
342 | 357 |
343 | 358 |