comparison src/os/unix/ngx_udp_recv.c @ 6505:5ad379eab6fa

Merged implementations of ngx_udp_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:38:42 +0300
parents f01ab2dbcfdc
children
comparison
equal deleted inserted replaced
6504:293413010217 6505:5ad379eab6fa
7 7
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
13 #if (NGX_HAVE_KQUEUE)
14 12
15 ssize_t 13 ssize_t
16 ngx_udp_unix_recv(ngx_connection_t *c, u_char *buf, size_t size) 14 ngx_udp_unix_recv(ngx_connection_t *c, u_char *buf, size_t size)
17 { 15 {
18 ssize_t n; 16 ssize_t n;
26 24
27 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, 25 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
28 "recv: fd:%d %z of %uz", c->fd, n, size); 26 "recv: fd:%d %z of %uz", c->fd, n, size);
29 27
30 if (n >= 0) { 28 if (n >= 0) {
29
30 #if (NGX_HAVE_KQUEUE)
31
31 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { 32 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
32 rev->available -= n; 33 rev->available -= n;
33 34
34 /* 35 /*
35 * rev->available may be negative here because some additional 36 * rev->available may be negative here because some additional
39 if (rev->available <= 0) { 40 if (rev->available <= 0) {
40 rev->ready = 0; 41 rev->ready = 0;
41 rev->available = 0; 42 rev->available = 0;
42 } 43 }
43 } 44 }
45
46 #endif
44 47
45 return n; 48 return n;
46 } 49 }
47 50
48 err = ngx_socket_errno; 51 err = ngx_socket_errno;
65 rev->error = 1; 68 rev->error = 1;
66 } 69 }
67 70
68 return n; 71 return n;
69 } 72 }
70
71 #else /* ! NGX_HAVE_KQUEUE */
72
73 ssize_t
74 ngx_udp_unix_recv(ngx_connection_t *c, u_char *buf, size_t size)
75 {
76 ssize_t n;
77 ngx_err_t err;
78 ngx_event_t *rev;
79
80 rev = c->read;
81
82 do {
83 n = recv(c->fd, buf, size, 0);
84
85 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
86 "recv: fd:%d %z of %uz", c->fd, n, size);
87
88 if (n >= 0) {
89 return n;
90 }
91
92 err = ngx_socket_errno;
93
94 if (err == NGX_EAGAIN || err == NGX_EINTR) {
95 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
96 "recv() not ready");
97 n = NGX_AGAIN;
98
99 } else {
100 n = ngx_connection_error(c, err, "recv() failed");
101 break;
102 }
103
104 } while (err == NGX_EINTR);
105
106 rev->ready = 0;
107
108 if (n == NGX_ERROR) {
109 rev->error = 1;
110 }
111
112 return n;
113 }
114
115 #endif /* NGX_HAVE_KQUEUE */