3 * Copyright (C) Igor Sysoev
7 #include <ngx_config.h>
14 ngx_aio_write_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
22 /* the maximum limit size is the maximum size_t value - the page size */
24 if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) {
25 limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize;
34 if (cl->buf->pos == cl->buf->last) {
39 /* we can post the single aio operation only */
41 if (!c->write->ready) {
49 /* coalesce the neighbouring bufs */
51 while (cl && prev == cl->buf->pos && send < limit) {
52 if (ngx_buf_special(cl->buf)) {
56 size = cl->buf->last - cl->buf->pos;
58 if (send + size > limit) {
63 prev = cl->buf->pos + size;
68 n = ngx_aio_write(c, buf, len);
70 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "aio_write: %z", n);
73 return NGX_CHAIN_ERROR;
81 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
82 "aio_write sent: %O", c->sent);
84 for (cl = in; cl; cl = cl->next) {
86 if (sent >= cl->buf->last - cl->buf->pos) {
87 sent -= cl->buf->last - cl->buf->pos;
88 cl->buf->pos = cl->buf->last;