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_ */