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 */