1
2 /*
3 * Copyright (C) Igor Sysoev
4 */
5
6
7 #include <ngx_config.h>
8 #include <ngx_core.h>
9 #include <ngx_event.h>
10
11
12 extern int ngx_kqueue;
13
14
15 ssize_t
16 ngx_aio_read(ngx_connection_t *c, u_char *buf, size_t size)
17 {
18 int n;
19 ngx_event_t *rev;
20
21 rev = c->read;
22
23 if (!rev->ready) {
24 ngx_log_error(NGX_LOG_ALERT, c->log, 0, "second aio post");
25 return NGX_AGAIN;
26 }
27
28 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
29 "rev->complete: %d", rev->complete);
30 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
31 "aio size: %d", size);
32
33 if (!rev->complete) {
34 ngx_memzero(&rev->aiocb, sizeof(struct aiocb));
35
36 rev->aiocb.aio_fildes = c->fd;
37 rev->aiocb.aio_buf = buf;
38 rev->aiocb.aio_nbytes = size;
39
40 #if (NGX_HAVE_KQUEUE)
41 rev->aiocb.aio_sigevent.sigev_notify_kqueue = ngx_kqueue;
42 rev->aiocb.aio_sigevent.sigev_notify = SIGEV_KEVENT;
43 rev->aiocb.aio_sigevent.sigev_value.sigval_ptr = rev;
44 #endif
45
46 if (aio_read(&rev->aiocb) == -1) {
47 ngx_log_error(NGX_LOG_CRIT, rev->log, ngx_errno,
48 "aio_read() failed");
49 rev->error = 1;
50 return NGX_ERROR;
51 }
52
53 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
54 "aio_read: #%d OK", c->fd);
55
56 rev->active = 1;
57 rev->ready = 0;
58 }
59
60 rev->complete = 0;
61
62 n = aio_error(&rev->aiocb);
63 if (n == -1) {
64 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, "aio_error() failed");
65 rev->error = 1;
66 return NGX_ERROR;
67 }
68
69 if (n != 0) {
70 if (n == NGX_EINPROGRESS) {
71 if (rev->ready) {
72 ngx_log_error(NGX_LOG_ALERT, c->log, n,
73 "aio_read() still in progress");
74 rev->ready = 0;
75 }
76 return NGX_AGAIN;
77 }
78
79 ngx_log_error(NGX_LOG_CRIT, c->log, n, "aio_read() failed");
80 rev->error = 1;
81 rev->ready = 0;
82 return NGX_ERROR;
83 }
84
85 n = aio_return(&rev->aiocb);
86 if (n == -1) {
87 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
88 "aio_return() failed");
89
90 rev->error = 1;
91 rev->ready = 0;
92 return NGX_ERROR;
93 }
94
95 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, rev->log, 0,
96 "aio_read: #%d %d", c->fd, n);
97
98 if (n == 0) {
99 rev->eof = 1;
100 rev->ready = 0;
101 } else {
102 rev->ready = 1;
103 }
104
105 rev->active = 0;
106
107 return n;
108 }
109
This page was automatically generated by the
LXR engine.
Visit the LXR main site for more
information.