Mercurial > hg > nginx-mail
comparison src/event/ngx_event_connect.c @ 665:0b460e61bdcd default tip
Merge with nginx 1.0.0.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Mon, 25 Apr 2011 04:22:17 +0400 |
parents | 5c576ea5dbd9 |
children |
comparison
equal
deleted
inserted
replaced
572:06419a2298a9 | 665:0b460e61bdcd |
---|---|
52 if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, | 52 if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, |
53 (const void *) &pc->rcvbuf, sizeof(int)) == -1) | 53 (const void *) &pc->rcvbuf, sizeof(int)) == -1) |
54 { | 54 { |
55 ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, | 55 ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, |
56 "setsockopt(SO_RCVBUF) failed"); | 56 "setsockopt(SO_RCVBUF) failed"); |
57 | 57 goto failed; |
58 ngx_free_connection(c); | |
59 | |
60 if (ngx_close_socket(s) == -1) { | |
61 ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, | |
62 ngx_close_socket_n " failed"); | |
63 } | |
64 | |
65 return NGX_ERROR; | |
66 } | 58 } |
67 } | 59 } |
68 | 60 |
69 if (ngx_nonblocking(s) == -1) { | 61 if (ngx_nonblocking(s) == -1) { |
70 ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, | 62 ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, |
71 ngx_nonblocking_n " failed"); | 63 ngx_nonblocking_n " failed"); |
72 | 64 |
73 ngx_free_connection(c); | 65 goto failed; |
74 | 66 } |
75 if (ngx_close_socket(s) == -1) { | 67 |
76 ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, | 68 if (pc->local) { |
77 ngx_close_socket_n " failed"); | 69 if (bind(s, pc->local->sockaddr, pc->local->socklen) == -1) { |
78 } | 70 ngx_log_error(NGX_LOG_CRIT, pc->log, ngx_socket_errno, |
79 | 71 "bind(%V) failed", &pc->local->name); |
80 return NGX_ERROR; | 72 |
73 goto failed; | |
74 } | |
81 } | 75 } |
82 | 76 |
83 c->recv = ngx_recv; | 77 c->recv = ngx_recv; |
84 c->send = ngx_send; | 78 c->send = ngx_send; |
85 c->recv_chain = ngx_recv_chain; | 79 c->recv_chain = ngx_recv_chain; |
105 rev->log = pc->log; | 99 rev->log = pc->log; |
106 wev->log = pc->log; | 100 wev->log = pc->log; |
107 | 101 |
108 pc->connection = c; | 102 pc->connection = c; |
109 | 103 |
110 /* | |
111 * TODO: MT: - ngx_atomic_fetch_add() | |
112 * or protection by critical section or mutex | |
113 * | |
114 * TODO: MP: - allocated in a shared memory | |
115 * - ngx_atomic_fetch_add() | |
116 * or protection by critical section or mutex | |
117 */ | |
118 | |
119 c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1); | 104 c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1); |
120 | 105 |
121 #if (NGX_THREADS) | 106 #if (NGX_THREADS) |
107 | |
108 /* TODO: lock event when call completion handler */ | |
109 | |
122 rev->lock = pc->lock; | 110 rev->lock = pc->lock; |
123 wev->lock = pc->lock; | 111 wev->lock = pc->lock; |
124 rev->own_lock = &c->lock; | 112 rev->own_lock = &c->lock; |
125 wev->own_lock = &c->lock; | 113 wev->own_lock = &c->lock; |
114 | |
126 #endif | 115 #endif |
127 | 116 |
128 if (ngx_add_conn) { | 117 if (ngx_add_conn) { |
129 if (ngx_add_conn(c) == NGX_ERROR) { | 118 if (ngx_add_conn(c) == NGX_ERROR) { |
130 return NGX_ERROR; | 119 goto failed; |
131 } | 120 } |
132 } | 121 } |
133 | 122 |
134 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, pc->log, 0, | 123 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, pc->log, 0, |
135 "connect to %V, fd:%d #%d", pc->name, s, c->number); | 124 "connect to %V, fd:%d #%d", pc->name, s, c->number); |
197 /* aio, iocp */ | 186 /* aio, iocp */ |
198 | 187 |
199 if (ngx_blocking(s) == -1) { | 188 if (ngx_blocking(s) == -1) { |
200 ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, | 189 ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, |
201 ngx_blocking_n " failed"); | 190 ngx_blocking_n " failed"); |
202 return NGX_ERROR; | 191 goto failed; |
203 } | 192 } |
204 | 193 |
205 /* | 194 /* |
206 * FreeBSD's aio allows to post an operation on non-connected socket. | 195 * FreeBSD's aio allows to post an operation on non-connected socket. |
207 * NT does not support it. | 196 * NT does not support it. |
227 | 216 |
228 event = NGX_LEVEL_EVENT; | 217 event = NGX_LEVEL_EVENT; |
229 } | 218 } |
230 | 219 |
231 if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) { | 220 if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) { |
232 return NGX_ERROR; | 221 goto failed; |
233 } | 222 } |
234 | 223 |
235 if (rc == -1) { | 224 if (rc == -1) { |
236 | 225 |
237 /* NGX_EINPROGRESS */ | 226 /* NGX_EINPROGRESS */ |
238 | 227 |
239 if (ngx_add_event(wev, NGX_WRITE_EVENT, event) != NGX_OK) { | 228 if (ngx_add_event(wev, NGX_WRITE_EVENT, event) != NGX_OK) { |
240 return NGX_ERROR; | 229 goto failed; |
241 } | 230 } |
242 | 231 |
243 return NGX_AGAIN; | 232 return NGX_AGAIN; |
244 } | 233 } |
245 | 234 |
246 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, pc->log, 0, "connected"); | 235 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, pc->log, 0, "connected"); |
247 | 236 |
248 wev->ready = 1; | 237 wev->ready = 1; |
249 | 238 |
250 return NGX_OK; | 239 return NGX_OK; |
240 | |
241 failed: | |
242 | |
243 ngx_free_connection(c); | |
244 | |
245 if (ngx_close_socket(s) == -1) { | |
246 ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, | |
247 ngx_close_socket_n " failed"); | |
248 } | |
249 | |
250 return NGX_ERROR; | |
251 } | 251 } |
252 | 252 |
253 | 253 |
254 ngx_int_t | 254 ngx_int_t |
255 ngx_event_get_peer(ngx_peer_connection_t *pc, void *data) | 255 ngx_event_get_peer(ngx_peer_connection_t *pc, void *data) |