Annotation of embedaddon/nginx/src/os/unix/ngx_aio_write.c, revision 1.1.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>