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)