Mercurial > hg > nginx
comparison src/event/ngx_event_accept.c @ 103:6dfda4cf5200
nginx-0.0.1-2003-06-11-19:28:34 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Wed, 11 Jun 2003 15:28:34 +0000 |
parents | 7ebc8b7fb816 |
children | b5be4b0448d3 |
comparison
equal
deleted
inserted
replaced
102:7e86d028d8f0 | 103:6dfda4cf5200 |
---|---|
28 | 28 |
29 do { | 29 do { |
30 | 30 |
31 /* | 31 /* |
32 * Create the pool before accept() to avoid copy the sockaddr. | 32 * Create the pool before accept() to avoid copy the sockaddr. |
33 * Although accept() can fail it's uncommon case | 33 * Although accept() can fail it's an uncommon case |
34 * and the pool can be got from the free pool list | 34 * and the pool can be got from the free pool list |
35 */ | 35 */ |
36 | 36 |
37 pool = ngx_create_pool(ls->pool_size, ev->log); | 37 pool = ngx_create_pool(ls->listening->pool_size, ev->log); |
38 if (pool == NULL) { | 38 if (pool == NULL) { |
39 return; | 39 return; |
40 } | 40 } |
41 | 41 |
42 sa = ngx_palloc(pool, ls->socklen); | 42 sa = ngx_palloc(pool, ls->listening->socklen); |
43 if (sa == NULL) { | 43 if (sa == NULL) { |
44 return; | 44 return; |
45 } | 45 } |
46 | 46 |
47 len = ls->socklen; | 47 len = ls->listening->socklen; |
48 | |
49 ngx_log_debug(ev->log, "ADDR %s" _ ls->listening->addr_text.data); | |
48 | 50 |
49 s = accept(ls->fd, sa, &len); | 51 s = accept(ls->fd, sa, &len); |
50 if (s == -1) { | 52 if (s == -1) { |
51 err = ngx_socket_errno; | 53 err = ngx_socket_errno; |
52 | 54 |
53 if (err == NGX_EAGAIN) { | 55 if (err == NGX_EAGAIN) { |
54 ngx_log_error(NGX_LOG_NOTICE, ev->log, err, | 56 ngx_log_error(NGX_LOG_NOTICE, ev->log, err, |
55 "EAGAIN while accept() %s", ls->addr_text.data); | 57 "EAGAIN while accept() %s", |
58 ls->listening->addr_text.data); | |
56 return; | 59 return; |
57 } | 60 } |
58 | 61 |
59 ngx_log_error(NGX_LOG_ALERT, ev->log, err, | 62 ngx_log_error(NGX_LOG_ALERT, ev->log, err, |
60 "accept() %s failed", ls->addr_text.data); | 63 "accept() %s failed", ls->listening->addr_text.data); |
61 | 64 |
62 ngx_destroy_pool(pool); | 65 ngx_destroy_pool(pool); |
63 return; | 66 return; |
64 } | 67 } |
65 | 68 |
68 | 71 |
69 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, | 72 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, |
70 "accept() %s returned socket #%d while " | 73 "accept() %s returned socket #%d while " |
71 "only %d connections was configured, " | 74 "only %d connections was configured, " |
72 "sleeping for 1 second", | 75 "sleeping for 1 second", |
73 ls->addr_text.data, s, ecf->connections); | 76 ls->listening->addr_text.data, s, ecf->connections); |
74 | 77 |
75 if (ngx_close_socket(s) == -1) { | 78 if (ngx_close_socket(s) == -1) { |
76 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, | 79 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, |
77 ngx_close_socket_n " %s failed", | 80 ngx_close_socket_n " %s failed", |
78 ls->addr_text.data); | 81 ls->listening->addr_text.data); |
79 } | 82 } |
80 | 83 |
81 ngx_msleep(1000); | 84 ngx_msleep(1000); |
82 | 85 |
83 ngx_destroy_pool(pool); | 86 ngx_destroy_pool(pool); |
89 if (ngx_inherited_nonblocking) { | 92 if (ngx_inherited_nonblocking) { |
90 if ((ngx_event_flags & NGX_USE_AIO_EVENT)) { | 93 if ((ngx_event_flags & NGX_USE_AIO_EVENT)) { |
91 if (ngx_blocking(s) == -1) { | 94 if (ngx_blocking(s) == -1) { |
92 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, | 95 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, |
93 ngx_blocking_n " %s failed", | 96 ngx_blocking_n " %s failed", |
94 ls->addr_text.data); | 97 ls->listening->addr_text.data); |
95 | 98 |
96 if (ngx_close_socket(s) == -1) { | 99 if (ngx_close_socket(s) == -1) { |
97 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, | 100 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, |
98 ngx_close_socket_n " %s failed", | 101 ngx_close_socket_n " %s failed", |
99 ls->addr_text.data); | 102 ls->listening->addr_text.data); |
100 } | 103 } |
101 | 104 |
102 ngx_destroy_pool(pool); | 105 ngx_destroy_pool(pool); |
103 return; | 106 return; |
104 } | 107 } |
107 } else { | 110 } else { |
108 if ((ngx_event_flags & NGX_USE_AIO_EVENT) == 0) { | 111 if ((ngx_event_flags & NGX_USE_AIO_EVENT) == 0) { |
109 if (ngx_nonblocking(s) == -1) { | 112 if (ngx_nonblocking(s) == -1) { |
110 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, | 113 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, |
111 ngx_nonblocking_n " %s failed", | 114 ngx_nonblocking_n " %s failed", |
112 ls->addr_text.data); | 115 ls->listening->addr_text.data); |
113 | 116 |
114 if (ngx_close_socket(s) == -1) { | 117 if (ngx_close_socket(s) == -1) { |
115 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, | 118 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, |
116 ngx_close_socket_n " %s failed", | 119 ngx_close_socket_n " %s failed", |
117 ls->addr_text.data); | 120 ls->listening->addr_text.data); |
118 } | 121 } |
119 | 122 |
120 ngx_destroy_pool(pool); | 123 ngx_destroy_pool(pool); |
121 return; | 124 return; |
122 } | 125 } |
123 } | 126 } |
124 } | 127 } |
125 | 128 |
129 #if (WIN32) | |
130 /* | |
131 * Winsock assignes a socket number divisible by 4 | |
132 * so to find a connection we divide a socket number by 4. | |
133 */ | |
134 | |
135 if (s % 4) { | |
136 ngx_log_error(NGX_LOG_EMERG, ls->log, 0, | |
137 ngx_socket_n " created socket %d", s); | |
138 exit(1); | |
139 } | |
140 | |
141 rev = &ngx_read_events[s / 4]; | |
142 wev = &ngx_write_events[s / 4]; | |
143 c = &ngx_connections[s / 4]; | |
144 #else | |
126 rev = &ngx_read_events[s]; | 145 rev = &ngx_read_events[s]; |
127 wev = &ngx_write_events[s]; | 146 wev = &ngx_write_events[s]; |
128 c = &ngx_connections[s]; | 147 c = &ngx_connections[s]; |
148 #endif | |
129 | 149 |
130 instance = rev->instance; | 150 instance = rev->instance; |
131 | 151 |
132 ngx_memzero(rev, sizeof(ngx_event_t)); | 152 ngx_memzero(rev, sizeof(ngx_event_t)); |
133 ngx_memzero(wev, sizeof(ngx_event_t)); | 153 ngx_memzero(wev, sizeof(ngx_event_t)); |
134 ngx_memzero(c, sizeof(ngx_connection_t)); | 154 ngx_memzero(c, sizeof(ngx_connection_t)); |
135 | 155 |
136 c->pool = pool; | 156 c->pool = pool; |
137 | 157 |
158 c->listening = ls->listening; | |
138 c->sockaddr = sa; | 159 c->sockaddr = sa; |
139 c->family = ls->family; | |
140 c->socklen = len; | 160 c->socklen = len; |
141 c->addr = ls->addr; | |
142 c->addr_text_max_len = ls->addr_text_max_len; | |
143 c->post_accept_timeout = ls->post_accept_timeout; | |
144 | 161 |
145 rev->instance = wev->instance = !instance; | 162 rev->instance = wev->instance = !instance; |
146 | 163 |
147 rev->index = wev->index = NGX_INVALID_INDEX; | 164 rev->index = wev->index = NGX_INVALID_INDEX; |
148 | 165 |
180 if (ngx_add_conn) { | 197 if (ngx_add_conn) { |
181 if (ngx_add_conn(c) == NGX_ERROR) { | 198 if (ngx_add_conn(c) == NGX_ERROR) { |
182 if (ngx_close_socket(s) == -1) { | 199 if (ngx_close_socket(s) == -1) { |
183 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, | 200 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, |
184 ngx_close_socket_n " %s failed", | 201 ngx_close_socket_n " %s failed", |
185 ls->addr_text.data); | 202 ls->listening->addr_text.data); |
186 } | 203 } |
187 | 204 |
188 ngx_destroy_pool(pool); | 205 ngx_destroy_pool(pool); |
189 return; | 206 return; |
190 } | 207 } |
191 } | 208 } |
192 | 209 |
193 ls->handler(c); | 210 ls->listening->handler(c); |
194 | 211 |
195 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { | 212 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { |
196 ev->available--; | 213 ev->available--; |
197 } | 214 } |
198 | 215 |