Annotation of embedaddon/nginx/src/os/unix/ngx_aio_read_chain.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: 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>