comparison src/event/ngx_event.h @ 144:ef8c87afcfc5

nginx-0.0.1-2003-10-12-20:49:16 import
author Igor Sysoev <igor@sysoev.ru>
date Sun, 12 Oct 2003 16:49:16 +0000
parents 5526213be452
children fb61ba77beba
comparison
equal deleted inserted replaced
143:5526213be452 144:ef8c87afcfc5
22 22
23 struct ngx_event_s { 23 struct ngx_event_s {
24 void *data; 24 void *data;
25 void (*event_handler)(ngx_event_t *ev); 25 void (*event_handler)(ngx_event_t *ev);
26 26
27 #if 0
28 int (*close_handler)(ngx_event_t *ev);
29 #endif
30 void *context; 27 void *context;
31 char *action; 28 char *action;
32 29
33 unsigned int index; 30 unsigned int index;
34 31
35 ngx_event_t *prev; /* queue in mutex(), aio_read(), aio_write() */ 32 ngx_event_t *prev; /* queue in mutex(), aio_read(), aio_write() */
36 ngx_event_t *next; /* */ 33 ngx_event_t *next; /* */
37 34
38 #if 0
39 int (*timer_handler)(ngx_event_t *ev);
40 #endif
41 ngx_event_t *timer_prev; 35 ngx_event_t *timer_prev;
42 ngx_event_t *timer_next; 36 ngx_event_t *timer_next;
43 37
44 ngx_msec_t timer_delta; 38 ngx_msec_t timer_delta;
45 ngx_msec_t timer; 39 ngx_msec_t timer;
59 #if 0 53 #if 0
60 unsigned listening:1; 54 unsigned listening:1;
61 #endif 55 #endif
62 unsigned write:1; 56 unsigned write:1;
63 57
64 unsigned instance:1; /* used to detect stale events in kqueue, 58 /* used to detect stale events in kqueue, rt signals and epoll */
65 rt signals and epoll */ 59 unsigned instance:1;
66 60
61 /*
62 * event was passed or would be passed to a kernel;
63 * the posted aio operation.
64 */
67 unsigned active:1; 65 unsigned active:1;
66
67 /* ready event; the complete aio operation */
68 unsigned ready:1; 68 unsigned ready:1;
69
69 unsigned timedout:1; 70 unsigned timedout:1;
71 unsigned timer_set:1;
72
73 #if 1
70 unsigned blocked:1; 74 unsigned blocked:1;
71 unsigned timer_set:1; 75 #endif
72 unsigned delayed:1; 76 unsigned delayed:1;
73 77
74 unsigned process:1;
75 unsigned read_discarded:1; 78 unsigned read_discarded:1;
76 79
77 unsigned ignore_econnreset:1; 80 unsigned ignore_econnreset:1;
78 unsigned unexpected_eof:1; 81 unsigned unexpected_eof:1;
79 82
154 int (*init)(ngx_cycle_t *cycle); 157 int (*init)(ngx_cycle_t *cycle);
155 void (*done)(ngx_cycle_t *cycle); 158 void (*done)(ngx_cycle_t *cycle);
156 } ngx_event_actions_t; 159 } ngx_event_actions_t;
157 160
158 161
159 /* The event filter requires to read/write the whole data - 162 /*
160 select, poll, /dev/poll, kqueue. */ 163 * The event filter requires to read/write the whole data -
161 #define NGX_HAVE_LEVEL_EVENT 0x00000001 164 * select, poll, /dev/poll, kqueue.
162 165 */
163 /* The event filter is deleted after a notification without an additional 166 #define NGX_USE_LEVEL_EVENT 0x00000001
164 syscall - select, poll, kqueue. */ 167
165 #define NGX_HAVE_ONESHOT_EVENT 0x00000002 168 /*
166 169 * The event filter is deleted after a notification without an additional
167 /* The event filter notifies only the changes and an initial level - kqueue */ 170 * syscall - select, poll, kqueue.
168 #define NGX_HAVE_CLEAR_EVENT 0x00000004 171 */
169 172 #define NGX_USE_ONESHOT_EVENT 0x00000002
170 /* The event filter has kqueue features - the eof flag, errno, 173
171 available data, etc */ 174 /*
172 #define NGX_HAVE_KQUEUE_EVENT 0x00000008 175 * The event filter notifies only the changes and an initial level - kqueue.
173 176 */
174 /* The event filter supports low water mark - kqueue's NOTE_LOWAT. 177 #define NGX_USE_CLEAR_EVENT 0x00000004
175 kqueue in FreeBSD 4.1-4.2 has no NOTE_LOWAT so we need a separate flag */ 178
176 #define NGX_HAVE_LOWAT_EVENT 0x00000010 179 /*
177 180 * The event filter has kqueue features - the eof flag, errno,
178 /* The event filter notifies only the changes (the edges) 181 * available data, etc
179 but not an initial level - epoll */ 182 */
180 #define NGX_HAVE_EDGE_EVENT 0x00000020 183 #define NGX_HAVE_KQUEUE_EVENT 0x00000008
181 184
182 /* No need to add or delete the event filters - rt signals */ 185 /*
183 #define NGX_HAVE_SIGIO_EVENT 0x00000040 186 * The event filter supports low water mark - kqueue's NOTE_LOWAT.
184 187 * kqueue in FreeBSD 4.1-4.2 has no NOTE_LOWAT so we need a separate flag.
185 /* No need to add or delete the event filters - overlapped, aio_read, aioread */ 188 */
186 #define NGX_HAVE_AIO_EVENT 0x00000080 189 #define NGX_HAVE_LOWAT_EVENT 0x00000010
187 190
188 /* Need to add socket or handle only once - i/o completion port. 191 /*
189 It also requires HAVE_AIO_EVENT and NGX_HAVE_AIO_EVENT to be set */ 192 * The event filter notifies only the changes (the edges)
190 #define NGX_HAVE_IOCP_EVENT 0x00000100 193 * but not an initial level - epoll.
191 194 */
192 195 #define NGX_USE_EDGE_EVENT 0x00000020
193 #define NGX_USE_LEVEL_EVENT 0x00010000 196
194 #define NGX_USE_AIO_EVENT 0x00020000 197 /*
195 198 * No need to add or delete the event filters - rt signals.
196 199 */
197 /* Event filter is deleted before closing file. 200 #define NGX_USE_SIGIO_EVENT 0x00000040
198 Has no meaning for select, poll, epoll. 201
199 202 /*
200 kqueue: kqueue deletes event filters for file that closed 203 * No need to add or delete the event filters - overlapped, aio_read,
201 so we need only to delete filters in user-level batch array 204 * aioread, io_submit.
202 /dev/poll: we need to flush POLLREMOVE event before closing file */ 205 */
206 #define NGX_USE_AIO_EVENT 0x00000080
207
208 /*
209 * Need to add socket or handle only once - i/o completion port.
210 * It also requires HAVE_AIO_EVENT and NGX_HAVE_AIO_EVENT to be set.
211 */
212 #define NGX_USE_IOCP_EVENT 0x00000100
213
214
215
216 /*
217 * The event filter is deleted before the closing file.
218 * Has no meaning for select, poll, epoll.
219 *
220 * kqueue: kqueue deletes event filters for file that closed
221 * so we need only to delete filters in user-level batch array
222 * /dev/poll: we need to flush POLLREMOVE event before closing file
223 */
203 224
204 #define NGX_CLOSE_EVENT 1 225 #define NGX_CLOSE_EVENT 1
205 226
206 227
207 #if (HAVE_KQUEUE) 228 #if (HAVE_KQUEUE)
208 229
209 #define NGX_READ_EVENT EVFILT_READ 230 #define NGX_READ_EVENT EVFILT_READ
210 #define NGX_WRITE_EVENT EVFILT_WRITE 231 #define NGX_WRITE_EVENT EVFILT_WRITE
211 232
212 /* NGX_CLOSE_EVENT is the module flag and it would not go into a kernel 233 /*
213 so we need to choose the value that would not interfere with any existent 234 * NGX_CLOSE_EVENT is the module flag and it would not go into a kernel
214 and future flags. kqueue has such values - EV_FLAG1, EV_EOF and EV_ERROR. 235 * so we need to choose the value that would not interfere with any existent
215 They are reserved and cleared on a kernel entrance */ 236 * and future flags. kqueue has such values - EV_FLAG1, EV_EOF and EV_ERROR.
237 * They are reserved and cleared on a kernel entrance.
238 */
216 #undef NGX_CLOSE_EVENT 239 #undef NGX_CLOSE_EVENT
217 #define NGX_CLOSE_EVENT EV_FLAG1 240 #define NGX_CLOSE_EVENT EV_FLAG1
218 241
219 #define NGX_LEVEL_EVENT 0 242 #define NGX_LEVEL_EVENT 0
220 #define NGX_ONESHOT_EVENT EV_ONESHOT 243 #define NGX_ONESHOT_EVENT EV_ONESHOT
381 404
382 405
383 406
384 ngx_inline static int ngx_handle_read_event(ngx_event_t *rev) 407 ngx_inline static int ngx_handle_read_event(ngx_event_t *rev)
385 { 408 {
386 if (ngx_event_flags & (NGX_HAVE_AIO_EVENT|NGX_HAVE_EDGE_EVENT)) { 409 if (ngx_event_flags & (NGX_USE_AIO_EVENT|NGX_USE_EDGE_EVENT)) {
387 410
388 /* aio, iocp, epoll */ 411 /* aio, iocp, epoll */
389 412
390 return NGX_OK; 413 return NGX_OK;
391 } 414 }
392 415
393 if (ngx_event_flags & NGX_HAVE_CLEAR_EVENT) { 416 if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {
394 417
395 /* kqueue */ 418 /* kqueue */
396 419
397 if (!rev->active && !rev->ready) { 420 if (!rev->active && !rev->ready) {
398 if (ngx_add_event(rev, NGX_READ_EVENT, NGX_CLEAR_EVENT) 421 if (ngx_add_event(rev, NGX_READ_EVENT, NGX_CLEAR_EVENT)
424 447
425 return NGX_OK; 448 return NGX_OK;
426 } 449 }
427 450
428 451
452 ngx_inline static int ngx_handle_level_read_event(ngx_event_t *rev)
453 {
454 if (ngx_event_flags & NGX_USE_LEVEL_EVENT) {
455 if (!rev->active && !rev->ready) {
456 if (ngx_add_event(rev, NGX_READ_EVENT, NGX_LEVEL_EVENT)
457 == NGX_ERROR) {
458 return NGX_ERROR;
459 }
460
461 return NGX_OK;
462 }
463
464 if (rev->active && rev->ready) {
465 if (ngx_del_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) {
466 return NGX_ERROR;
467 }
468
469 return NGX_OK;
470 }
471 }
472
473 return NGX_OK;
474 }
475
476
429 ngx_inline static int ngx_handle_write_event(ngx_event_t *wev, int lowat) 477 ngx_inline static int ngx_handle_write_event(ngx_event_t *wev, int lowat)
430 { 478 {
431 if (ngx_event_flags & (NGX_HAVE_AIO_EVENT|NGX_HAVE_EDGE_EVENT)) { 479 if (ngx_event_flags & (NGX_USE_AIO_EVENT|NGX_USE_EDGE_EVENT)) {
432 480
433 /* aio, iocp, epoll */ 481 /* aio, iocp, epoll */
434 482
435 return NGX_OK; 483 return NGX_OK;
436 } 484 }
437 485
438 if (ngx_event_flags & NGX_HAVE_CLEAR_EVENT) { 486 if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {
439 487
440 /* kqueue */ 488 /* kqueue */
441 489
442 #if (HAVE_LOWAT_EVENT) /* kqueue's NOTE_LOWAT */ 490 #if (HAVE_LOWAT_EVENT) /* kqueue's NOTE_LOWAT */
443 491
476 524
477 return NGX_OK; 525 return NGX_OK;
478 } 526 }
479 527
480 528
529 ngx_inline static int ngx_handle_level_write_event(ngx_event_t *wev)
530 {
531 if (ngx_event_flags & NGX_USE_LEVEL_EVENT) {
532 if (!wev->active && !wev->ready) {
533 if (ngx_add_event(wev, NGX_WRITE_EVENT, NGX_LEVEL_EVENT)
534 == NGX_ERROR) {
535 return NGX_ERROR;
536 }
537
538 return NGX_OK;
539 }
540
541 if (wev->active && wev->ready) {
542 if (ngx_del_event(wev, NGX_WRITE_EVENT, 0) == NGX_ERROR) {
543 return NGX_ERROR;
544 }
545
546 return NGX_OK;
547 }
548 }
549
550 return NGX_OK;
551 }
552
481 553
482 /* ***************************** */ 554 /* ***************************** */
483 555
484 556
485 #endif /* _NGX_EVENT_H_INCLUDED_ */ 557 #endif /* _NGX_EVENT_H_INCLUDED_ */