Mercurial > hg > nginx
comparison src/event/ngx_event_accept.c @ 87:5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Tue, 13 May 2003 16:02:32 +0000 |
parents | 3973260705cc |
children | 637625a2acdb |
comparison
equal
deleted
inserted
replaced
86:3973260705cc | 87:5f6d848dcbef |
---|---|
5 #include <ngx_core.h> | 5 #include <ngx_core.h> |
6 #include <ngx_types.h> | 6 #include <ngx_types.h> |
7 #include <ngx_log.h> | 7 #include <ngx_log.h> |
8 #include <ngx_connection.h> | 8 #include <ngx_connection.h> |
9 #include <ngx_event.h> | 9 #include <ngx_event.h> |
10 #include <ngx_event_close.h> | |
11 #include <ngx_event_accept.h> | |
12 | 10 |
13 | 11 |
14 /* This function should always return NGX_OK even there are some failures | 12 void ngx_event_accept(ngx_event_t *ev) |
15 because if we return NGX_ERROR then listening socket would be closed */ | |
16 | |
17 int ngx_event_accept(ngx_event_t *ev) | |
18 { | 13 { |
19 int instance; | 14 int instance; |
20 socklen_t len; | 15 socklen_t len; |
21 struct sockaddr *sa; | 16 struct sockaddr *sa; |
22 ngx_err_t err; | 17 ngx_err_t err; |
35 #if 0 | 30 #if 0 |
36 /* DEBUG */ ev->available++; | 31 /* DEBUG */ ev->available++; |
37 #endif | 32 #endif |
38 | 33 |
39 do { | 34 do { |
40 ngx_test_null(pool, ngx_create_pool(ls->pool_size, ev->log), NGX_OK); | 35 pool = ngx_create_pool(ls->pool_size, ev->log); |
36 if (pool == NULL) { | |
37 return; | |
38 } | |
41 | 39 |
42 ngx_test_null(sa, ngx_palloc(pool, ls->socklen), NGX_OK); | 40 sa = ngx_palloc(pool, ls->socklen); |
41 if (sa == NULL) { | |
42 return; | |
43 } | |
44 | |
43 len = ls->socklen; | 45 len = ls->socklen; |
44 | 46 |
45 s = accept(ls->fd, sa, &len); | 47 s = accept(ls->fd, sa, &len); |
46 if (s == -1) { | 48 if (s == -1) { |
47 err = ngx_socket_errno; | 49 err = ngx_socket_errno; |
48 ngx_destroy_pool(pool); | 50 ngx_destroy_pool(pool); |
49 | 51 |
50 if (err == NGX_EAGAIN) { | 52 if (err == NGX_EAGAIN) { |
51 ngx_log_error(NGX_LOG_NOTICE, ev->log, err, | 53 ngx_log_error(NGX_LOG_NOTICE, ev->log, err, |
52 "EAGAIN while accept %s", ls->addr_text.data); | 54 "EAGAIN while accept %s", ls->addr_text.data); |
53 return NGX_OK; | 55 return; |
54 } | 56 } |
55 | 57 |
56 ngx_log_error(NGX_LOG_ALERT, ev->log, err, | 58 ngx_log_error(NGX_LOG_ALERT, ev->log, err, |
57 "accept %s failed", ls->addr_text.data); | 59 "accept %s failed", ls->addr_text.data); |
58 return NGX_OK; | 60 return; |
59 } | 61 } |
60 | 62 |
61 | 63 |
62 #if (HAVE_INHERITED_NONBLOCK) | 64 #if (HAVE_INHERITED_NONBLOCK) |
63 | 65 |
64 #if (HAVE_AIO_EVENT) | 66 #if (HAVE_AIO_EVENT) |
65 if ((ngx_event_flags & NGX_HAVE_AIO_EVENT)) { | 67 if ((ngx_event_flags & NGX_HAVE_AIO_EVENT)) { |
66 if (ngx_blocking(s) == -1) { | 68 if (ngx_blocking(s) == -1) { |
67 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, | 69 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, |
68 ngx_blocking_n " %s failed", ls->addr_text.data); | 70 ngx_blocking_n " %s failed", ls->addr_text.data); |
69 return NGX_OK; | 71 return; |
70 } | 72 } |
71 } | 73 } |
72 #endif | 74 #endif |
73 | 75 |
74 #else /* !HAVE_INHERITED_NONBLOCK */ | 76 #else /* !HAVE_INHERITED_NONBLOCK */ |
76 #if (HAVE_AIO_EVENT) | 78 #if (HAVE_AIO_EVENT) |
77 if (!(ngx_event_flags & NGX_HAVE_AIO_EVENT)) { | 79 if (!(ngx_event_flags & NGX_HAVE_AIO_EVENT)) { |
78 if (ngx_nonblocking(s) == -1) { | 80 if (ngx_nonblocking(s) == -1) { |
79 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, | 81 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, |
80 ngx_nonblocking_n " %s failed", ls->addr_text.data); | 82 ngx_nonblocking_n " %s failed", ls->addr_text.data); |
81 return NGX_OK; | 83 return; |
82 } | 84 } |
83 } | 85 } |
84 #else | 86 #else |
85 if (ngx_nonblocking(s) == -1) { | 87 if (ngx_nonblocking(s) == -1) { |
86 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, | 88 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, |
87 ngx_nonblocking_n " %s failed", ls->addr_text.data); | 89 ngx_nonblocking_n " %s failed", ls->addr_text.data); |
88 return NGX_OK; | 90 return; |
89 } | 91 } |
90 #endif | 92 #endif |
91 | 93 |
92 #endif /* HAVE_INHERITED_NONBLOCK */ | 94 #endif /* HAVE_INHERITED_NONBLOCK */ |
93 | 95 |
131 } | 133 } |
132 #endif | 134 #endif |
133 | 135 |
134 /* STUB ? */ wev->timer = rev->timer = 10000; | 136 /* STUB ? */ wev->timer = rev->timer = 10000; |
135 | 137 |
136 wev->timer_handler = rev->timer_handler = ngx_event_close_connection; | |
137 wev->close_handler = rev->close_handler = ngx_event_close_connection; | |
138 | |
139 c->ctx = ls->ctx; | 138 c->ctx = ls->ctx; |
140 c->servers = ls->servers; | 139 c->servers = ls->servers; |
141 | 140 |
142 ngx_test_null(c->log, ngx_palloc(c->pool, sizeof(ngx_log_t)), NGX_OK); | 141 c->log = ngx_palloc(c->pool, sizeof(ngx_log_t)); |
142 if (c->log == NULL) { | |
143 return; | |
144 } | |
143 ngx_memcpy(c->log, ev->log, sizeof(ngx_log_t)); | 145 ngx_memcpy(c->log, ev->log, sizeof(ngx_log_t)); |
144 rev->log = wev->log = c->log; | 146 rev->log = wev->log = c->log; |
145 | 147 |
146 /* STUB: x86: SP: xadd ?, MT: lock xadd, MP: lock xadd, shared */ | 148 /* STUB: x86: SP: xadd ?, MT: lock xadd, MP: lock xadd, shared */ |
147 c->number = ngx_connection_counter++; | 149 c->number = ngx_connection_counter++; |
157 | 159 |
158 #if (HAVE_EDGE_EVENT) /* epoll */ | 160 #if (HAVE_EDGE_EVENT) /* epoll */ |
159 | 161 |
160 if (ngx_event_flags & NGX_HAVE_EDGE_EVENT) { | 162 if (ngx_event_flags & NGX_HAVE_EDGE_EVENT) { |
161 if (ngx_edge_add_event(ev) == NGX_ERROR) { | 163 if (ngx_edge_add_event(ev) == NGX_ERROR) { |
162 return NGX_OK; | 164 return; |
163 } | 165 } |
164 } | 166 } |
165 | 167 |
166 #endif | 168 #endif |
167 | 169 |
181 } | 183 } |
182 | 184 |
183 #endif | 185 #endif |
184 } while (ev->available); | 186 } while (ev->available); |
185 | 187 |
186 return NGX_OK; | 188 return; |
187 } | 189 } |