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