Mercurial > hg > nginx
comparison src/event/ngx_event_accept.c @ 57:a499e0d1f16e
nginx-0.0.1-2003-01-30-10:28:09 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 30 Jan 2003 07:28:09 +0000 |
parents | 0e81ac0bb3e2 |
children | e8cdc2989cee |
comparison
equal
deleted
inserted
replaced
56:058f01f78761 | 57:a499e0d1f16e |
---|---|
9 #include <ngx_event.h> | 9 #include <ngx_event.h> |
10 #include <ngx_event_close.h> | 10 #include <ngx_event_close.h> |
11 #include <ngx_event_accept.h> | 11 #include <ngx_event_accept.h> |
12 | 12 |
13 | 13 |
14 /* This function should always return NGX_OK even there are some failures | |
15 because if we return NGX_ERROR then listening socket would be closed */ | |
16 | |
14 int ngx_event_accept(ngx_event_t *ev) | 17 int ngx_event_accept(ngx_event_t *ev) |
15 { | 18 { |
19 socklen_t len; | |
20 struct sockaddr *sa; | |
16 ngx_err_t err; | 21 ngx_err_t err; |
22 ngx_pool_t *pool; | |
17 ngx_socket_t s; | 23 ngx_socket_t s; |
18 ngx_event_t *rev, *wev; | 24 ngx_event_t *rev, *wev; |
19 ngx_connection_t *c, *ac; | 25 ngx_connection_t *c, *ls; |
20 | 26 |
21 ac = (ngx_connection_t *) ev->data; | 27 ls = (ngx_connection_t *) ev->data; |
22 | 28 |
23 ngx_log_debug(ev->log, "ngx_event_accept: accept ready: %d" _ | 29 ngx_log_debug(ev->log, "ngx_event_accept: accept ready: %d" _ |
24 ev->available); | 30 ev->available); |
25 | 31 |
26 ev->ready = 0; | 32 ev->ready = 0; |
27 | 33 |
34 /* DEBUG */ ev->available++; | |
35 | |
28 do { | 36 do { |
29 if ((s = accept(ac->fd, ac->sockaddr, &ac->socklen)) == -1) { | 37 ngx_test_null(pool, ngx_create_pool(ls->pool_size, ev->log), NGX_OK); |
38 | |
39 ngx_test_null(sa, ngx_palloc(pool, ls->socklen), NGX_OK); | |
40 len = ls->socklen; | |
41 | |
42 s = accept(ls->fd, sa, &len); | |
43 if (s == -1) { | |
30 err = ngx_socket_errno; | 44 err = ngx_socket_errno; |
45 ngx_destroy_pool(pool); | |
46 | |
31 if (err == NGX_EAGAIN) { | 47 if (err == NGX_EAGAIN) { |
32 ngx_log_error(NGX_LOG_INFO, ev->log, err, | 48 ngx_log_error(NGX_LOG_NOTICE, ev->log, err, |
33 "ngx_event_accept: EAGAIN while accept %s", | 49 "EAGAIN while accept %s", ls->addr_text.data); |
34 ac->addr_text); | |
35 return NGX_OK; | 50 return NGX_OK; |
36 } | 51 } |
37 | 52 |
38 ngx_log_error(NGX_LOG_ERR, ev->log, err, | 53 ngx_log_error(NGX_LOG_ALERT, ev->log, err, |
39 "ngx_event_accept: accept %s failed", ac->addr_text); | 54 "accept %s failed", ls->addr_text.data); |
40 /* if we return NGX_ERROR listen socket would be closed */ | |
41 return NGX_OK; | 55 return NGX_OK; |
42 } | 56 } |
43 | 57 |
44 #if !(HAVE_INHERITED_NONBLOCK) | 58 #if !(HAVE_INHERITED_NONBLOCK) |
45 if (ngx_nonblocking(s) == -1) | 59 if (ngx_nonblocking(s) == -1) { |
46 ngx_log_error(NGX_LOG_ERR, ev->log, ngx_socket_errno, | 60 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, |
47 ngx_nonblocking_n "failed"); | 61 ngx_nonblocking_n " %s failed", ls->addr_text.data); |
62 } | |
48 #endif | 63 #endif |
49 | 64 |
50 rev = &ngx_read_events[s]; | 65 rev = &ngx_read_events[s]; |
51 wev = &ngx_write_events[s]; | 66 wev = &ngx_write_events[s]; |
52 c = &ngx_connections[s]; | 67 c = &ngx_connections[s]; |
53 | 68 |
54 ngx_memzero(rev, sizeof(ngx_event_t)); | 69 ngx_memzero(rev, sizeof(ngx_event_t)); |
55 ngx_memzero(wev, sizeof(ngx_event_t)); | 70 ngx_memzero(wev, sizeof(ngx_event_t)); |
56 ngx_memzero(c, sizeof(ngx_connection_t)); | 71 ngx_memzero(c, sizeof(ngx_connection_t)); |
57 | 72 |
58 c->sockaddr = ac->sockaddr; | 73 c->pool = pool; |
59 c->family = ac->family; | 74 |
60 c->socklen = ac->socklen; | 75 c->sockaddr = sa; |
61 c->addr = ac->addr; | 76 c->family = ls->family; |
62 c->addr_text_max_len = ac->addr_text_max_len; | 77 c->socklen = len; |
63 c->post_accept_timeout = ac->post_accept_timeout; | 78 c->addr = ls->addr; |
79 c->addr_text_max_len = ls->addr_text_max_len; | |
80 c->post_accept_timeout = ls->post_accept_timeout; | |
64 | 81 |
65 rev->index = wev->index = NGX_INVALID_INDEX; | 82 rev->index = wev->index = NGX_INVALID_INDEX; |
66 | 83 |
67 rev->data = wev->data = c; | 84 rev->data = wev->data = c; |
68 c->read = rev; | 85 c->read = rev; |
75 | 92 |
76 wev->timer = rev->timer = 10000; | 93 wev->timer = rev->timer = 10000; |
77 wev->timer_handler = rev->timer_handler = ngx_event_close_connection; | 94 wev->timer_handler = rev->timer_handler = ngx_event_close_connection; |
78 wev->close_handler = rev->close_handler = ngx_event_close_connection; | 95 wev->close_handler = rev->close_handler = ngx_event_close_connection; |
79 | 96 |
80 c->ctx = ac->ctx; | 97 c->ctx = ls->ctx; |
81 c->servers = ac->servers; | 98 c->servers = ls->servers; |
82 c->log = rev->log = wev->log = ev->log; | |
83 | 99 |
84 /* STUB: x86: SP: xadd, MT: lock xadd, MP: lock xadd, shared */ | 100 ngx_test_null(c->log, ngx_palloc(c->pool, sizeof(ngx_log_t)), NGX_OK); |
101 ngx_memcpy(c->log, ev->log, sizeof(ngx_log_t)); | |
102 rev->log = wev->log = c->log; | |
103 | |
104 /* STUB: x86: SP: xadd ?, MT: lock xadd, MP: lock xadd, shared */ | |
85 c->number = ngx_connection_counter++; | 105 c->number = ngx_connection_counter++; |
86 | 106 |
87 ngx_log_debug(ev->log, "ngx_event_accept: accept: %d, %d" _ | 107 ngx_log_debug(ev->log, "ngx_event_accept: accept: %d, %d" _ |
88 s _ c->number); | 108 s _ c->number); |
89 | 109 |
90 #if (HAVE_DEFERRED_ACCEPT) | 110 #if (HAVE_DEFERRED_ACCEPT) |
91 if (ev->accept_filter) | 111 if (ev->accept_filter) { |
92 rev->ready = 1; | 112 rev->ready = 1; |
113 } | |
93 #endif | 114 #endif |
94 | 115 |
95 ac->handler(c); | 116 ls->handler(c); |
96 | 117 |
97 #if (HAVE_KQUEUE) | 118 #if (USE_KQUEUE) |
98 #if !(USE_KQUEUE) | 119 |
99 if (ngx_event_type == NGX_KQUEUE_EVENT) | 120 ev->available--; |
100 #endif | 121 |
122 #elif (HAVE_KQUEUE) | |
123 | |
124 if (ngx_event_type == NGX_KQUEUE_EVENT) { | |
101 ev->available--; | 125 ev->available--; |
126 } | |
127 | |
102 #endif | 128 #endif |
103 } while (ev->available); | 129 } while (ev->available); |
104 | 130 |
105 return 0; | 131 return NGX_OK; |
106 } | 132 } |