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 }