Update and clean Tomato RAF files
[tomato.git] / release / src / router / nginx / src / os / unix / ngx_aio_read.c
blob7849881730f89607eea523692fb1ffe84abbb66f
2 /*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) Nginx, Inc.
5 */
8 #include <ngx_config.h>
9 #include <ngx_core.h>
10 #include <ngx_event.h>
13 extern int ngx_kqueue;
16 ssize_t
17 ngx_aio_read(ngx_connection_t *c, u_char *buf, size_t size)
19 int n;
20 ngx_event_t *rev;
22 rev = c->read;
24 if (!rev->ready) {
25 ngx_log_error(NGX_LOG_ALERT, c->log, 0, "second aio post");
26 return NGX_AGAIN;
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);
34 if (!rev->complete) {
35 ngx_memzero(&rev->aiocb, sizeof(struct aiocb));
37 rev->aiocb.aio_fildes = c->fd;
38 rev->aiocb.aio_buf = buf;
39 rev->aiocb.aio_nbytes = size;
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
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;
54 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
55 "aio_read: #%d OK", c->fd);
57 rev->active = 1;
58 rev->ready = 0;
61 rev->complete = 0;
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;
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;
77 return NGX_AGAIN;
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;
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");
91 rev->error = 1;
92 rev->ready = 0;
93 return NGX_ERROR;
96 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, rev->log, 0,
97 "aio_read: #%d %d", c->fd, n);
99 if (n == 0) {
100 rev->eof = 1;
101 rev->ready = 0;
102 } else {
103 rev->ready = 1;
106 rev->active = 0;
108 return n;