Mercurial > hg > nginx
comparison src/os/unix/ngx_recv.c @ 163:fb61ba77beba
nginx-0.0.1-2003-10-28-18:45:41 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Tue, 28 Oct 2003 15:45:41 +0000 |
parents | 5afee0074707 |
children | 1bf718ce0dde |
comparison
equal
deleted
inserted
replaced
162:96993d4d5067 | 163:fb61ba77beba |
---|---|
16 | 16 |
17 rev = c->read; | 17 rev = c->read; |
18 | 18 |
19 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { | 19 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { |
20 ngx_log_debug(c->log, "recv: eof:%d, avail:%d, err:%d" _ | 20 ngx_log_debug(c->log, "recv: eof:%d, avail:%d, err:%d" _ |
21 rev->eof _ rev->available _ rev->error); | 21 rev->kq_eof _ rev->available _ rev->kq_errno); |
22 | 22 |
23 if (rev->available == 0) { | 23 if (rev->available == 0) { |
24 if (rev->eof) { | 24 if (rev->kq_eof) { |
25 rev->ready = 0; | 25 rev->ready = 0; |
26 if (rev->error) { | 26 rev->eof = 1; |
27 ngx_set_socket_errno(rev->error); | 27 |
28 return ngx_unix_recv_error(rev, rev->error); | 28 if (rev->kq_errno) { |
29 rev->error = 1; | |
30 ngx_set_socket_errno(rev->kq_errno); | |
31 return ngx_unix_recv_error(rev, rev->kq_errno); | |
29 } | 32 } |
33 | |
30 return 0; | 34 return 0; |
31 | 35 |
32 } else { | 36 } else { |
33 return NGX_AGAIN; | 37 return NGX_AGAIN; |
34 } | 38 } |
41 ngx_log_debug(c->log, "recv: %d:%d" _ n _ size); | 45 ngx_log_debug(c->log, "recv: %d:%d" _ n _ size); |
42 | 46 |
43 if (n >= 0) { | 47 if (n >= 0) { |
44 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { | 48 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { |
45 rev->available -= n; | 49 rev->available -= n; |
50 | |
51 /* | |
52 * rev->available can be negative here because some additional | |
53 * bytes can be received between kevent() and recv() | |
54 */ | |
55 | |
46 if (rev->available <= 0) { | 56 if (rev->available <= 0) { |
47 if (!rev->eof) { | 57 if (!rev->kq_eof) { |
48 rev->ready = 0; | 58 rev->ready = 0; |
49 } | 59 } |
50 | 60 |
51 if (rev->available < 0) { | 61 if (rev->available < 0) { |
52 rev->available = 0; | 62 rev->available = 0; |
58 | 68 |
59 if ((size_t) n < size) { | 69 if ((size_t) n < size) { |
60 rev->ready = 0; | 70 rev->ready = 0; |
61 } | 71 } |
62 | 72 |
73 if (n == 0) { | |
74 rev->eof = 1; | |
75 } | |
76 | |
63 return n; | 77 return n; |
64 } | 78 } |
65 | 79 |
66 rev->ready = 0; | 80 rev->ready = 0; |
81 rev->error = 1; | |
67 n = ngx_unix_recv_error(rev, ngx_socket_errno); | 82 n = ngx_unix_recv_error(rev, ngx_socket_errno); |
68 | 83 |
69 } while (n == NGX_EINTR); | 84 } while (n == NGX_EINTR); |
70 | 85 |
71 return n; | 86 return n; |
87 | 102 |
88 if (n >= 0) { | 103 if (n >= 0) { |
89 if ((size_t) n < size) { | 104 if ((size_t) n < size) { |
90 rev->ready = 0; | 105 rev->ready = 0; |
91 } | 106 } |
107 | |
108 if (n == 0) { | |
109 rev->eof = 1; | |
110 } | |
111 | |
92 return n; | 112 return n; |
93 } | 113 } |
94 | 114 |
95 rev->ready = 0; | 115 rev->ready = 0; |
116 rev->error = 1; | |
96 n = ngx_unix_recv_error(rev, ngx_socket_errno); | 117 n = ngx_unix_recv_error(rev, ngx_socket_errno); |
97 | 118 |
98 } while (n == NGX_EINTR); | 119 } while (n == NGX_EINTR); |
99 | 120 |
100 return n; | 121 return n; |