3 * Copyright (C) Igor Sysoev
4 * Copyright (C) Nginx, Inc.
8 #include <ngx_config.h>
10 #include <ngx_event.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
;