Annotation of embedaddon/nginx/src/os/unix/ngx_aio_read_chain.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: ssize_t
                     14: ngx_aio_read_chain(ngx_connection_t *c, ngx_chain_t *cl)
                     15: {
                     16:     int           n;
                     17:     u_char       *buf, *prev;
                     18:     size_t        size;
                     19:     ssize_t       total;
                     20: 
                     21:     if (c->read->pending_eof) {
                     22:         c->read->ready = 0;
                     23:         return 0;
                     24:     }
                     25: 
                     26:     total = 0;
                     27: 
                     28:     while (cl) {
                     29: 
                     30:         /* we can post the single aio operation only */
                     31: 
                     32:         if (!c->read->ready) {
                     33:             return total ? total : NGX_AGAIN;
                     34:         }
                     35: 
                     36:         buf = cl->buf->last;
                     37:         prev = cl->buf->last;
                     38:         size = 0;
                     39: 
                     40:         /* coalesce the neighbouring bufs */
                     41: 
                     42:         while (cl && prev == cl->buf->last) {
                     43:             size += cl->buf->end - cl->buf->last;
                     44:             prev = cl->buf->end;
                     45:             cl = cl->next;
                     46:         }
                     47: 
                     48:         n = ngx_aio_read(c, buf, size);
                     49: 
                     50:         ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "aio_read: %d", n);
                     51: 
                     52:         if (n == NGX_AGAIN) {
                     53:             return total ? total : NGX_AGAIN;
                     54:         }
                     55: 
                     56:         if (n == NGX_ERROR) {
                     57:             return NGX_ERROR;
                     58:         }
                     59: 
                     60:         if (n == 0) {
                     61:             c->read->pending_eof = 1;
                     62:             if (total) {
                     63:                 c->read->eof = 0;
                     64:                 c->read->ready = 1;
                     65:             }
                     66:             return total;
                     67:         }
                     68: 
                     69:         if (n > 0) {
                     70:             total += n;
                     71:         }
                     72: 
                     73:         ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
                     74:                        "aio_read total: %d", total);
                     75:     }
                     76: 
                     77:     return total ? total : NGX_AGAIN;
                     78: }

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