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>