Annotation of embedaddon/nginx/src/os/unix/ngx_aio_write.c, revision 1.1.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 int  ngx_kqueue;
                     14: 
                     15: 
                     16: ssize_t
                     17: ngx_aio_write(ngx_connection_t *c, u_char *buf, size_t size)
                     18: {
                     19:     int           n;
                     20:     ngx_event_t  *wev;
                     21: 
                     22:     wev = c->write;
                     23: 
                     24:     if (!wev->ready) {
                     25:         return NGX_AGAIN;
                     26:     }
                     27: 
                     28:     ngx_log_debug1(NGX_LOG_DEBUG_EVENT, wev->log, 0,
                     29:                    "aio: wev->complete: %d", wev->complete);
                     30: 
                     31:     if (!wev->complete) {
                     32:         ngx_memzero(&wev->aiocb, sizeof(struct aiocb));
                     33: 
                     34:         wev->aiocb.aio_fildes = c->fd;
                     35:         wev->aiocb.aio_buf = buf;
                     36:         wev->aiocb.aio_nbytes = size;
                     37: 
                     38: #if (NGX_HAVE_KQUEUE)
                     39:         wev->aiocb.aio_sigevent.sigev_notify_kqueue = ngx_kqueue;
                     40:         wev->aiocb.aio_sigevent.sigev_notify = SIGEV_KEVENT;
                     41:         wev->aiocb.aio_sigevent.sigev_value.sigval_ptr = wev;
                     42: #endif
                     43: 
                     44:         if (aio_write(&wev->aiocb) == -1) {
                     45:             ngx_log_error(NGX_LOG_CRIT, wev->log, ngx_errno,
                     46:                           "aio_write() failed");
                     47:             return NGX_ERROR;
                     48:         }
                     49: 
                     50:         ngx_log_debug0(NGX_LOG_DEBUG_EVENT, wev->log, 0, "aio_write: OK");
                     51: 
                     52:         wev->active = 1;
                     53:         wev->ready = 0;
                     54:     }
                     55: 
                     56:     wev->complete = 0;
                     57: 
                     58:     n = aio_error(&wev->aiocb);
                     59:     if (n == -1) {
                     60:         ngx_log_error(NGX_LOG_CRIT, wev->log, ngx_errno, "aio_error() failed");
                     61:         wev->error = 1;
                     62:         return NGX_ERROR;
                     63:     }
                     64: 
                     65:     if (n != 0) {
                     66:         if (n == NGX_EINPROGRESS) {
                     67:             if (wev->ready) {
                     68:                 ngx_log_error(NGX_LOG_ALERT, wev->log, n,
                     69:                               "aio_write() still in progress");
                     70:                 wev->ready = 0;
                     71:             }
                     72:             return NGX_AGAIN;
                     73:         }
                     74: 
                     75:         ngx_log_error(NGX_LOG_CRIT, wev->log, n, "aio_write() failed");
                     76:         wev->error = 1;
                     77:         wev->ready = 0;
                     78: 
                     79: #if 1
                     80:         n = aio_return(&wev->aiocb);
                     81:         if (n == -1) {
                     82:             ngx_log_error(NGX_LOG_ALERT, wev->log, ngx_errno,
                     83:                           "aio_return() failed");
                     84:         }
                     85: 
                     86:         ngx_log_error(NGX_LOG_CRIT, wev->log, n, "aio_return() %d", n);
                     87: #endif
                     88: 
                     89:         return NGX_ERROR;
                     90:     }
                     91: 
                     92:     n = aio_return(&wev->aiocb);
                     93:     if (n == -1) {
                     94:         ngx_log_error(NGX_LOG_ALERT, wev->log, ngx_errno,
                     95:                       "aio_return() failed");
                     96: 
                     97:         wev->error = 1;
                     98:         wev->ready = 0;
                     99:         return NGX_ERROR;
                    100:     }
                    101: 
                    102: 
                    103:     ngx_log_debug1(NGX_LOG_DEBUG_EVENT, wev->log, 0, "aio_write: %d", n);
                    104: 
                    105:     wev->active = 0;
                    106:     wev->ready = 1;
                    107: 
                    108:     return n;
                    109: }

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