Annotation of embedaddon/nginx/src/os/unix/ngx_aio_read_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: ssize_t
! 14: ngx_aio_read_chain(ngx_connection_t *c, ngx_chain_t *cl)
! 15: {
! 16: int n;
! 17: u_char *buf, *prev;
! 18: size_t size;
! 19: ssize_t total;
! 20:
! 21: if (c->read->pending_eof) {
! 22: c->read->ready = 0;
! 23: return 0;
! 24: }
! 25:
! 26: total = 0;
! 27:
! 28: while (cl) {
! 29:
! 30: /* we can post the single aio operation only */
! 31:
! 32: if (!c->read->ready) {
! 33: return total ? total : NGX_AGAIN;
! 34: }
! 35:
! 36: buf = cl->buf->last;
! 37: prev = cl->buf->last;
! 38: size = 0;
! 39:
! 40: /* coalesce the neighbouring bufs */
! 41:
! 42: while (cl && prev == cl->buf->last) {
! 43: size += cl->buf->end - cl->buf->last;
! 44: prev = cl->buf->end;
! 45: cl = cl->next;
! 46: }
! 47:
! 48: n = ngx_aio_read(c, buf, size);
! 49:
! 50: ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "aio_read: %d", n);
! 51:
! 52: if (n == NGX_AGAIN) {
! 53: return total ? total : NGX_AGAIN;
! 54: }
! 55:
! 56: if (n == NGX_ERROR) {
! 57: return NGX_ERROR;
! 58: }
! 59:
! 60: if (n == 0) {
! 61: c->read->pending_eof = 1;
! 62: if (total) {
! 63: c->read->eof = 0;
! 64: c->read->ready = 1;
! 65: }
! 66: return total;
! 67: }
! 68:
! 69: if (n > 0) {
! 70: total += n;
! 71: }
! 72:
! 73: ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
! 74: "aio_read total: %d", total);
! 75: }
! 76:
! 77: return total ? total : NGX_AGAIN;
! 78: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>