Mercurial > hg > nginx
comparison src/event/ngx_event_connect.c @ 119:cd54bcbaf3b5
nginx-0.0.1-2003-07-21-01:15:59 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Sun, 20 Jul 2003 21:15:59 +0000 |
parents | 3973260705cc |
children | b776ad95d96d |
comparison
equal
deleted
inserted
replaced
118:5bf52498665c | 119:cd54bcbaf3b5 |
---|---|
2 #include <ngx_event_connect.h> | 2 #include <ngx_event_connect.h> |
3 | 3 |
4 | 4 |
5 int ngx_event_connect_peer(ngx_connect_peer_t *cp) | 5 int ngx_event_connect_peer(ngx_connect_peer_t *cp) |
6 { | 6 { |
7 time_t now; | |
7 | 8 |
9 /* TODO: cached connection */ | |
10 | |
11 now = ngx_time(); | |
8 | 12 |
9 if (cp->peers->number > 1) { | 13 if (cp->peers->number > 1) { |
10 | 14 |
11 /* it's a first try - get current peer */ | 15 /* there are several peers */ |
12 | 16 |
13 if (cp->tries == cp->peers->number) { | 17 if (cp->tries == cp->peers->number) { |
14 | 18 |
15 /* Here is the race condition | 19 /* it's a first try - get a current peer */ |
16 when the peers are shared between | 20 |
21 /* Here is the race condition when the peers are shared between | |
17 the threads or the processes but it should not be serious */ | 22 the threads or the processes but it should not be serious */ |
18 | 23 |
19 cp->cur_peer = cp->peers->current++; | 24 cp->cur_peer = cp->peers->current++; |
20 | 25 |
21 if (cp->peers->current >= cp->peers->number) { | 26 if (cp->peers->current >= cp->peers->number) { |
22 cp->peers->current = 0; | 27 cp->peers->current = 0; |
23 } | 28 } |
24 | 29 |
25 /* */ | 30 /* the end of the race condition */ |
26 | 31 |
27 #if (NGX_MULTITHREADED || NGX_MULTIPROCESSED) | 32 #if (NGX_MULTITHREADED || NGX_MULTIPROCESSED) |
28 /* eliminate the sequences of the race condition */ | 33 /* eliminate the sequences of the race condition */ |
34 | |
29 if (cp->cur_peer >= cp->peers->number) { | 35 if (cp->cur_peer >= cp->peers->number) { |
30 cp->cur_peer = 0; | 36 cp->cur_peer = 0; |
31 } | 37 } |
32 #endif | 38 #endif |
33 } | 39 } |
34 | 40 |
35 if (cp->peers->max_fails > 0) { | 41 if (cp->peers->max_fails > 0) { |
36 | 42 |
43 /* the peers support a fault tolerance */ | |
44 | |
37 for ( ;; ) { | 45 for ( ;; ) { |
38 peer = &cp->peers->peers[cp->cur_peer]; | 46 peer = &cp->peers->peers[cp->cur_peer]; |
39 | 47 |
40 /* Here is the race condition | 48 /* Here is the race condition when the peers are shared between |
41 when the peers are shared between | |
42 the threads or the processes but it should not be serious */ | 49 the threads or the processes but it should not be serious */ |
43 | 50 |
44 if (peer->fails <= cp->peers->max_fails | 51 if (peer->fails <= cp->peers->max_fails |
45 || (now - peer->accessed > cp->peers->fail_timeout)) | 52 || (now - peer->accessed > cp->peers->fail_timeout)) |
46 { | 53 { |
47 break; | 54 break; |
48 } | 55 } |
49 | 56 |
50 /* */ | 57 /* the end of the race condition */ |
51 | 58 |
52 cp->cur_peer++; | 59 cp->cur_peer++; |
53 | 60 |
54 if (cp->cur_peer >= cp->peers->number) { | 61 if (cp->cur_peer >= cp->peers->number) { |
55 cp->cur_peer = 0; | 62 cp->cur_peer = 0; |
69 | 76 |
70 | 77 |
71 s = ngx_socket(AF_INET, SOCK_STREAM, IPPROTO_IP, 0); | 78 s = ngx_socket(AF_INET, SOCK_STREAM, IPPROTO_IP, 0); |
72 | 79 |
73 if (s == -1) { | 80 if (s == -1) { |
74 ngx_log_error(NGX_LOG_ALERT, cn->log, ngx_socket_errno, | 81 ngx_log_error(NGX_LOG_ALERT, cp->log, ngx_socket_errno, |
75 ngx_socket_n " failed"); | 82 ngx_socket_n " failed"); |
76 return NGX_HTTP_INTERNAL_SERVER_ERROR; | 83 return NGX_ERROR; |
77 } | 84 } |
78 | 85 |
79 if (cn->rcvbuf) { | 86 if (cp->rcvbuf) { |
80 if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, | 87 if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, |
81 (const void *) &cn->rcvbuf, sizeof(int)) == -1) { | 88 (const void *) &cp->rcvbuf, sizeof(int)) == -1) { |
82 ngx_log_error(NGX_LOG_ALERT, cn->log, ngx_socket_errno, | 89 ngx_log_error(NGX_LOG_ALERT, cp->log, ngx_socket_errno, |
83 "setsockopt(SO_RCVBUF) failed"); | 90 "setsockopt(SO_RCVBUF) failed"); |
84 | 91 |
85 if (ngx_close_socket(s) == -1) { | 92 if (ngx_close_socket(s) == -1) { |
86 ngx_log_error(NGX_LOG_ALERT, cn->log, ngx_socket_errno, | 93 ngx_log_error(NGX_LOG_ALERT, cp->log, ngx_socket_errno, |
87 ngx_close_socket_n " failed"); | 94 ngx_close_socket_n " failed"); |
88 } | 95 } |
89 | 96 |
90 return NGX_HTTP_INTERNAL_SERVER_ERROR; | 97 return NGX_ERROR; |
91 } | 98 } |
92 } | 99 } |
93 | 100 |
94 if (ngx_nonblocking(s) == -1) { | 101 if (ngx_nonblocking(s) == -1) { |
95 ngx_log_error(NGX_LOG_ALERT, cn->log, ngx_socket_errno, | 102 ngx_log_error(NGX_LOG_ALERT, cn->log, ngx_socket_errno, |
98 if (ngx_close_socket(s) == -1) { | 105 if (ngx_close_socket(s) == -1) { |
99 ngx_log_error(NGX_LOG_ALERT, cn->log, ngx_socket_errno, | 106 ngx_log_error(NGX_LOG_ALERT, cn->log, ngx_socket_errno, |
100 ngx_close_socket_n " failed"); | 107 ngx_close_socket_n " failed"); |
101 } | 108 } |
102 | 109 |
103 return NGX_HTTP_INTERNAL_SERVER_ERROR; | 110 return NGX_ERROR; |
104 } | 111 } |
105 | 112 |
106 c = &ngx_connections[s]; | 113 #if (WIN32) |
107 rev = &ngx_read_events[s]; | 114 /* |
108 wev = &ngx_write_events[s]; | 115 * Winsock assignes a socket number divisible by 4 |
116 * so to find a connection we divide a socket number by 4. | |
117 */ | |
118 | |
119 if (s % 4) { | |
120 ngx_log_error(NGX_LOG_EMERG, cp->log, 0, | |
121 ngx_socket_n | |
122 " created socket %d, not divisible by 4", s); | |
123 exit(1); | |
124 } | |
125 | |
126 c = &ngx_cycle->connections[s / 4]; | |
127 rev = &ngx_cycle->read_events[s / 4]; | |
128 wev = &ngx_cycle->write_events[s / 4]; | |
129 | |
130 #else | |
131 | |
132 c = &ngx_cycle->connections[s]; | |
133 rev = &ngx_cycle->read_events[s]; | |
134 wev = &ngx_cycle->write_events[s]; | |
135 | |
136 #endif | |
109 | 137 |
110 instance = rev->instance; | 138 instance = rev->instance; |
111 | 139 |
112 ngx_memzero(c, sizeof(ngx_connection_t)); | 140 ngx_memzero(c, sizeof(ngx_connection_t)); |
113 ngx_memzero(rev, sizeof(ngx_event_t)); | 141 ngx_memzero(rev, sizeof(ngx_event_t)); |
118 c->read = rev; | 146 c->read = rev; |
119 c->write = wev; | 147 c->write = wev; |
120 | 148 |
121 rev->instance = wev->instance = !instance; | 149 rev->instance = wev->instance = !instance; |
122 | 150 |
151 !!!!!!!!!!!!!!! | |
152 | |
123 rev->log = wev->log = c->log = cn->log; | 153 rev->log = wev->log = c->log = cn->log; |
124 c->fd = s; | 154 c->fd = s; |
125 wev->close_handler = rev->close_handler = ngx_event_close_connection; | 155 wev->close_handler = rev->close_handler = ngx_event_close_connection; |
126 | 156 } |