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

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