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