comparison src/event/modules/ngx_kqueue_module.c @ 195:8dee38ea9117

nginx-0.0.1-2003-11-25-23:44:56 import
author Igor Sysoev <igor@sysoev.ru>
date Tue, 25 Nov 2003 20:44:56 +0000
parents 2357fa41738a
children 11fbd0fc041d
comparison
equal deleted inserted replaced
194:2357fa41738a 195:8dee38ea9117
188 } 188 }
189 189
190 190
191 static int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags) 191 static int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags)
192 { 192 {
193 ngx_event_t *e;
193 ngx_connection_t *c; 194 ngx_connection_t *c;
194 195
195 ev->active = 1; 196 ev->active = 1;
196 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0; 197 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0;
197 198
198 if (nchanges > 0 199 if (nchanges > 0
199 && ev->index < (u_int) nchanges 200 && ev->index < (u_int) nchanges
200 && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1) 201 && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1)
201 == (uintptr_t) ev) 202 == (uintptr_t) ev)
202 { 203 {
204 if (change_list[ev->index].flags == EV_DISABLE) {
205
206 #if (NGX_DEBUG_EVENT)
207 ngx_connection_t *c = (ngx_connection_t *) ev->data;
208 ngx_log_debug(ev->log, "kqueue event activated: %d: ft:%d" _
209 c->fd _ event);
210 #endif
211
212 /*
213 * if the EV_DISABLE is still not passed to a kernel
214 * we will not pass it
215 */
216
217 if (ev->index < (u_int) --nchanges) {
218 e = (ngx_event_t *) change_list[nchanges].udata;
219 change_list[ev->index] = change_list[nchanges];
220 e->index = ev->index;
221 }
222
223 return NGX_OK;
224 }
225
203 c = ev->data; 226 c = ev->data;
204 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, 227 ngx_log_error(NGX_LOG_ALERT, ev->log, 0,
205 "previous event on #%d were not passed in kernel", c->fd); 228 "previous event on #%d were not passed in kernel", c->fd);
206 229
207 return NGX_ERROR; 230 return NGX_ERROR;
208 } 231 }
209 232
210 return ngx_kqueue_set_event(ev, event, EV_ADD|flags); 233 return ngx_kqueue_set_event(ev, event, EV_ADD|EV_ENABLE|flags);
211 } 234 }
212 235
213 236
214 static int ngx_kqueue_del_event(ngx_event_t *ev, int event, u_int flags) 237 static int ngx_kqueue_del_event(ngx_event_t *ev, int event, u_int flags)
215 { 238 {
284 change_list[nchanges].ident = c->fd; 307 change_list[nchanges].ident = c->fd;
285 change_list[nchanges].filter = filter; 308 change_list[nchanges].filter = filter;
286 change_list[nchanges].flags = flags; 309 change_list[nchanges].flags = flags;
287 change_list[nchanges].udata = (void *) ((uintptr_t) ev | ev->instance); 310 change_list[nchanges].udata = (void *) ((uintptr_t) ev | ev->instance);
288 311
312 if (filter == EVFILT_VNODE) {
313 change_list[nchanges].fflags = NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND
314 |NOTE_ATTRIB|NOTE_RENAME|NOTE_REVOKE;
315 change_list[nchanges].data = 0;
316
317 } else {
289 #if (HAVE_LOWAT_EVENT) 318 #if (HAVE_LOWAT_EVENT)
290 319 if (flags & NGX_LOWAT_EVENT) {
291 if (flags & NGX_LOWAT_EVENT) { 320 change_list[nchanges].fflags = NOTE_LOWAT;
292 change_list[nchanges].fflags = NOTE_LOWAT; 321 change_list[nchanges].data = ev->available;
293 change_list[nchanges].data = ev->available; 322
294 323 } else {
295 } else { 324 change_list[nchanges].fflags = 0;
325 change_list[nchanges].data = 0;
326 }
327 #else
296 change_list[nchanges].fflags = 0; 328 change_list[nchanges].fflags = 0;
297 change_list[nchanges].data = 0; 329 change_list[nchanges].data = 0;
298 } 330 #endif
299 331 }
300 #else
301
302 change_list[nchanges].fflags = 0;
303 change_list[nchanges].data = 0;
304
305 #endif
306 332
307 ev->index = nchanges; 333 ev->index = nchanges;
308 334
309 nchanges++; 335 nchanges++;
310 336
363 389
364 #if (NGX_DEBUG_EVENT) 390 #if (NGX_DEBUG_EVENT)
365 ngx_log_debug(log, "kevent timer: %d, delta: %d" _ timer _ (int) delta); 391 ngx_log_debug(log, "kevent timer: %d, delta: %d" _ timer _ (int) delta);
366 #endif 392 #endif
367 393
394 #if 0
368 /* 395 /*
369 * The expired timers must be handled before a processing of the events 396 * The expired timers must be handled before a processing of the events
370 * because the new timers can be added during a processing 397 * because the new timers can be added during a processing
371 */ 398 */
372 399
373 ngx_event_expire_timers((ngx_msec_t) delta); 400 ngx_event_expire_timers((ngx_msec_t) delta);
401 #endif
402
403 ngx_event_set_timer_delta((ngx_msec_t) delta);
374 404
375 } else { 405 } else {
376 if (events == 0) { 406 if (events == 0) {
377 ngx_log_error(NGX_LOG_ALERT, log, 0, 407 ngx_log_error(NGX_LOG_ALERT, log, 0,
378 "kevent() returned no events without timeout"); 408 "kevent() returned no events without timeout");
450 480
451 ev->event_handler(ev); 481 ev->event_handler(ev);
452 482
453 break; 483 break;
454 484
485 case EVFILT_VNODE:
486 ev->kq_vnode = 1;
487
488 ev->event_handler(ev);
489
490 break;
491
455 case EVFILT_AIO: 492 case EVFILT_AIO:
456 ev->complete = 1; 493 ev->complete = 1;
457 ev->ready = 1; 494 ev->ready = 1;
458 495
459 ev->event_handler(ev); 496 ev->event_handler(ev);
461 break; 498 break;
462 499
463 500
464 default: 501 default:
465 ngx_log_error(NGX_LOG_ALERT, log, 0, 502 ngx_log_error(NGX_LOG_ALERT, log, 0,
466 "unexpected kevent filter %d" _ event_list[i].filter); 503 "unexpected kevent() filter %d",
467 } 504 event_list[i].filter);
505 }
506 }
507
508 if (timer) {
509 ngx_event_expire_timers((ngx_msec_t) delta);
468 } 510 }
469 511
470 return NGX_OK; 512 return NGX_OK;
471 } 513 }
472 514