3 * Copyright (C) Igor Sysoev
7 #include <ngx_config.h>
13 #include <ngx_kqueue_module.h>
18 * the ready data requires 3 syscalls:
19 * aio_write(), aio_error(), aio_return()
20 * the non-ready data requires 4 (kqueue) or 5 syscalls:
21 * aio_write(), aio_error(), notifiction, aio_error(), aio_return()
22 * timeout, aio_cancel(), aio_error()
26 ngx_aio_write(ngx_connection_t *c, u_char *buf, size_t size)
37 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, wev->log, 0,
38 "aio: wev->complete: %d", wev->complete);
41 ngx_memzero(&wev->aiocb, sizeof(struct aiocb));
43 wev->aiocb.aio_fildes = c->fd;
44 wev->aiocb.aio_buf = buf;
45 wev->aiocb.aio_nbytes = size;
48 wev->aiocb.aio_sigevent.sigev_notify_kqueue = ngx_kqueue;
49 wev->aiocb.aio_sigevent.sigev_notify = SIGEV_KEVENT;
50 wev->aiocb.aio_sigevent.sigev_value.sigval_ptr = wev;
53 if (aio_write(&wev->aiocb) == -1) {
54 ngx_log_error(NGX_LOG_CRIT, wev->log, ngx_errno,
55 "aio_write() failed");
59 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, wev->log, 0, "aio_write: OK");
67 n = aio_error(&wev->aiocb);
69 ngx_log_error(NGX_LOG_CRIT, wev->log, ngx_errno, "aio_error() failed");
75 if (n == NGX_EINPROGRESS) {
77 ngx_log_error(NGX_LOG_ALERT, wev->log, n,
78 "aio_write() still in progress");
84 ngx_log_error(NGX_LOG_CRIT, wev->log, n, "aio_write() failed");
89 n = aio_return(&wev->aiocb);
91 ngx_log_error(NGX_LOG_ALERT, wev->log, ngx_errno,
92 "aio_return() failed");
95 ngx_log_error(NGX_LOG_CRIT, wev->log, n, "aio_return() %d", n);
101 n = aio_return(&wev->aiocb);
103 ngx_log_error(NGX_LOG_ALERT, wev->log, ngx_errno,
104 "aio_return() failed");
112 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, wev->log, 0, "aio_write: %d", n);