upstream nginx-0.7.31
[nginx.git] / nginx / src / event / ngx_event.h
1
2 /*
3  * Copyright (C) Igor Sysoev
4  */
5
6
7 #ifndef _NGX_EVENT_H_INCLUDED_
8 #define _NGX_EVENT_H_INCLUDED_
9
10
11 #include <ngx_config.h>
12 #include <ngx_core.h>
13
14
15 #define NGX_INVALID_INDEX  0xd0d0d0d0
16
17
18 #if (NGX_HAVE_IOCP)
19
20 typedef struct {
21     WSAOVERLAPPED    ovlp;
22     ngx_event_t     *event;
23     int              error;
24 } ngx_event_ovlp_t;
25
26 #endif
27
28
29 typedef struct {
30     ngx_uint_t       lock;
31
32     ngx_event_t     *events;
33     ngx_event_t     *last;
34 } ngx_event_mutex_t;
35
36
37 struct ngx_event_s {
38     void            *data;
39
40     unsigned         write:1;
41
42     unsigned         accept:1;
43
44     /* used to detect the stale events in kqueue, rtsig, and epoll */
45     unsigned         instance:1;
46
47     /*
48      * the event was passed or would be passed to a kernel;
49      * in aio mode - operation was posted.
50      */
51     unsigned         active:1;
52
53     unsigned         disabled:1;
54
55     /* the ready event; in aio mode 0 means that no operation can be posted */
56     unsigned         ready:1;
57
58     unsigned         oneshot:1;
59
60     /* aio operation is complete */
61     unsigned         complete:1;
62
63     unsigned         eof:1;
64     unsigned         error:1;
65
66     unsigned         timedout:1;
67     unsigned         timer_set:1;
68
69     unsigned         delayed:1;
70
71     unsigned         read_discarded:1;
72
73     unsigned         unexpected_eof:1;
74
75     unsigned         deferred_accept:1;
76
77     /* the pending eof reported by kqueue or in aio chain operation */
78     unsigned         pending_eof:1;
79
80 #if !(NGX_THREADS)
81     unsigned         posted_ready:1;
82 #endif
83
84 #if (NGX_WIN32)
85     /* setsockopt(SO_UPDATE_ACCEPT_CONTEXT) was succesfull */
86     unsigned         accept_context_updated:1;
87 #endif
88
89 #if (NGX_HAVE_KQUEUE)
90     unsigned         kq_vnode:1;
91
92     /* the pending errno reported by kqueue */
93     int              kq_errno;
94 #endif
95
96     /*
97      * kqueue only:
98      *   accept:     number of sockets that wait to be accepted
99      *   read:       bytes to read when event is ready
100      *               or lowat when event is set with NGX_LOWAT_EVENT flag
101      *   write:      available space in buffer when event is ready
102      *               or lowat when event is set with NGX_LOWAT_EVENT flag
103      *
104      * iocp: TODO
105      *
106      * otherwise:
107      *   accept:     1 if accept many, 0 otherwise
108      */
109
110 #if (NGX_HAVE_KQUEUE) || (NGX_HAVE_IOCP)
111     int              available;
112 #else
113     unsigned         available:1;
114 #endif
115
116     ngx_event_handler_pt  handler;
117
118
119 #if (NGX_HAVE_AIO)
120
121 #if (NGX_HAVE_IOCP)
122     ngx_event_ovlp_t ovlp;
123 #else
124     struct aiocb     aiocb;
125 #endif
126
127 #endif
128
129     ngx_uint_t       index;
130
131     ngx_log_t       *log;
132
133     ngx_rbtree_node_t   timer;
134
135     unsigned         closed:1;
136
137     /* to test on worker exit */
138     unsigned         channel:1;
139     unsigned         resolver:1;
140
141 #if (NGX_THREADS)
142
143     unsigned         locked:1;
144
145     unsigned         posted_ready:1;
146     unsigned         posted_timedout:1;
147     unsigned         posted_eof:1;
148
149 #if (NGX_HAVE_KQUEUE)
150     /* the pending errno reported by kqueue */
151     int              posted_errno;
152 #endif
153
154 #if (NGX_HAVE_KQUEUE) || (NGX_HAVE_IOCP)
155     int              posted_available;
156 #else
157     unsigned         posted_available:1;
158 #endif
159
160     ngx_atomic_t    *lock;
161     ngx_atomic_t    *own_lock;
162
163 #endif
164
165     /* the links of the posted queue */
166     ngx_event_t     *next;
167     ngx_event_t    **prev;
168
169
170 #if 0
171
172     /* the threads support */
173
174     /*
175      * the event thread context, we store it here
176      * if $(CC) does not understand __thread declaration
177      * and pthread_getspecific() is too costly
178      */
179
180     void            *thr_ctx;
181
182 #if (NGX_EVENT_T_PADDING)
183
184     /* event should not cross cache line in SMP */
185
186     uint32_t         padding[NGX_EVENT_T_PADDING];
187 #endif
188 #endif
189 };
190
191
192 typedef struct {
193     in_addr_t  mask;
194     in_addr_t  addr;
195 } ngx_event_debug_t;
196
197
198 typedef struct {
199     ngx_int_t  (*add)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
200     ngx_int_t  (*del)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
201
202     ngx_int_t  (*enable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
203     ngx_int_t  (*disable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
204
205     ngx_int_t  (*add_conn)(ngx_connection_t *c);
206     ngx_int_t  (*del_conn)(ngx_connection_t *c, ngx_uint_t flags);
207
208     ngx_int_t  (*process_changes)(ngx_cycle_t *cycle, ngx_uint_t nowait);
209     ngx_int_t  (*process_events)(ngx_cycle_t *cycle, ngx_msec_t timer,
210                    ngx_uint_t flags);
211
212     ngx_int_t  (*init)(ngx_cycle_t *cycle, ngx_msec_t timer);
213     void       (*done)(ngx_cycle_t *cycle);
214 } ngx_event_actions_t;
215
216
217 extern ngx_event_actions_t   ngx_event_actions;
218
219
220 /*
221  * The event filter requires to read/write the whole data:
222  * select, poll, /dev/poll, kqueue, epoll.
223  */
224 #define NGX_USE_LEVEL_EVENT      0x00000001
225
226 /*
227  * The event filter is deleted after a notification without an additional
228  * syscall: kqueue, epoll.
229  */
230 #define NGX_USE_ONESHOT_EVENT    0x00000002
231
232 /*
233  * The event filter notifies only the changes and an initial level:
234  * kqueue, epoll.
235  */
236 #define NGX_USE_CLEAR_EVENT      0x00000004
237
238 /*
239  * The event filter has kqueue features: the eof flag, errno,
240  * available data, etc.
241  */
242 #define NGX_USE_KQUEUE_EVENT     0x00000008
243
244 /*
245  * The event filter supports low water mark: kqueue's NOTE_LOWAT.
246  * kqueue in FreeBSD 4.1-4.2 has no NOTE_LOWAT so we need a separate flag.
247  */
248 #define NGX_USE_LOWAT_EVENT      0x00000010
249
250 /*
251  * The event filter requires to do i/o operation until EAGAIN: epoll, rtsig.
252  */
253 #define NGX_USE_GREEDY_EVENT     0x00000020
254
255 /*
256  * The event filter is epoll.
257  */
258 #define NGX_USE_EPOLL_EVENT      0x00000040
259
260 /*
261  * No need to add or delete the event filters: rtsig.
262  */
263 #define NGX_USE_RTSIG_EVENT      0x00000080
264
265 /*
266  * No need to add or delete the event filters: overlapped, aio_read,
267  * aioread, io_submit.
268  */
269 #define NGX_USE_AIO_EVENT        0x00000100
270
271 /*
272  * Need to add socket or handle only once: i/o completion port.
273  * It also requires NGX_HAVE_AIO and NGX_USE_AIO_EVENT to be set.
274  */
275 #define NGX_USE_IOCP_EVENT       0x00000200
276
277 /*
278  * The event filter has no opaque data and requires file descriptors table:
279  * poll, /dev/poll, rtsig.
280  */
281 #define NGX_USE_FD_EVENT         0x00000400
282
283 /*
284  * The event module handles periodic or absolute timer event by itself:
285  * kqueue in FreeBSD 4.4, NetBSD 2.0, and MacOSX 10.4, Solaris 10's event ports.
286  */
287 #define NGX_USE_TIMER_EVENT      0x00000800
288
289 /*
290  * All event filters on file descriptor are deleted after a notification:
291  * Solaris 10's event ports.
292  */
293 #define NGX_USE_EVENTPORT_EVENT  0x00001000
294
295 /*
296  * The event filter support vnode notifications: kqueue.
297  */
298 #define NGX_USE_VNODE_EVENT      0x00002000
299
300
301 /*
302  * The event filter is deleted just before the closing file.
303  * Has no meaning for select and poll.
304  * kqueue, epoll, rtsig, eventport:  allows to avoid explicit delete,
305  *                                   because filter automatically is deleted
306  *                                   on file close,
307  *
308  * /dev/poll:                        we need to flush POLLREMOVE event
309  *                                   before closing file.
310  */
311 #define NGX_CLOSE_EVENT    1
312
313 /*
314  * disable temporarily event filter, this may avoid locks
315  * in kernel malloc()/free(): kqueue.
316  */
317 #define NGX_DISABLE_EVENT  2
318
319 /*
320  * event must be passed to kernel right now, do not wait until batch processing.
321  */
322 #define NGX_FLUSH_EVENT    4
323
324
325 /* these flags have a meaning only for kqueue */
326 #define NGX_LOWAT_EVENT    0
327 #define NGX_VNODE_EVENT    0
328
329
330 #if (NGX_HAVE_KQUEUE)
331
332 #define NGX_READ_EVENT     EVFILT_READ
333 #define NGX_WRITE_EVENT    EVFILT_WRITE
334
335 #undef  NGX_VNODE_EVENT
336 #define NGX_VNODE_EVENT    EVFILT_VNODE
337
338 /*
339  * NGX_CLOSE_EVENT, NGX_LOWAT_EVENT, and NGX_FLUSH_EVENT are the module flags
340  * and they must not go into a kernel so we need to choose the value
341  * that must not interfere with any existent and future kqueue flags.
342  * kqueue has such values - EV_FLAG1, EV_EOF, and EV_ERROR:
343  * they are reserved and cleared on a kernel entrance.
344  */
345 #undef  NGX_CLOSE_EVENT
346 #define NGX_CLOSE_EVENT    EV_EOF
347
348 #undef  NGX_LOWAT_EVENT
349 #define NGX_LOWAT_EVENT    EV_FLAG1
350
351 #undef  NGX_FLUSH_EVENT
352 #define NGX_FLUSH_EVENT    EV_ERROR
353
354 #define NGX_LEVEL_EVENT    0
355 #define NGX_ONESHOT_EVENT  EV_ONESHOT
356 #define NGX_CLEAR_EVENT    EV_CLEAR
357
358 #undef  NGX_DISABLE_EVENT
359 #define NGX_DISABLE_EVENT  EV_DISABLE
360
361
362 #elif (NGX_HAVE_DEVPOLL || NGX_HAVE_EVENTPORT)
363
364 #define NGX_READ_EVENT     POLLIN
365 #define NGX_WRITE_EVENT    POLLOUT
366
367 #define NGX_LEVEL_EVENT    0
368 #define NGX_ONESHOT_EVENT  1
369
370
371 #elif (NGX_HAVE_EPOLL)
372
373 #define NGX_READ_EVENT     EPOLLIN
374 #define NGX_WRITE_EVENT    EPOLLOUT
375
376 #define NGX_LEVEL_EVENT    0
377 #define NGX_CLEAR_EVENT    EPOLLET
378 #define NGX_ONESHOT_EVENT  0x70000000
379 #if 0
380 #define NGX_ONESHOT_EVENT  EPOLLONESHOT
381 #endif
382
383
384 #elif (NGX_HAVE_POLL)
385
386 #define NGX_READ_EVENT     POLLIN
387 #define NGX_WRITE_EVENT    POLLOUT
388
389 #define NGX_LEVEL_EVENT    0
390 #define NGX_ONESHOT_EVENT  1
391
392
393 #else /* select */
394
395 #define NGX_READ_EVENT     0
396 #define NGX_WRITE_EVENT    1
397
398 #define NGX_LEVEL_EVENT    0
399 #define NGX_ONESHOT_EVENT  1
400
401 #endif /* NGX_HAVE_KQUEUE */
402
403
404 #if (NGX_HAVE_IOCP)
405 #define NGX_IOCP_ACCEPT      0
406 #define NGX_IOCP_IO          1
407 #define NGX_IOCP_CONNECT     2
408 #endif
409
410
411 #ifndef NGX_CLEAR_EVENT
412 #define NGX_CLEAR_EVENT    0    /* dummy declaration */
413 #endif
414
415
416 #define ngx_process_changes  ngx_event_actions.process_changes
417 #define ngx_process_events   ngx_event_actions.process_events
418 #define ngx_done_events      ngx_event_actions.done
419
420 #define ngx_add_event        ngx_event_actions.add
421 #define ngx_del_event        ngx_event_actions.del
422 #define ngx_add_conn         ngx_event_actions.add_conn
423 #define ngx_del_conn         ngx_event_actions.del_conn
424
425 #define ngx_add_timer        ngx_event_add_timer
426 #define ngx_del_timer        ngx_event_del_timer
427
428
429 extern ngx_os_io_t  ngx_io;
430
431 #define ngx_recv             ngx_io.recv
432 #define ngx_recv_chain       ngx_io.recv_chain
433 #define ngx_udp_recv         ngx_io.udp_recv
434 #define ngx_send             ngx_io.send
435 #define ngx_send_chain       ngx_io.send_chain
436
437
438 #define NGX_EVENT_MODULE      0x544E5645  /* "EVNT" */
439 #define NGX_EVENT_CONF        0x02000000
440
441
442 typedef struct {
443     ngx_uint_t    connections;
444     ngx_uint_t    use;
445
446     ngx_flag_t    multi_accept;
447     ngx_flag_t    accept_mutex;
448
449     ngx_msec_t    accept_mutex_delay;
450
451     u_char       *name;
452
453 #if (NGX_DEBUG)
454     ngx_array_t   debug_connection;
455 #endif
456 } ngx_event_conf_t;
457
458
459 typedef struct {
460     ngx_str_t              *name;
461
462     void                 *(*create_conf)(ngx_cycle_t *cycle);
463     char                 *(*init_conf)(ngx_cycle_t *cycle, void *conf);
464
465     ngx_event_actions_t     actions;
466 } ngx_event_module_t;
467
468
469 extern ngx_atomic_t          *ngx_connection_counter;
470
471 extern ngx_atomic_t          *ngx_accept_mutex_ptr;
472 extern ngx_shmtx_t            ngx_accept_mutex;
473 extern ngx_uint_t             ngx_use_accept_mutex;
474 extern ngx_uint_t             ngx_accept_events;
475 extern ngx_uint_t             ngx_accept_mutex_held;
476 extern ngx_msec_t             ngx_accept_mutex_delay;
477 extern ngx_int_t              ngx_accept_disabled;
478
479
480 #if (NGX_STAT_STUB)
481
482 extern ngx_atomic_t  *ngx_stat_accepted;
483 extern ngx_atomic_t  *ngx_stat_handled;
484 extern ngx_atomic_t  *ngx_stat_requests;
485 extern ngx_atomic_t  *ngx_stat_active;
486 extern ngx_atomic_t  *ngx_stat_reading;
487 extern ngx_atomic_t  *ngx_stat_writing;
488
489 #endif
490
491
492 #define NGX_UPDATE_TIME         1
493 #define NGX_POST_EVENTS         2
494 #define NGX_POST_THREAD_EVENTS  4
495
496
497 extern sig_atomic_t           ngx_event_timer_alarm;
498 extern ngx_uint_t             ngx_event_flags;
499 extern ngx_module_t           ngx_events_module;
500 extern ngx_module_t           ngx_event_core_module;
501
502
503 #define ngx_event_get_conf(conf_ctx, module)                                  \
504              (*(ngx_get_conf(conf_ctx, ngx_events_module))) [module.ctx_index];
505
506
507
508 void ngx_event_accept(ngx_event_t *ev);
509 ngx_int_t ngx_trylock_accept_mutex(ngx_cycle_t *cycle);
510 u_char *ngx_accept_log_error(ngx_log_t *log, u_char *buf, size_t len);
511
512
513 void ngx_process_events_and_timers(ngx_cycle_t *cycle);
514 ngx_int_t ngx_handle_read_event(ngx_event_t *rev, ngx_uint_t flags);
515 ngx_int_t ngx_handle_write_event(ngx_event_t *wev, size_t lowat);
516
517
518 #if (NGX_WIN32)
519 void ngx_event_acceptex(ngx_event_t *ev);
520 ngx_int_t ngx_event_post_acceptex(ngx_listening_t *ls, ngx_uint_t n);
521 u_char *ngx_acceptex_log_error(ngx_log_t *log, u_char *buf, size_t len);
522 #endif
523
524
525 ngx_int_t ngx_send_lowat(ngx_connection_t *c, size_t lowat);
526
527
528 /* used in ngx_log_debugX() */
529 #define ngx_event_ident(p)  ((ngx_connection_t *) (p))->fd
530
531
532 #include <ngx_event_timer.h>
533 #include <ngx_event_posted.h>
534 #include <ngx_event_busy_lock.h>
535
536 #if (NGX_WIN32)
537 #include <ngx_iocp_module.h>
538 #endif
539
540
541 #endif /* _NGX_EVENT_H_INCLUDED_ */