Annotation of embedaddon/nginx/src/event/modules/ngx_aio_module.c, revision 1.1

1.1     ! misho       1: 
        !             2: /*
        !             3:  * Copyright (C) Igor Sysoev
        !             4:  * Copyright (C) Nginx, Inc.
        !             5:  */
        !             6: 
        !             7: 
        !             8: #include <ngx_config.h>
        !             9: #include <ngx_core.h>
        !            10: #include <ngx_event.h>
        !            11: 
        !            12: 
        !            13: extern ngx_event_module_t  ngx_kqueue_module_ctx;
        !            14: 
        !            15: 
        !            16: static ngx_int_t ngx_aio_init(ngx_cycle_t *cycle, ngx_msec_t timer);
        !            17: static void ngx_aio_done(ngx_cycle_t *cycle);
        !            18: static ngx_int_t ngx_aio_add_event(ngx_event_t *ev, ngx_int_t event,
        !            19:     ngx_uint_t flags);
        !            20: static ngx_int_t ngx_aio_del_event(ngx_event_t *ev, ngx_int_t event,
        !            21:     ngx_uint_t flags);
        !            22: static ngx_int_t ngx_aio_del_connection(ngx_connection_t *c, ngx_uint_t flags);
        !            23: static ngx_int_t ngx_aio_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
        !            24:     ngx_uint_t flags);
        !            25: 
        !            26: 
        !            27: ngx_os_io_t ngx_os_aio = {
        !            28:     ngx_aio_read,
        !            29:     ngx_aio_read_chain,
        !            30:     NULL,
        !            31:     ngx_aio_write,
        !            32:     ngx_aio_write_chain,
        !            33:     0
        !            34: };
        !            35: 
        !            36: 
        !            37: static ngx_str_t      aio_name = ngx_string("aio");
        !            38: 
        !            39: ngx_event_module_t  ngx_aio_module_ctx = {
        !            40:     &aio_name,
        !            41:     NULL,                                  /* create configuration */
        !            42:     NULL,                                  /* init configuration */
        !            43: 
        !            44:     {
        !            45:         ngx_aio_add_event,                 /* add an event */
        !            46:         ngx_aio_del_event,                 /* delete an event */
        !            47:         NULL,                              /* enable an event */
        !            48:         NULL,                              /* disable an event */
        !            49:         NULL,                              /* add an connection */
        !            50:         ngx_aio_del_connection,            /* delete an connection */
        !            51:         NULL,                              /* process the changes */
        !            52:         ngx_aio_process_events,            /* process the events */
        !            53:         ngx_aio_init,                      /* init the events */
        !            54:         ngx_aio_done                       /* done the events */
        !            55:     }
        !            56: 
        !            57: };
        !            58: 
        !            59: ngx_module_t  ngx_aio_module = {
        !            60:     NGX_MODULE_V1,
        !            61:     &ngx_aio_module_ctx,                   /* module context */
        !            62:     NULL,                                  /* module directives */
        !            63:     NGX_EVENT_MODULE,                      /* module type */
        !            64:     NULL,                                  /* init master */
        !            65:     NULL,                                  /* init module */
        !            66:     NULL,                                  /* init process */
        !            67:     NULL,                                  /* init thread */
        !            68:     NULL,                                  /* exit thread */
        !            69:     NULL,                                  /* exit process */
        !            70:     NULL,                                  /* exit master */
        !            71:     NGX_MODULE_V1_PADDING
        !            72: };
        !            73: 
        !            74: 
        !            75: #if (NGX_HAVE_KQUEUE)
        !            76: 
        !            77: static ngx_int_t
        !            78: ngx_aio_init(ngx_cycle_t *cycle, ngx_msec_t timer)
        !            79: {
        !            80:     if (ngx_kqueue_module_ctx.actions.init(cycle, timer) == NGX_ERROR) {
        !            81:         return NGX_ERROR;
        !            82:     }
        !            83: 
        !            84:     ngx_io = ngx_os_aio;
        !            85: 
        !            86:     ngx_event_flags = NGX_USE_AIO_EVENT;
        !            87:     ngx_event_actions = ngx_aio_module_ctx.actions;
        !            88: 
        !            89: 
        !            90:     return NGX_OK;
        !            91: }
        !            92: 
        !            93: 
        !            94: static void
        !            95: ngx_aio_done(ngx_cycle_t *cycle)
        !            96: {
        !            97:     ngx_kqueue_module_ctx.actions.done(cycle);
        !            98: }
        !            99: 
        !           100: 
        !           101: /* the event adding and deleting are needed for the listening sockets */
        !           102: 
        !           103: static ngx_int_t
        !           104: ngx_aio_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)
        !           105: {
        !           106:     return ngx_kqueue_module_ctx.actions.add(ev, event, flags);
        !           107: }
        !           108: 
        !           109: 
        !           110: static ngx_int_t
        !           111: ngx_aio_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)
        !           112: {
        !           113:     return ngx_kqueue_module_ctx.actions.del(ev, event, flags);
        !           114: }
        !           115: 
        !           116: 
        !           117: static ngx_int_t
        !           118: ngx_aio_del_connection(ngx_connection_t *c, ngx_uint_t flags)
        !           119: {
        !           120:     int  rc;
        !           121: 
        !           122:     if (c->read->active == 0 && c->write->active == 0) {
        !           123:         return NGX_OK;
        !           124:     }
        !           125: 
        !           126:     if (flags & NGX_CLOSE_EVENT) {
        !           127:         return NGX_OK;
        !           128:     }
        !           129: 
        !           130:     rc = aio_cancel(c->fd, NULL);
        !           131: 
        !           132:     ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "aio_cancel: %d", rc);
        !           133: 
        !           134:     if (rc == AIO_CANCELED) {
        !           135:         c->read->active = 0;
        !           136:         c->write->active = 0;
        !           137:         return NGX_OK;
        !           138:     }
        !           139: 
        !           140:     if (rc == AIO_ALLDONE) {
        !           141:         c->read->active = 0;
        !           142:         c->write->active = 0;
        !           143:         ngx_log_error(NGX_LOG_ALERT, c->log, 0,
        !           144:                       "aio_cancel() returned AIO_ALLDONE");
        !           145:         return NGX_OK;
        !           146:     }
        !           147: 
        !           148:     if (rc == -1) {
        !           149:         ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
        !           150:                       "aio_cancel() failed");
        !           151:         return NGX_ERROR;
        !           152:     }
        !           153: 
        !           154:     if (rc == AIO_NOTCANCELED) {
        !           155:         ngx_log_error(NGX_LOG_ALERT, c->log, 0,
        !           156:                       "aio_cancel() returned AIO_NOTCANCELED");
        !           157: 
        !           158:         return NGX_ERROR;
        !           159:     }
        !           160: 
        !           161:     return NGX_OK;
        !           162: }
        !           163: 
        !           164: 
        !           165: static ngx_int_t
        !           166: ngx_aio_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags)
        !           167: {
        !           168:     return ngx_kqueue_module_ctx.actions.process_events(cycle, timer, flags);
        !           169: }
        !           170: 
        !           171: #endif /* NGX_HAVE_KQUEUE */

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