Annotation of embedaddon/nginx/src/os/unix/ngx_aio_write_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: ngx_chain_t *
        !            14: ngx_aio_write_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
        !            15: {
        !            16:     u_char       *buf, *prev;
        !            17:     off_t         send, sent;
        !            18:     size_t        len;
        !            19:     ssize_t       n, size;
        !            20:     ngx_chain_t  *cl;
        !            21: 
        !            22:     /* the maximum limit size is the maximum size_t value - the page size */
        !            23: 
        !            24:     if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) {
        !            25:         limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize;
        !            26:     }
        !            27: 
        !            28:     send = 0;
        !            29:     sent = 0;
        !            30:     cl = in;
        !            31: 
        !            32:     while (cl) {
        !            33: 
        !            34:         if (cl->buf->pos == cl->buf->last) {
        !            35:             cl = cl->next;
        !            36:             continue;
        !            37:         }
        !            38: 
        !            39:         /* we can post the single aio operation only */
        !            40: 
        !            41:         if (!c->write->ready) {
        !            42:             return cl;
        !            43:         }
        !            44: 
        !            45:         buf = cl->buf->pos;
        !            46:         prev = buf;
        !            47:         len = 0;
        !            48: 
        !            49:         /* coalesce the neighbouring bufs */
        !            50: 
        !            51:         while (cl && prev == cl->buf->pos && send < limit) {
        !            52:             if (ngx_buf_special(cl->buf)) {
        !            53:                 continue;
        !            54:             }
        !            55: 
        !            56:             size = cl->buf->last - cl->buf->pos;
        !            57: 
        !            58:             if (send + size > limit) {
        !            59:                 size = limit - send;
        !            60:             }
        !            61: 
        !            62:             len += size;
        !            63:             prev = cl->buf->pos + size;
        !            64:             send += size;
        !            65:             cl = cl->next;
        !            66:         }
        !            67: 
        !            68:         n = ngx_aio_write(c, buf, len);
        !            69: 
        !            70:         ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "aio_write: %z", n);
        !            71: 
        !            72:         if (n == NGX_ERROR) {
        !            73:             return NGX_CHAIN_ERROR;
        !            74:         }
        !            75: 
        !            76:         if (n > 0) {
        !            77:             sent += n;
        !            78:             c->sent += n;
        !            79:         }
        !            80: 
        !            81:         ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
        !            82:                        "aio_write sent: %O", c->sent);
        !            83: 
        !            84:         for (cl = in; cl; cl = cl->next) {
        !            85: 
        !            86:             if (sent >= cl->buf->last - cl->buf->pos) {
        !            87:                 sent -= cl->buf->last - cl->buf->pos;
        !            88:                 cl->buf->pos = cl->buf->last;
        !            89: 
        !            90:                 continue;
        !            91:             }
        !            92: 
        !            93:             cl->buf->pos += sent;
        !            94: 
        !            95:             break;
        !            96:         }
        !            97:     }
        !            98: 
        !            99:     return cl;
        !           100: }

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