Mercurial > hg > nginx
comparison src/event/ngx_event_accept.c @ 26:53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Sun, 15 Dec 2002 06:25:09 +0000 |
parents | 77c7629a2627 |
children | a8d5abe713e6 |
comparison
equal
deleted
inserted
replaced
25:a8b156554dfe | 26:53cb81681040 |
---|---|
1 | |
2 #include <nginx.h> | |
1 | 3 |
2 #include <ngx_config.h> | 4 #include <ngx_config.h> |
3 #include <ngx_core.h> | 5 #include <ngx_core.h> |
4 #include <ngx_types.h> | 6 #include <ngx_types.h> |
5 #include <ngx_log.h> | 7 #include <ngx_log.h> |
9 #include <ngx_event_accept.h> | 11 #include <ngx_event_accept.h> |
10 | 12 |
11 | 13 |
12 int ngx_event_accept(ngx_event_t *ev) | 14 int ngx_event_accept(ngx_event_t *ev) |
13 { | 15 { |
14 ngx_err_t err; | 16 ngx_err_t err; |
15 ngx_socket_t s; | 17 ngx_socket_t s; |
16 struct sockaddr_in addr; | 18 ngx_event_t *rev, *wev; |
17 int addrlen = sizeof(struct sockaddr_in); | 19 ngx_connection_t *c, *ac; |
18 ngx_connection_t *cn = (ngx_connection_t *) ev->data; | 20 |
21 ac = (ngx_connection_t *) ev->data; | |
19 | 22 |
20 ngx_log_debug(ev->log, "ngx_event_accept: accept ready: %d" _ | 23 ngx_log_debug(ev->log, "ngx_event_accept: accept ready: %d" _ |
21 ev->available); | 24 ev->available); |
22 | 25 |
23 ev->ready = 0; | 26 ev->ready = 0; |
24 | 27 |
25 do { | 28 do { |
26 if ((s = accept(cn->fd, cn->sockaddr, &cn->socklen)) == -1) { | 29 if ((s = accept(ac->fd, ac->sockaddr, &ac->socklen)) == -1) { |
27 err = ngx_socket_errno; | 30 err = ngx_socket_errno; |
28 if (err == NGX_EAGAIN) { | 31 if (err == NGX_EAGAIN) { |
29 ngx_log_error(NGX_LOG_INFO, ev->log, err, | 32 ngx_log_error(NGX_LOG_INFO, ev->log, err, |
30 "ngx_event_accept: EAGAIN while accept %s", | 33 "ngx_event_accept: EAGAIN while accept %s", |
31 cn->addr_text); | 34 ac->addr_text); |
32 return NGX_OK; | 35 return NGX_OK; |
33 } | 36 } |
34 | 37 |
35 ngx_log_error(NGX_LOG_ERR, ev->log, err, | 38 ngx_log_error(NGX_LOG_ERR, ev->log, err, |
36 "ngx_event_accept: accept %s failed", cn->addr_text); | 39 "ngx_event_accept: accept %s failed", ac->addr_text); |
37 /* if we return NGX_ERROR listen socket would be closed */ | 40 /* if we return NGX_ERROR listen socket would be closed */ |
38 return NGX_OK; | 41 return NGX_OK; |
39 } | 42 } |
40 | |
41 ngx_log_debug(ev->log, "ngx_event_accept: accept: %d" _ s); | |
42 | 43 |
43 #if !(HAVE_INHERITED_NONBLOCK) | 44 #if !(HAVE_INHERITED_NONBLOCK) |
44 if (ngx_nonblocking(s) == -1) | 45 if (ngx_nonblocking(s) == -1) |
45 ngx_log_error(NGX_LOG_ERR, log, ngx_socket_errno, | 46 ngx_log_error(NGX_LOG_ERR, log, ngx_socket_errno, |
46 ngx_nonblocking_n "failed"); | 47 ngx_nonblocking_n "failed"); |
47 #endif | 48 #endif |
48 | 49 |
49 ngx_memzero(&ngx_read_events[s], sizeof(ngx_event_t)); | 50 rev = &ngx_read_events[s]; |
50 ngx_memzero(&ngx_write_events[s], sizeof(ngx_event_t)); | 51 wev = &ngx_write_events[s]; |
51 ngx_memzero(&ngx_connections[s], sizeof(ngx_connection_t)); | 52 c = &ngx_connections[s]; |
52 | 53 |
53 ngx_connections[s].sockaddr = cn->sockaddr; | 54 ngx_memzero(rev, sizeof(ngx_event_t)); |
54 ngx_connections[s].family = cn->family; | 55 ngx_memzero(wev, sizeof(ngx_event_t)); |
55 ngx_connections[s].socklen = cn->socklen; | 56 ngx_memzero(c, sizeof(ngx_connection_t)); |
56 ngx_connections[s].addr = cn->addr; | |
57 ngx_connections[s].addr_text.len = cn->addr_text.len; | |
58 ngx_connections[s].post_accept_timeout = cn->post_accept_timeout; | |
59 | 57 |
60 ngx_read_events[s].data = ngx_write_events[s].data | 58 c->sockaddr = ac->sockaddr; |
61 = &ngx_connections[s]; | 59 c->family = ac->family; |
62 ngx_connections[s].read = &ngx_read_events[s]; | 60 c->socklen = ac->socklen; |
63 ngx_connections[s].write = &ngx_write_events[s]; | 61 c->addr = ac->addr; |
62 c->addr_text.len = ac->addr_text.len; | |
63 c->post_accept_timeout = ac->post_accept_timeout; | |
64 | 64 |
65 ngx_connections[s].fd = s; | 65 rev->index = wev->index = NGX_INVALID_INDEX; |
66 ngx_connections[s].unexpected_eof = 1; | |
67 ngx_write_events[s].write = 1; | |
68 ngx_write_events[s].ready = 1; | |
69 | 66 |
70 ngx_write_events[s].timer = ngx_read_events[s].timer = 10000; | 67 rev->data = wev->data = c; |
68 c->read = rev; | |
69 c->write = wev; | |
71 | 70 |
72 ngx_write_events[s].timer_handler = | 71 c->fd = s; |
73 ngx_read_events[s].timer_handler = ngx_event_close_connection; | 72 c->unexpected_eof = 1; |
73 wev->write = 1; | |
74 wev->ready = 1; | |
74 | 75 |
75 ngx_write_events[s].close_handler = | 76 wev->timer = rev->timer = 10000; |
76 ngx_read_events[s].close_handler = ngx_event_close_connection; | 77 wev->timer_handler = rev->timer_handler = ngx_event_close_connection; |
78 wev->close_handler = rev->close_handler = ngx_event_close_connection; | |
77 | 79 |
78 ngx_connections[s].server = cn->server; | 80 c->server = ac->server; |
79 ngx_connections[s].servers = cn->servers; | 81 c->servers = ac->servers; |
80 ngx_connections[s].log = | 82 c->log = rev->log = wev->log = ev->log; |
81 ngx_read_events[s].log = ngx_write_events[s].log = ev->log; | 83 |
84 /* STUB: x86: SP: xadd, MT: lock xadd, MP: lock xadd, shared */ | |
85 c->number = ngx_connection_counter++; | |
86 | |
87 ngx_log_debug(ev->log, "ngx_event_accept: accept: %d, %d" _ | |
88 s _ c->number); | |
82 | 89 |
83 #if (HAVE_DEFERRED_ACCEPT) | 90 #if (HAVE_DEFERRED_ACCEPT) |
84 if (ev->accept_filter) | 91 if (ev->accept_filter) |
85 ngx_read_events[s].ready = 1; | 92 rev->ready = 1; |
86 #endif | 93 #endif |
87 | 94 |
88 cn->handler(&ngx_connections[s]); | 95 ac->handler(c); |
89 | 96 |
90 #if (HAVE_KQUEUE) | 97 #if (HAVE_KQUEUE) |
91 #if !(USE_KQUEUE) | 98 #if !(USE_KQUEUE) |
92 if (ngx_event_type == NGX_KQUEUE_EVENT) | 99 if (ngx_event_type == NGX_KQUEUE_EVENT) |
93 #endif | 100 #endif |