Mercurial > hg > nginx
comparison src/os/unix/ngx_recv.c @ 6507:8ee94ecd3a50
Merged implementations of ngx_unix_recv().
There's no real need in two separate implementations,
with and without kqueue support.
author | Valentin Bartenev <vbart@nginx.com> |
---|---|
date | Fri, 08 Apr 2016 16:41:45 +0300 |
parents | dc1ae0056a1e |
children | 151fd02a4317 |
comparison
equal
deleted
inserted
replaced
6506:dc1ae0056a1e | 6507:8ee94ecd3a50 |
---|---|
8 #include <ngx_config.h> | 8 #include <ngx_config.h> |
9 #include <ngx_core.h> | 9 #include <ngx_core.h> |
10 #include <ngx_event.h> | 10 #include <ngx_event.h> |
11 | 11 |
12 | 12 |
13 #if (NGX_HAVE_KQUEUE) | |
14 | |
15 ssize_t | 13 ssize_t |
16 ngx_unix_recv(ngx_connection_t *c, u_char *buf, size_t size) | 14 ngx_unix_recv(ngx_connection_t *c, u_char *buf, size_t size) |
17 { | 15 { |
18 ssize_t n; | 16 ssize_t n; |
19 ngx_err_t err; | 17 ngx_err_t err; |
20 ngx_event_t *rev; | 18 ngx_event_t *rev; |
21 | 19 |
22 rev = c->read; | 20 rev = c->read; |
21 | |
22 #if (NGX_HAVE_KQUEUE) | |
23 | 23 |
24 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { | 24 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { |
25 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, | 25 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, |
26 "recv: eof:%d, avail:%d, err:%d", | 26 "recv: eof:%d, avail:%d, err:%d", |
27 rev->pending_eof, rev->available, rev->kq_errno); | 27 rev->pending_eof, rev->available, rev->kq_errno); |
46 return NGX_AGAIN; | 46 return NGX_AGAIN; |
47 } | 47 } |
48 } | 48 } |
49 } | 49 } |
50 | 50 |
51 #endif | |
52 | |
51 do { | 53 do { |
52 n = recv(c->fd, buf, size, 0); | 54 n = recv(c->fd, buf, size, 0); |
53 | 55 |
54 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, | 56 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, |
55 "recv: fd:%d %z of %uz", c->fd, n, size); | 57 "recv: fd:%d %z of %uz", c->fd, n, size); |
56 | 58 |
57 if (n == 0) { | 59 if (n == 0) { |
58 rev->ready = 0; | 60 rev->ready = 0; |
59 rev->eof = 1; | 61 rev->eof = 1; |
60 | 62 |
63 #if (NGX_HAVE_KQUEUE) | |
64 | |
61 /* | 65 /* |
62 * on FreeBSD recv() may return 0 on closed socket | 66 * on FreeBSD recv() may return 0 on closed socket |
63 * even if kqueue reported about available data | 67 * even if kqueue reported about available data |
64 */ | 68 */ |
65 | 69 |
66 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { | 70 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { |
67 rev->available = 0; | 71 rev->available = 0; |
68 } | 72 } |
69 | 73 |
74 #endif | |
75 | |
70 return 0; | 76 return 0; |
71 } | 77 } |
72 | 78 |
73 if (n > 0) { | 79 if (n > 0) { |
80 | |
81 #if (NGX_HAVE_KQUEUE) | |
74 | 82 |
75 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { | 83 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { |
76 rev->available -= n; | 84 rev->available -= n; |
77 | 85 |
78 /* | 86 /* |
90 } | 98 } |
91 } | 99 } |
92 | 100 |
93 return n; | 101 return n; |
94 } | 102 } |
103 | |
104 #endif | |
95 | 105 |
96 if ((size_t) n < size | 106 if ((size_t) n < size |
97 && !(ngx_event_flags & NGX_USE_GREEDY_EVENT)) | 107 && !(ngx_event_flags & NGX_USE_GREEDY_EVENT)) |
98 { | 108 { |
99 rev->ready = 0; | 109 rev->ready = 0; |
122 rev->error = 1; | 132 rev->error = 1; |
123 } | 133 } |
124 | 134 |
125 return n; | 135 return n; |
126 } | 136 } |
127 | |
128 #else /* ! NGX_HAVE_KQUEUE */ | |
129 | |
130 ssize_t | |
131 ngx_unix_recv(ngx_connection_t *c, u_char *buf, size_t size) | |
132 { | |
133 ssize_t n; | |
134 ngx_err_t err; | |
135 ngx_event_t *rev; | |
136 | |
137 rev = c->read; | |
138 | |
139 do { | |
140 n = recv(c->fd, buf, size, 0); | |
141 | |
142 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, | |
143 "recv: fd:%d %z of %uz", c->fd, n, size); | |
144 | |
145 if (n == 0) { | |
146 rev->ready = 0; | |
147 rev->eof = 1; | |
148 return n; | |
149 | |
150 } else if (n > 0) { | |
151 | |
152 if ((size_t) n < size | |
153 && !(ngx_event_flags & NGX_USE_GREEDY_EVENT)) | |
154 { | |
155 rev->ready = 0; | |
156 } | |
157 | |
158 return n; | |
159 } | |
160 | |
161 err = ngx_socket_errno; | |
162 | |
163 if (err == NGX_EAGAIN || err == NGX_EINTR) { | |
164 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, | |
165 "recv() not ready"); | |
166 n = NGX_AGAIN; | |
167 | |
168 } else { | |
169 n = ngx_connection_error(c, err, "recv() failed"); | |
170 break; | |
171 } | |
172 | |
173 } while (err == NGX_EINTR); | |
174 | |
175 rev->ready = 0; | |
176 | |
177 if (n == NGX_ERROR) { | |
178 rev->error = 1; | |
179 } | |
180 | |
181 return n; | |
182 } | |
183 | |
184 #endif /* NGX_HAVE_KQUEUE */ |