Groonga 3.0.9 Source Code Document
Main Page
Related Pages
Namespaces
Data Structures
Files
File List
Globals
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Pages
groonga
vendor
nginx-1.4.2
src
os
unix
ngx_recv.c
Go to the documentation of this file.
1
2
/*
3
* Copyright (C) Igor Sysoev
4
* Copyright (C) Nginx, Inc.
5
*/
6
7
8
#include <
ngx_config.h
>
9
#include <
ngx_core.h
>
10
#include <
ngx_event.h
>
11
12
13
#if (NGX_HAVE_KQUEUE)
14
15
ssize_t
16
ngx_unix_recv
(
ngx_connection_t
*c, u_char *buf,
size_t
size)
17
{
18
ssize_t n;
19
ngx_err_t
err;
20
ngx_event_t
*rev;
21
22
rev = c->
read
;
23
24
if
(
ngx_event_flags
&
NGX_USE_KQUEUE_EVENT
) {
25
ngx_log_debug3
(
NGX_LOG_DEBUG_EVENT
, c->
log
, 0,
26
"recv: eof:%d, avail:%d, err:%d"
,
27
rev->
pending_eof
, rev->
available
, rev->kq_errno);
28
29
if
(rev->
available
== 0) {
30
if
(rev->
pending_eof
) {
31
rev->
ready
= 0;
32
rev->
eof
= 1;
33
34
if
(rev->kq_errno) {
35
rev->
error
= 1;
36
ngx_set_socket_errno
(rev->kq_errno);
37
38
return
ngx_connection_error
(c, rev->kq_errno,
39
"kevent() reported about an closed connection"
);
40
}
41
42
return
0;
43
44
}
else
{
45
rev->
ready
= 0;
46
return
NGX_AGAIN
;
47
}
48
}
49
}
50
51
do
{
52
n = recv(c->
fd
, buf, size, 0);
53
54
ngx_log_debug3
(
NGX_LOG_DEBUG_EVENT
, c->
log
, 0,
55
"recv: fd:%d %d of %d"
, c->
fd
, n, size);
56
57
if
(n >= 0) {
58
if
(
ngx_event_flags
& NGX_USE_KQUEUE_EVENT) {
59
rev->
available
-= n;
60
61
/*
62
* rev->available may be negative here because some additional
63
* bytes may be received between kevent() and recv()
64
*/
65
66
if
(rev->
available
<= 0) {
67
if
(!rev->
pending_eof
) {
68
rev->
ready
= 0;
69
}
70
71
if
(rev->
available
< 0) {
72
rev->
available
= 0;
73
}
74
}
75
76
if
(n == 0) {
77
78
/*
79
* on FreeBSD recv() may return 0 on closed socket
80
* even if kqueue reported about available data
81
*/
82
83
rev->
eof
= 1;
84
rev->
available
= 0;
85
}
86
87
return
n;
88
}
89
90
if
((
size_t
) n < size) {
91
rev->
ready
= 0;
92
}
93
94
if
(n == 0) {
95
rev->
eof
= 1;
96
}
97
98
return
n;
99
}
100
101
err =
ngx_socket_errno
;
102
103
if
(err ==
NGX_EAGAIN
|| err ==
NGX_EINTR
) {
104
ngx_log_debug0
(
NGX_LOG_DEBUG_EVENT
, c->
log
, err,
105
"recv() not ready"
);
106
n =
NGX_AGAIN
;
107
108
}
else
{
109
n =
ngx_connection_error
(c, err,
"recv() failed"
);
110
break
;
111
}
112
113
}
while
(err ==
NGX_EINTR
);
114
115
rev->
ready
= 0;
116
117
if
(n ==
NGX_ERROR
) {
118
rev->
error
= 1;
119
}
120
121
return
n;
122
}
123
124
#else
/* ! NGX_HAVE_KQUEUE */
125
126
ssize_t
127
ngx_unix_recv
(
ngx_connection_t
*c, u_char *buf,
size_t
size)
128
{
129
ssize_t n;
130
ngx_err_t
err;
131
ngx_event_t
*rev;
132
133
rev = c->
read
;
134
135
do
{
136
n = recv(c->
fd
, buf, size, 0);
137
138
ngx_log_debug3
(
NGX_LOG_DEBUG_EVENT
, c->
log
, 0,
139
"recv: fd:%d %d of %d"
, c->
fd
, n, size);
140
141
if
(n == 0) {
142
rev->
ready
= 0;
143
rev->
eof
= 1;
144
return
n;
145
146
}
else
if
(n > 0) {
147
148
if
((
size_t
) n < size
149
&& !(
ngx_event_flags
&
NGX_USE_GREEDY_EVENT
))
150
{
151
rev->
ready
= 0;
152
}
153
154
return
n;
155
}
156
157
err =
ngx_socket_errno
;
158
159
if
(err ==
NGX_EAGAIN
|| err ==
NGX_EINTR
) {
160
ngx_log_debug0
(
NGX_LOG_DEBUG_EVENT
, c->
log
, err,
161
"recv() not ready"
);
162
n =
NGX_AGAIN
;
163
164
}
else
{
165
n =
ngx_connection_error
(c, err,
"recv() failed"
);
166
break
;
167
}
168
169
}
while
(err ==
NGX_EINTR
);
170
171
rev->
ready
= 0;
172
173
if
(n ==
NGX_ERROR
) {
174
rev->
error
= 1;
175
}
176
177
return
n;
178
}
179
180
#endif
/* NGX_HAVE_KQUEUE */
Generated on Sun Nov 10 2013 09:49:09 for Groonga 3.0.9 Source Code Document by
1.8.1.2