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 }