Annotation of embedaddon/nginx/src/os/unix/ngx_aio_read.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: extern int ngx_kqueue;
! 14:
! 15:
! 16: ssize_t
! 17: ngx_aio_read(ngx_connection_t *c, u_char *buf, size_t size)
! 18: {
! 19: int n;
! 20: ngx_event_t *rev;
! 21:
! 22: rev = c->read;
! 23:
! 24: if (!rev->ready) {
! 25: ngx_log_error(NGX_LOG_ALERT, c->log, 0, "second aio post");
! 26: return NGX_AGAIN;
! 27: }
! 28:
! 29: ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
! 30: "rev->complete: %d", rev->complete);
! 31: ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
! 32: "aio size: %d", size);
! 33:
! 34: if (!rev->complete) {
! 35: ngx_memzero(&rev->aiocb, sizeof(struct aiocb));
! 36:
! 37: rev->aiocb.aio_fildes = c->fd;
! 38: rev->aiocb.aio_buf = buf;
! 39: rev->aiocb.aio_nbytes = size;
! 40:
! 41: #if (NGX_HAVE_KQUEUE)
! 42: rev->aiocb.aio_sigevent.sigev_notify_kqueue = ngx_kqueue;
! 43: rev->aiocb.aio_sigevent.sigev_notify = SIGEV_KEVENT;
! 44: rev->aiocb.aio_sigevent.sigev_value.sigval_ptr = rev;
! 45: #endif
! 46:
! 47: if (aio_read(&rev->aiocb) == -1) {
! 48: ngx_log_error(NGX_LOG_CRIT, rev->log, ngx_errno,
! 49: "aio_read() failed");
! 50: rev->error = 1;
! 51: return NGX_ERROR;
! 52: }
! 53:
! 54: ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
! 55: "aio_read: #%d OK", c->fd);
! 56:
! 57: rev->active = 1;
! 58: rev->ready = 0;
! 59: }
! 60:
! 61: rev->complete = 0;
! 62:
! 63: n = aio_error(&rev->aiocb);
! 64: if (n == -1) {
! 65: ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, "aio_error() failed");
! 66: rev->error = 1;
! 67: return NGX_ERROR;
! 68: }
! 69:
! 70: if (n != 0) {
! 71: if (n == NGX_EINPROGRESS) {
! 72: if (rev->ready) {
! 73: ngx_log_error(NGX_LOG_ALERT, c->log, n,
! 74: "aio_read() still in progress");
! 75: rev->ready = 0;
! 76: }
! 77: return NGX_AGAIN;
! 78: }
! 79:
! 80: ngx_log_error(NGX_LOG_CRIT, c->log, n, "aio_read() failed");
! 81: rev->error = 1;
! 82: rev->ready = 0;
! 83: return NGX_ERROR;
! 84: }
! 85:
! 86: n = aio_return(&rev->aiocb);
! 87: if (n == -1) {
! 88: ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
! 89: "aio_return() failed");
! 90:
! 91: rev->error = 1;
! 92: rev->ready = 0;
! 93: return NGX_ERROR;
! 94: }
! 95:
! 96: ngx_log_debug2(NGX_LOG_DEBUG_EVENT, rev->log, 0,
! 97: "aio_read: #%d %d", c->fd, n);
! 98:
! 99: if (n == 0) {
! 100: rev->eof = 1;
! 101: rev->ready = 0;
! 102: } else {
! 103: rev->ready = 1;
! 104: }
! 105:
! 106: rev->active = 0;
! 107:
! 108: return n;
! 109: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>