Mercurial > hg > nginx-quic
comparison src/event/ngx_event.h @ 163:fb61ba77beba
nginx-0.0.1-2003-10-28-18:45:41 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Tue, 28 Oct 2003 15:45:41 +0000 |
parents | ef8c87afcfc5 |
children | 84036764e215 |
comparison
equal
deleted
inserted
replaced
162:96993d4d5067 | 163:fb61ba77beba |
---|---|
27 void *context; | 27 void *context; |
28 char *action; | 28 char *action; |
29 | 29 |
30 unsigned int index; | 30 unsigned int index; |
31 | 31 |
32 ngx_event_t *prev; /* queue in mutex(), aio_read(), aio_write() */ | 32 /* queue in mutex(), aio_read(), aio_write() */ |
33 ngx_event_t *next; /* */ | 33 ngx_event_t *prev; |
34 ngx_event_t *next; | |
34 | 35 |
35 ngx_event_t *timer_prev; | 36 ngx_event_t *timer_prev; |
36 ngx_event_t *timer_next; | 37 ngx_event_t *timer_next; |
37 | 38 |
38 ngx_msec_t timer_delta; | 39 ngx_msec_t timer_delta; |
39 ngx_msec_t timer; | 40 ngx_msec_t timer; |
40 | 41 |
41 ngx_log_t *log; | 42 ngx_log_t *log; |
42 | 43 |
43 int available; /* kqueue only: */ | 44 /* |
44 /* accept: number of sockets that wait */ | 45 * kqueue only: |
45 /* to be accepted */ | 46 * accept: number of sockets that wait to be accepted |
46 /* read: bytes to read */ | 47 * read: bytes to read |
47 /* write: available space in buffer */ | 48 * write: available space in buffer |
48 /* otherwise: */ | 49 * |
49 /* accept: 1 if accept many, 0 otherwise */ | 50 * otherwise: |
51 * accept: 1 if accept many, 0 otherwise | |
52 */ | |
53 int available; | |
50 | 54 |
51 unsigned oneshot:1; | 55 unsigned oneshot:1; |
52 | 56 |
53 #if 0 | |
54 unsigned listening:1; | |
55 #endif | |
56 unsigned write:1; | 57 unsigned write:1; |
57 | 58 |
58 /* used to detect stale events in kqueue, rt signals and epoll */ | 59 /* used to detect the stale events in kqueue, rt signals and epoll */ |
59 unsigned instance:1; | 60 unsigned instance:1; |
60 | 61 |
61 /* | 62 /* |
62 * event was passed or would be passed to a kernel; | 63 * event was passed or would be passed to a kernel; |
63 * the posted aio operation. | 64 * the posted aio operation. |
65 unsigned active:1; | 66 unsigned active:1; |
66 | 67 |
67 /* ready event; the complete aio operation */ | 68 /* ready event; the complete aio operation */ |
68 unsigned ready:1; | 69 unsigned ready:1; |
69 | 70 |
71 unsigned eof:1; | |
72 unsigned error:1; | |
73 | |
70 unsigned timedout:1; | 74 unsigned timedout:1; |
71 unsigned timer_set:1; | 75 unsigned timer_set:1; |
72 | 76 |
73 #if 1 | |
74 unsigned blocked:1; | |
75 #endif | |
76 unsigned delayed:1; | 77 unsigned delayed:1; |
77 | 78 |
78 unsigned read_discarded:1; | 79 unsigned read_discarded:1; |
79 | 80 |
80 unsigned ignore_econnreset:1; | 81 unsigned ignore_econnreset:1; |
85 #if (WIN32) | 86 #if (WIN32) |
86 unsigned accept_context_updated:1; | 87 unsigned accept_context_updated:1; |
87 #endif | 88 #endif |
88 | 89 |
89 #if (HAVE_KQUEUE) | 90 #if (HAVE_KQUEUE) |
90 unsigned eof:1; | 91 unsigned kq_eof:1; |
91 int error; | 92 int kq_errno; |
92 #endif | 93 #endif |
93 | 94 |
94 #if (HAVE_LOWAT_EVENT) /* kqueue's NOTE_LOWAT */ | 95 #if (HAVE_LOWAT_EVENT) /* kqueue's NOTE_LOWAT */ |
95 int lowat; | 96 int lowat; |
96 #endif | 97 #endif |
106 | 107 |
107 #endif | 108 #endif |
108 | 109 |
109 | 110 |
110 #if 0 | 111 #if 0 |
111 void *thr_ctx; /* event thread context if $(CC) doesn't | 112 |
112 understand __thread declaration | 113 /* the threads support */ |
113 and pthread_getspecific() is too costly */ | 114 |
115 /* | |
116 * the event thread context, we store it here | |
117 * if $(CC) does not understand __thread declaration | |
118 * and pthread_getspecific() is too costly | |
119 */ | |
120 | |
121 void *thr_ctx; | |
114 | 122 |
115 #if (NGX_EVENT_T_PADDING) | 123 #if (NGX_EVENT_T_PADDING) |
116 int padding[NGX_EVENT_T_PADDING]; /* event should not cross | 124 |
117 cache line in SMP */ | 125 /* event should not cross cache line in SMP */ |
126 | |
127 int padding[NGX_EVENT_T_PADDING]; | |
118 #endif | 128 #endif |
119 #endif | 129 #endif |
120 }; | 130 }; |
121 | |
122 | |
123 #if 1 | |
124 typedef enum { | |
125 NGX_SELECT_EVENT_N = 0, | |
126 #if (HAVE_POLL) | |
127 NGX_POLL_EVENT_N, | |
128 #endif | |
129 #if (HAVE_DEVPOLL) | |
130 NGX_DEVPOLL_EVENT_N, | |
131 #endif | |
132 #if (HAVE_KQUEUE) | |
133 NGX_KQUEUE_EVENT_N, | |
134 #endif | |
135 #if (HAVE_AIO) | |
136 NGX_AIO_EVENT_N, | |
137 #endif | |
138 #if (HAVE_IOCP) | |
139 NGX_IOCP_EVENT_N, | |
140 #endif | |
141 NGX_DUMMY_EVENT_N /* avoid comma at end of enumerator list */ | |
142 } ngx_event_type_e ; | |
143 #endif | |
144 | 131 |
145 | 132 |
146 typedef struct { | 133 typedef struct { |
147 int (*add)(ngx_event_t *ev, int event, u_int flags); | 134 int (*add)(ngx_event_t *ev, int event, u_int flags); |
148 int (*del)(ngx_event_t *ev, int event, u_int flags); | 135 int (*del)(ngx_event_t *ev, int event, u_int flags); |
155 | 142 |
156 int (*process)(ngx_log_t *log); | 143 int (*process)(ngx_log_t *log); |
157 int (*init)(ngx_cycle_t *cycle); | 144 int (*init)(ngx_cycle_t *cycle); |
158 void (*done)(ngx_cycle_t *cycle); | 145 void (*done)(ngx_cycle_t *cycle); |
159 } ngx_event_actions_t; | 146 } ngx_event_actions_t; |
147 | |
148 | |
149 extern ngx_event_actions_t ngx_event_actions; | |
160 | 150 |
161 | 151 |
162 /* | 152 /* |
163 * The event filter requires to read/write the whole data - | 153 * The event filter requires to read/write the whole data - |
164 * select, poll, /dev/poll, kqueue. | 154 * select, poll, /dev/poll, kqueue. |
241 | 231 |
242 #define NGX_LEVEL_EVENT 0 | 232 #define NGX_LEVEL_EVENT 0 |
243 #define NGX_ONESHOT_EVENT EV_ONESHOT | 233 #define NGX_ONESHOT_EVENT EV_ONESHOT |
244 #define NGX_CLEAR_EVENT EV_CLEAR | 234 #define NGX_CLEAR_EVENT EV_CLEAR |
245 | 235 |
246 #ifndef HAVE_CLEAR_EVENT | 236 |
247 #define HAVE_CLEAR_EVENT 1 | 237 #elif (HAVE_POLL) |
248 #endif | |
249 | |
250 | |
251 #elif (HAVE_POLL) || (HAVE_DEVPOLL) | |
252 | 238 |
253 #define NGX_READ_EVENT POLLIN | 239 #define NGX_READ_EVENT POLLIN |
254 #define NGX_WRITE_EVENT POLLOUT | 240 #define NGX_WRITE_EVENT POLLOUT |
255 | 241 |
256 #define NGX_LEVEL_EVENT 0 | 242 #define NGX_LEVEL_EVENT 0 |
257 #define NGX_ONESHOT_EVENT 1 | 243 #define NGX_ONESHOT_EVENT 1 |
258 | 244 |
259 #else | 245 |
246 #elif (HAVE_DEVPOLL) | |
247 | |
248 #define NGX_READ_EVENT POLLIN | |
249 #define NGX_WRITE_EVENT POLLOUT | |
250 | |
251 #define NGX_LEVEL_EVENT 0 | |
252 | |
253 | |
254 #else /* select */ | |
260 | 255 |
261 #define NGX_READ_EVENT 0 | 256 #define NGX_READ_EVENT 0 |
262 #define NGX_WRITE_EVENT 1 | 257 #define NGX_WRITE_EVENT 1 |
263 | 258 |
264 #define NGX_LEVEL_EVENT 0 | 259 #define NGX_LEVEL_EVENT 0 |
265 #define NGX_ONESHOT_EVENT 1 | 260 #define NGX_ONESHOT_EVENT 1 |
266 | 261 |
267 #endif /* HAVE_KQUEUE */ | 262 #endif /* HAVE_KQUEUE */ |
268 | 263 |
264 | |
265 #if (HAVE_IOCP_EVENT) | |
266 #define NGX_IOCP_ACCEPT 0 | |
267 #define NGX_IOCP_IO 1 | |
268 #endif | |
269 | |
270 | |
269 #ifndef NGX_CLEAR_EVENT | 271 #ifndef NGX_CLEAR_EVENT |
270 #define NGX_CLEAR_EVENT 0 /* dummy */ | 272 #define NGX_CLEAR_EVENT 0 /* dummy declaration */ |
271 #endif | 273 #endif |
272 | 274 |
273 #if (USE_KQUEUE) | 275 |
274 | |
275 #define ngx_init_events ngx_kqueue_init | |
276 #define ngx_process_events ngx_kqueue_process_events | |
277 #define ngx_add_event ngx_kqueue_add_event | |
278 #define ngx_del_event ngx_kqueue_del_event | |
279 #if 0 | |
280 #define ngx_add_timer ngx_kqueue_add_timer | |
281 #else | |
282 #define ngx_add_timer ngx_event_add_timer | |
283 #endif | |
284 #define ngx_event_recv ngx_event_recv_core | |
285 | |
286 #else | |
287 | |
288 #define ngx_init_events (ngx_event_init[ngx_event_type]) | |
289 #define ngx_process_events ngx_event_actions.process | 276 #define ngx_process_events ngx_event_actions.process |
290 #define ngx_add_event ngx_event_actions.add | 277 #define ngx_add_event ngx_event_actions.add |
291 #define ngx_del_event ngx_event_actions.del | 278 #define ngx_del_event ngx_event_actions.del |
292 #define ngx_add_conn ngx_event_actions.add_conn | 279 #define ngx_add_conn ngx_event_actions.add_conn |
293 #define ngx_del_conn ngx_event_actions.del_conn | 280 #define ngx_del_conn ngx_event_actions.del_conn |
294 | 281 |
295 #if 0 | 282 #define ngx_add_timer ngx_event_add_timer |
296 #if (HAVE_IOCP_EVENT) | 283 #define ngx_del_timer ngx_event_del_timer |
297 #define ngx_event_recv ngx_event_wsarecv | 284 |
298 #elif (HAVE_AIO_EVENT) | |
299 #define ngx_event_recv ngx_event_aio_read | |
300 #else | |
301 #define ngx_event_recv ngx_io.recv | |
302 #define ngx_write_chain ngx_io.send_chain | |
303 #endif | |
304 #endif | |
305 | |
306 #endif | |
307 | |
308 | |
309 | |
310 | |
311 | |
312 /* ***************************** */ | |
313 | 285 |
314 #define ngx_recv ngx_io.recv | 286 #define ngx_recv ngx_io.recv |
315 #define ngx_recv_chain ngx_io.recv_chain | 287 #define ngx_recv_chain ngx_io.recv_chain |
316 #define ngx_write_chain ngx_io.send_chain | 288 #define ngx_write_chain ngx_io.send_chain |
317 | 289 |
318 | 290 |
319 #define ngx_add_timer ngx_event_add_timer | |
320 #define ngx_del_timer ngx_event_del_timer | |
321 | |
322 | |
323 #if (HAVE_IOCP_EVENT) | |
324 #define NGX_IOCP_ACCEPT 0 | |
325 #define NGX_IOCP_IO 1 | |
326 #endif | |
327 | |
328 /* ***************************** */ | |
329 | |
330 | |
331 | |
332 | |
333 | |
334 | |
335 #if !(USE_KQUEUE) | |
336 extern ngx_event_actions_t ngx_event_actions; | |
337 extern ngx_event_type_e ngx_event_type; | |
338 extern int ngx_event_flags; | |
339 #endif | |
340 | |
341 | |
342 | |
343 /* ***************************** */ | |
344 | 291 |
345 #define NGX_EVENT_MODULE 0x544E5645 /* "EVNT" */ | 292 #define NGX_EVENT_MODULE 0x544E5645 /* "EVNT" */ |
346 | |
347 #define NGX_EVENT_CONF 0x00200000 | 293 #define NGX_EVENT_CONF 0x00200000 |
348 | 294 |
349 | 295 |
350 typedef struct { | 296 typedef struct { |
351 int connections; | 297 int connections; |
362 | 308 |
363 ngx_event_actions_t actions; | 309 ngx_event_actions_t actions; |
364 } ngx_event_module_t; | 310 } ngx_event_module_t; |
365 | 311 |
366 | 312 |
367 extern ngx_module_t ngx_events_module; | 313 |
368 extern ngx_module_t ngx_event_core_module; | 314 extern int ngx_event_flags; |
315 extern ngx_module_t ngx_events_module; | |
316 extern ngx_module_t ngx_event_core_module; | |
369 | 317 |
370 | 318 |
371 #define ngx_event_get_conf(conf_ctx, module) \ | 319 #define ngx_event_get_conf(conf_ctx, module) \ |
372 (*(ngx_get_conf(conf_ctx, ngx_events_module))) [module.ctx_index]; | 320 (*(ngx_get_conf(conf_ctx, ngx_events_module))) [module.ctx_index]; |
373 | 321 |
378 #if (WIN32) | 326 #if (WIN32) |
379 void ngx_event_acceptex(ngx_event_t *ev); | 327 void ngx_event_acceptex(ngx_event_t *ev); |
380 int ngx_event_post_acceptex(ngx_listening_t *ls, int n); | 328 int ngx_event_post_acceptex(ngx_listening_t *ls, int n); |
381 #endif | 329 #endif |
382 | 330 |
383 /* ***************************** */ | |
384 | |
385 | |
386 | |
387 | |
388 | |
389 ssize_t ngx_event_recv_core(ngx_connection_t *c, char *buf, size_t size); | |
390 int ngx_event_close_connection(ngx_event_t *ev); | |
391 | |
392 | |
393 int ngx_pre_thread(ngx_array_t *ls, ngx_pool_t *pool, ngx_log_t *log); | |
394 void ngx_worker(ngx_cycle_t *cycle); | |
395 | |
396 | |
397 /* ***************************** */ | |
398 | 331 |
399 | 332 |
400 #include <ngx_event_timer.h> | 333 #include <ngx_event_timer.h> |
334 | |
401 #if (WIN32) | 335 #if (WIN32) |
402 #include <ngx_iocp_module.h> | 336 #include <ngx_iocp_module.h> |
403 #endif | 337 #endif |
404 | 338 |
405 | 339 |
435 } | 369 } |
436 | 370 |
437 return NGX_OK; | 371 return NGX_OK; |
438 } | 372 } |
439 | 373 |
440 if (rev->active && rev->ready) { | 374 if (rev->active && (rev->ready || rev->eof)) { |
441 if (ngx_del_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) { | 375 if (ngx_del_event(rev, NGX_READ_EVENT, rev->eof ? NGX_CLOSE_EVENT : 0) |
376 == NGX_ERROR) { | |
442 return NGX_ERROR; | 377 return NGX_ERROR; |
443 } | 378 } |
444 | 379 |
445 return NGX_OK; | 380 return NGX_OK; |
446 } | 381 } |
549 | 484 |
550 return NGX_OK; | 485 return NGX_OK; |
551 } | 486 } |
552 | 487 |
553 | 488 |
554 /* ***************************** */ | |
555 | |
556 | |
557 #endif /* _NGX_EVENT_H_INCLUDED_ */ | 489 #endif /* _NGX_EVENT_H_INCLUDED_ */ |