~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Linux Cross Reference
Nginx/event/ngx_event.h

Version: ~ [ nginx-0.8.20 ] ~ [ nginx-0.7.62 ] ~ [ nginx-0.6.39 ] ~

  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 #if (NGX_HAVE_FILE_AIO)
193 
194 struct ngx_event_aio_s {
195     void                      *data;
196     ngx_event_handler_pt       handler;
197     ngx_file_t                *file;
198 
199     ngx_fd_t                   fd;
200 
201 #if (NGX_HAVE_EVENTFD)
202     int64_t                    res;
203 #if (NGX_TEST_BUILD_EPOLL)
204     ngx_err_t                  err;
205     size_t                     nbytes;
206 #endif
207 #else
208     ngx_err_t                  err;
209     size_t                     nbytes;
210 #endif
211 
212 #if (NGX_HAVE_AIO_SENDFILE)
213     off_t                      last_offset;
214 #endif
215 
216     ngx_aiocb_t                aiocb;
217     ngx_event_t                event;
218 };
219 
220 #endif
221 
222 
223 typedef struct {
224     in_addr_t  mask;
225     in_addr_t  addr;
226 } ngx_event_debug_t;
227 
228 
229 typedef struct {
230     ngx_int_t  (*add)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
231     ngx_int_t  (*del)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
232 
233     ngx_int_t  (*enable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
234     ngx_int_t  (*disable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
235 
236     ngx_int_t  (*add_conn)(ngx_connection_t *c);
237     ngx_int_t  (*del_conn)(ngx_connection_t *c, ngx_uint_t flags);
238 
239     ngx_int_t  (*process_changes)(ngx_cycle_t *cycle, ngx_uint_t nowait);
240     ngx_int_t  (*process_events)(ngx_cycle_t *cycle, ngx_msec_t timer,
241                    ngx_uint_t flags);
242 
243     ngx_int_t  (*init)(ngx_cycle_t *cycle, ngx_msec_t timer);
244     void       (*done)(ngx_cycle_t *cycle);
245 } ngx_event_actions_t;
246 
247 
248 extern ngx_event_actions_t   ngx_event_actions;
249 
250 
251 /*
252  * The event filter requires to read/write the whole data:
253  * select, poll, /dev/poll, kqueue, epoll.
254  */
255 #define NGX_USE_LEVEL_EVENT      0x00000001
256 
257 /*
258  * The event filter is deleted after a notification without an additional
259  * syscall: kqueue, epoll.
260  */
261 #define NGX_USE_ONESHOT_EVENT    0x00000002
262 
263 /*
264  * The event filter notifies only the changes and an initial level:
265  * kqueue, epoll.
266  */
267 #define NGX_USE_CLEAR_EVENT      0x00000004
268 
269 /*
270  * The event filter has kqueue features: the eof flag, errno,
271  * available data, etc.
272  */
273 #define NGX_USE_KQUEUE_EVENT     0x00000008
274 
275 /*
276  * The event filter supports low water mark: kqueue's NOTE_LOWAT.
277  * kqueue in FreeBSD 4.1-4.2 has no NOTE_LOWAT so we need a separate flag.
278  */
279 #define NGX_USE_LOWAT_EVENT      0x00000010
280 
281 /*
282  * The event filter requires to do i/o operation until EAGAIN: epoll, rtsig.
283  */
284 #define NGX_USE_GREEDY_EVENT     0x00000020
285 
286 /*
287  * The event filter is epoll.
288  */
289 #define NGX_USE_EPOLL_EVENT      0x00000040
290 
291 /*
292  * No need to add or delete the event filters: rtsig.
293  */
294 #define NGX_USE_RTSIG_EVENT      0x00000080
295 
296 /*
297  * No need to add or delete the event filters: overlapped, aio_read,
298  * aioread, io_submit.
299  */
300 #define NGX_USE_AIO_EVENT        0x00000100
301 
302 /*
303  * Need to add socket or handle only once: i/o completion port.
304  * It also requires NGX_HAVE_AIO and NGX_USE_AIO_EVENT to be set.
305  */
306 #define NGX_USE_IOCP_EVENT       0x00000200
307 
308 /*
309  * The event filter has no opaque data and requires file descriptors table:
310  * poll, /dev/poll, rtsig.
311  */
312 #define NGX_USE_FD_EVENT         0x00000400
313 
314 /*
315  * The event module handles periodic or absolute timer event by itself:
316  * kqueue in FreeBSD 4.4, NetBSD 2.0, and MacOSX 10.4, Solaris 10's event ports.
317  */
318 #define NGX_USE_TIMER_EVENT      0x00000800
319 
320 /*
321  * All event filters on file descriptor are deleted after a notification:
322  * Solaris 10's event ports.
323  */
324 #define NGX_USE_EVENTPORT_EVENT  0x00001000
325 
326 /*
327  * The event filter support vnode notifications: kqueue.
328  */
329 #define NGX_USE_VNODE_EVENT      0x00002000
330 
331 
332 /*
333  * The event filter is deleted just before the closing file.
334  * Has no meaning for select and poll.
335  * kqueue, epoll, rtsig, eventport:  allows to avoid explicit delete,
336  *                                   because filter automatically is deleted
337  *                                   on file close,
338  *
339  * /dev/poll:                        we need to flush POLLREMOVE event
340  *                                   before closing file.
341  */
342 #define NGX_CLOSE_EVENT    1
343 
344 /*
345  * disable temporarily event filter, this may avoid locks
346  * in kernel malloc()/free(): kqueue.
347  */
348 #define NGX_DISABLE_EVENT  2
349 
350 /*
351  * event must be passed to kernel right now, do not wait until batch processing.
352  */
353 #define NGX_FLUSH_EVENT    4
354 
355 
356 /* these flags have a meaning only for kqueue */
357 #define NGX_LOWAT_EVENT    0
358 #define NGX_VNODE_EVENT    0
359 
360 
361 #if (NGX_HAVE_KQUEUE)
362 
363 #define NGX_READ_EVENT     EVFILT_READ
364 #define NGX_WRITE_EVENT    EVFILT_WRITE
365 
366 #undef  NGX_VNODE_EVENT
367 #define NGX_VNODE_EVENT    EVFILT_VNODE
368 
369 /*
370  * NGX_CLOSE_EVENT, NGX_LOWAT_EVENT, and NGX_FLUSH_EVENT are the module flags
371  * and they must not go into a kernel so we need to choose the value
372  * that must not interfere with any existent and future kqueue flags.
373  * kqueue has such values - EV_FLAG1, EV_EOF, and EV_ERROR:
374  * they are reserved and cleared on a kernel entrance.
375  */
376 #undef  NGX_CLOSE_EVENT
377 #define NGX_CLOSE_EVENT    EV_EOF
378 
379 #undef  NGX_LOWAT_EVENT
380 #define NGX_LOWAT_EVENT    EV_FLAG1
381 
382 #undef  NGX_FLUSH_EVENT
383 #define NGX_FLUSH_EVENT    EV_ERROR
384 
385 #define NGX_LEVEL_EVENT    0
386 #define NGX_ONESHOT_EVENT  EV_ONESHOT
387 #define NGX_CLEAR_EVENT    EV_CLEAR
388 
389 #undef  NGX_DISABLE_EVENT
390 #define NGX_DISABLE_EVENT  EV_DISABLE
391 
392 
393 #elif (NGX_HAVE_DEVPOLL || NGX_HAVE_EVENTPORT)
394 
395 #define NGX_READ_EVENT     POLLIN
396 #define NGX_WRITE_EVENT    POLLOUT
397 
398 #define NGX_LEVEL_EVENT    0
399 #define NGX_ONESHOT_EVENT  1
400 
401 
402 #elif (NGX_HAVE_EPOLL)
403 
404 #define NGX_READ_EVENT     EPOLLIN
405 #define NGX_WRITE_EVENT    EPOLLOUT
406 
407 #define NGX_LEVEL_EVENT    0
408 #define NGX_CLEAR_EVENT    EPOLLET
409 #define NGX_ONESHOT_EVENT  0x70000000
410 #if 0
411 #define NGX_ONESHOT_EVENT  EPOLLONESHOT
412 #endif
413 
414 
415 #elif (NGX_HAVE_POLL)
416 
417 #define NGX_READ_EVENT     POLLIN
418 #define NGX_WRITE_EVENT    POLLOUT
419 
420 #define NGX_LEVEL_EVENT    0
421 #define NGX_ONESHOT_EVENT  1
422 
423 
424 #else /* select */
425 
426 #define NGX_READ_EVENT     0
427 #define NGX_WRITE_EVENT    1
428 
429 #define NGX_LEVEL_EVENT    0
430 #define NGX_ONESHOT_EVENT  1
431 
432 #endif /* NGX_HAVE_KQUEUE */
433 
434 
435 #if (NGX_HAVE_IOCP)
436 #define NGX_IOCP_ACCEPT      0
437 #define NGX_IOCP_IO          1
438 #define NGX_IOCP_CONNECT     2
439 #endif
440 
441 
442 #ifndef NGX_CLEAR_EVENT
443 #define NGX_CLEAR_EVENT    0    /* dummy declaration */
444 #endif
445 
446 
447 #define ngx_process_changes  ngx_event_actions.process_changes
448 #define ngx_process_events   ngx_event_actions.process_events
449 #define ngx_done_events      ngx_event_actions.done
450 
451 #define ngx_add_event        ngx_event_actions.add
452 #define ngx_del_event        ngx_event_actions.del
453 #define ngx_add_conn         ngx_event_actions.add_conn
454 #define ngx_del_conn         ngx_event_actions.del_conn
455 
456 #define ngx_add_timer        ngx_event_add_timer
457 #define ngx_del_timer        ngx_event_del_timer
458 
459 
460 extern ngx_os_io_t  ngx_io;
461 
462 #define ngx_recv             ngx_io.recv
463 #define ngx_recv_chain       ngx_io.recv_chain
464 #define ngx_udp_recv         ngx_io.udp_recv
465 #define ngx_send             ngx_io.send
466 #define ngx_send_chain       ngx_io.send_chain
467 
468 
469 #define NGX_EVENT_MODULE      0x544E5645  /* "EVNT" */
470 #define NGX_EVENT_CONF        0x02000000
471 
472 
473 typedef struct {
474     ngx_uint_t    connections;
475     ngx_uint_t    use;
476 
477     ngx_flag_t    multi_accept;
478     ngx_flag_t    accept_mutex;
479 
480     ngx_msec_t    accept_mutex_delay;
481 
482     u_char       *name;
483 
484 #if (NGX_DEBUG)
485     ngx_array_t   debug_connection;
486 #endif
487 } ngx_event_conf_t;
488 
489 
490 typedef struct {
491     ngx_str_t              *name;
492 
493     void                 *(*create_conf)(ngx_cycle_t *cycle);
494     char                 *(*init_conf)(ngx_cycle_t *cycle, void *conf);
495 
496     ngx_event_actions_t     actions;
497 } ngx_event_module_t;
498 
499 
500 extern ngx_atomic_t          *ngx_connection_counter;
501 
502 extern ngx_atomic_t          *ngx_accept_mutex_ptr;
503 extern ngx_shmtx_t            ngx_accept_mutex;
504 extern ngx_uint_t             ngx_use_accept_mutex;
505 extern ngx_uint_t             ngx_accept_events;
506 extern ngx_uint_t             ngx_accept_mutex_held;
507 extern ngx_msec_t             ngx_accept_mutex_delay;
508 extern ngx_int_t              ngx_accept_disabled;
509 
510 
511 #if (NGX_STAT_STUB)
512 
513 extern ngx_atomic_t  *ngx_stat_accepted;
514 extern ngx_atomic_t  *ngx_stat_handled;
515 extern ngx_atomic_t  *ngx_stat_requests;
516 extern ngx_atomic_t  *ngx_stat_active;
517 extern ngx_atomic_t  *ngx_stat_reading;
518 extern ngx_atomic_t  *ngx_stat_writing;
519 
520 #endif
521 
522 
523 #define NGX_UPDATE_TIME         1
524 #define NGX_POST_EVENTS         2
525 #define NGX_POST_THREAD_EVENTS  4
526 
527 
528 extern sig_atomic_t           ngx_event_timer_alarm;
529 extern ngx_uint_t             ngx_event_flags;
530 extern ngx_module_t           ngx_events_module;
531 extern ngx_module_t           ngx_event_core_module;
532 
533 
534 #define ngx_event_get_conf(conf_ctx, module)                                  \
535              (*(ngx_get_conf(conf_ctx, ngx_events_module))) [module.ctx_index];
536 
537 
538 
539 void ngx_event_accept(ngx_event_t *ev);
540 ngx_int_t ngx_trylock_accept_mutex(ngx_cycle_t *cycle);
541 u_char *ngx_accept_log_error(ngx_log_t *log, u_char *buf, size_t len);
542 
543 
544 void ngx_process_events_and_timers(ngx_cycle_t *cycle);
545 ngx_int_t ngx_handle_read_event(ngx_event_t *rev, ngx_uint_t flags);
546 ngx_int_t ngx_handle_write_event(ngx_event_t *wev, size_t lowat);
547 
548 
549 #if (NGX_WIN32)
550 void ngx_event_acceptex(ngx_event_t *ev);
551 ngx_int_t ngx_event_post_acceptex(ngx_listening_t *ls, ngx_uint_t n);
552 u_char *ngx_acceptex_log_error(ngx_log_t *log, u_char *buf, size_t len);
553 #endif
554 
555 
556 ngx_int_t ngx_send_lowat(ngx_connection_t *c, size_t lowat);
557 
558 
559 /* used in ngx_log_debugX() */
560 #define ngx_event_ident(p)  ((ngx_connection_t *) (p))->fd
561 
562 
563 #include <ngx_event_timer.h>
564 #include <ngx_event_posted.h>
565 #include <ngx_event_busy_lock.h>
566 
567 #if (NGX_WIN32)
568 #include <ngx_iocp_module.h>
569 #endif
570 
571 
572 #endif /* _NGX_EVENT_H_INCLUDED_ */
573 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.