Annotation of embedaddon/nginx/src/event/ngx_event.h, revision 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>