comparison src/event/ngx_event_accept.c @ 97:70d2345a903f

nginx-0.0.1-2003-05-29-17:02:09 import
author Igor Sysoev <igor@sysoev.ru>
date Thu, 29 May 2003 13:02:09 +0000
parents a23d010f356d
children c9b243802a17
comparison
equal deleted inserted replaced
96:a23d010f356d 97:70d2345a903f
1
2 #include <nginx.h>
3 1
4 #include <ngx_config.h> 2 #include <ngx_config.h>
5 #include <ngx_core.h> 3 #include <ngx_core.h>
6 #include <ngx_types.h> 4
7 #include <ngx_log.h> 5 #include <nginx.h>
8 #include <ngx_connection.h> 6
9 #include <ngx_event.h> 7 #include <ngx_event.h>
10 8
11 9
12 void ngx_event_accept(ngx_event_t *ev) 10 void ngx_event_accept(ngx_event_t *ev)
13 { 11 {
17 ngx_err_t err; 15 ngx_err_t err;
18 ngx_pool_t *pool; 16 ngx_pool_t *pool;
19 ngx_socket_t s; 17 ngx_socket_t s;
20 ngx_event_t *rev, *wev; 18 ngx_event_t *rev, *wev;
21 ngx_connection_t *c, *ls; 19 ngx_connection_t *c, *ls;
22 20 ngx_event_conf_t *ecf;
23 ls = (ngx_connection_t *) ev->data; 21
22 ecf = ngx_event_get_conf(ngx_event_module);
23
24 ls = ev->data;
24 25
25 ngx_log_debug(ev->log, "ngx_event_accept: accept ready: %d" _ 26 ngx_log_debug(ev->log, "ngx_event_accept: accept ready: %d" _
26 ev->available); 27 ev->available);
27 28
28 ev->ready = 0; 29 ev->ready = 0;
29
30 #if 0
31 /* DEBUG */ ev->available++;
32 #endif
33 30
34 do { 31 do {
35 32
36 /* Create the pool before accept() to avoid copy the sockaddr. 33 /* Create the pool before accept() to avoid copy the sockaddr.
37 Although accept() can fail it's uncommon case 34 Although accept() can fail it's uncommon case
50 len = ls->socklen; 47 len = ls->socklen;
51 48
52 s = accept(ls->fd, sa, &len); 49 s = accept(ls->fd, sa, &len);
53 if (s == -1) { 50 if (s == -1) {
54 err = ngx_socket_errno; 51 err = ngx_socket_errno;
55 ngx_destroy_pool(pool);
56 52
57 if (err == NGX_EAGAIN) { 53 if (err == NGX_EAGAIN) {
58 ngx_log_error(NGX_LOG_NOTICE, ev->log, err, 54 ngx_log_error(NGX_LOG_NOTICE, ev->log, err,
59 "EAGAIN while accept %s", ls->addr_text.data); 55 "EAGAIN while accept() %s", ls->addr_text.data);
60 return; 56 return;
61 } 57 }
62 58
63 ngx_log_error(NGX_LOG_ALERT, ev->log, err, 59 ngx_log_error(NGX_LOG_ALERT, ev->log, err,
64 "accept %s failed", ls->addr_text.data); 60 "accept() %s failed", ls->addr_text.data);
61
62 ngx_destroy_pool(pool);
63 return;
64 }
65
66 if (s >= ecf->connections) {
67
68 ngx_log_error(NGX_LOG_ALERT, ev->log, 0,
69 "accept() %s returned socket #%d while "
70 "only %d connections was configured, "
71 "sleeping for 1 second",
72 ls->addr_text.data, s, ecf->connections);
73
74 if (ngx_close_socket(s) == -1) {
75 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
76 ngx_close_socket_n " %s failed",
77 ls->addr_text.data);
78 }
79
80 sleep(1);
81
82 ngx_destroy_pool(pool);
65 return; 83 return;
66 } 84 }
67 85
68 /* set a blocking mode for aio and non-blocking mode for others */ 86 /* set a blocking mode for aio and non-blocking mode for others */
69 87
71 if ((ngx_event_flags & NGX_USE_AIO_EVENT)) { 89 if ((ngx_event_flags & NGX_USE_AIO_EVENT)) {
72 if (ngx_blocking(s) == -1) { 90 if (ngx_blocking(s) == -1) {
73 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, 91 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
74 ngx_blocking_n " %s failed", 92 ngx_blocking_n " %s failed",
75 ls->addr_text.data); 93 ls->addr_text.data);
94
95 if (ngx_close_socket(s) == -1) {
96 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
97 ngx_close_socket_n " %s failed",
98 ls->addr_text.data);
99 }
100
101 ngx_destroy_pool(pool);
76 return; 102 return;
77 } 103 }
78 } 104 }
79 105
80 } else { 106 } else {
81 if ((ngx_event_flags & NGX_USE_AIO_EVENT) == 0) { 107 if ((ngx_event_flags & NGX_USE_AIO_EVENT) == 0) {
82 if (ngx_nonblocking(s) == -1) { 108 if (ngx_nonblocking(s) == -1) {
83 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, 109 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
84 ngx_nonblocking_n " %s failed", 110 ngx_nonblocking_n " %s failed",
85 ls->addr_text.data); 111 ls->addr_text.data);
112
113 if (ngx_close_socket(s) == -1) {
114 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
115 ngx_close_socket_n " %s failed",
116 ls->addr_text.data);
117 }
118
119 ngx_destroy_pool(pool);
86 return; 120 return;
87 } 121 }
88 } 122 }
89 } 123 }
90 124
131 return; 165 return;
132 } 166 }
133 ngx_memcpy(c->log, ev->log, sizeof(ngx_log_t)); 167 ngx_memcpy(c->log, ev->log, sizeof(ngx_log_t));
134 rev->log = wev->log = c->log; 168 rev->log = wev->log = c->log;
135 169
136 /* STUB: x86: SP: xadd ?, MT: lock xadd, MP: lock xadd, shared */ 170 /* STUB: x86: MT: lock xadd, MP: lock xadd, shared */
137 c->number = ngx_connection_counter++; 171 c->number = ngx_connection_counter++;
138 172
139 ngx_log_debug(ev->log, "ngx_event_accept: accept: %d, %d" _ 173 ngx_log_debug(ev->log, "accept: %d, %d" _ s _ c->number);
140 s _ c->number); 174
141 175 if (ev->deferred_accept) {
142 #if (HAVE_DEFERRED_ACCEPT)
143 if (ev->accept_filter) {
144 rev->ready = 1; 176 rev->ready = 1;
145 } 177 }
146 #endif 178
147 179 if (ngx_add_conn) {
148 #if (HAVE_EDGE_EVENT) /* epoll */ 180 if (ngx_add_conn(c) == NGX_ERROR) {
149 181 if (ngx_close_socket(s) == -1) {
150 if (ngx_event_flags & NGX_HAVE_EDGE_EVENT) { 182 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
151 if (ngx_edge_add_event(ev) == NGX_ERROR) { 183 ngx_close_socket_n " %s failed",
184 ls->addr_text.data);
185 }
186
187 ngx_destroy_pool(pool);
152 return; 188 return;
153 } 189 }
154 } 190 }
155
156 #endif
157 191
158 ls->handler(c); 192 ls->handler(c);
159 193
160 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { 194 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) {
161 ev->available--; 195 ev->available--;