annotate src/os/unix/ngx_udp_recv.c @ 391:1d9bef53cd8e

Range filter: late_ranges functionality. Add one more filtering point after postpone filter. This allows to serve range capable replies with subrequests. It's not as efficient as range filtering for static data (i.e. doesn't save us from reading data from disk if some filter needs them in memory), but it may save some network bandwidth for us and for our users.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 21 Jul 2008 05:33:01 +0400
parents 583decdb82a4
children c456a023113c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
354
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
4 */
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9 #include <ngx_event.h>
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
11
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
12 #if (NGX_HAVE_KQUEUE)
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
13
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
14 ssize_t
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
15 ngx_udp_unix_recv(ngx_connection_t *c, u_char *buf, size_t size)
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
16 {
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
17 ssize_t n;
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
18 ngx_err_t err;
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
19 ngx_event_t *rev;
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
20
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
21 rev = c->read;
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
22
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
23 do {
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
24 n = recv(c->fd, buf, size, 0);
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
25
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
26 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
27 "recv: fd:%d %d of %d", c->fd, n, size);
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
28
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
29 if (n >= 0) {
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
30 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
31 rev->available -= n;
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
32
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
33 /*
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
34 * rev->available may be negative here because some additional
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
35 * bytes may be received between kevent() and recv()
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
36 */
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
37
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
38 if (rev->available <= 0) {
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
39 rev->ready = 0;
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
40 rev->available = 0;
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
41 }
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
42 }
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
43
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
44 return n;
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
45 }
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
46
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
47 err = ngx_socket_errno;
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
48
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
49 if (err == NGX_EAGAIN || err == NGX_EINTR) {
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
50 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
51 "recv() not ready");
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
52 n = NGX_AGAIN;
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
53
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
54 } else {
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
55 n = ngx_connection_error(c, err, "recv() failed");
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
56 break;
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
57 }
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
58
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
59 } while (err == NGX_EINTR);
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
60
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
61 rev->ready = 0;
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
62
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
63 if (n == NGX_ERROR){
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
64 rev->error = 1;
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
65 }
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
66
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
67 return n;
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
68 }
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
69
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
70 #else /* ! NGX_HAVE_KQUEUE */
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
71
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
72 ssize_t
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
73 ngx_udp_unix_recv(ngx_connection_t *c, u_char *buf, size_t size)
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
74 {
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
75 ssize_t n;
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
76 ngx_err_t err;
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
77 ngx_event_t *rev;
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
78
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
79 rev = c->read;
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
80
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
81 do {
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
82 n = recv(c->fd, buf, size, 0);
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
83
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
84 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
85 "recv: fd:%d %d of %d", c->fd, n, size);
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
86
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
87 if (n >= 0) {
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
88 return n;
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
89 }
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
90
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
91 err = ngx_socket_errno;
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
92
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
93 if (err == NGX_EAGAIN || err == NGX_EINTR) {
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
94 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
95 "recv() not ready");
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
96 n = NGX_AGAIN;
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
97
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
98 } else {
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
99 n = ngx_connection_error(c, err, "recv() failed");
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
100 break;
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
101 }
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
102
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
103 } while (err == NGX_EINTR);
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
104
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
105 rev->ready = 0;
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
106
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
107 if (n == NGX_ERROR){
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
108 rev->error = 1;
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
109 }
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
110
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
111 return n;
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
112 }
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
113
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
114 #endif /* NGX_HAVE_KQUEUE */