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