Annotation of embedaddon/nginx/src/event/ngx_event.h, revision 1.1.1.1

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>