comparison src/event/ngx_event_connect.c @ 86:3973260705cc

nginx-0.0.1-2003-05-12-19:52:24 import
author Igor Sysoev <igor@sysoev.ru>
date Mon, 12 May 2003 15:52:24 +0000
parents
children cd54bcbaf3b5
comparison
equal deleted inserted replaced
85:3549c2bf9eaf 86:3973260705cc
1
2 #include <ngx_event_connect.h>
3
4
5 int ngx_event_connect_peer(ngx_connect_peer_t *cp)
6 {
7
8
9 if (cp->peers->number > 1) {
10
11 /* it's a first try - get current peer */
12
13 if (cp->tries == cp->peers->number) {
14
15 /* Here is the race condition
16 when the peers are shared between
17 the threads or the processes but it should not be serious */
18
19 cp->cur_peer = cp->peers->current++;
20
21 if (cp->peers->current >= cp->peers->number) {
22 cp->peers->current = 0;
23 }
24
25 /* */
26
27 #if (NGX_MULTITHREADED || NGX_MULTIPROCESSED)
28 /* eliminate the sequences of the race condition */
29 if (cp->cur_peer >= cp->peers->number) {
30 cp->cur_peer = 0;
31 }
32 #endif
33 }
34
35 if (cp->peers->max_fails > 0) {
36
37 for ( ;; ) {
38 peer = &cp->peers->peers[cp->cur_peer];
39
40 /* Here is the race condition
41 when the peers are shared between
42 the threads or the processes but it should not be serious */
43
44 if (peer->fails <= cp->peers->max_fails
45 || (now - peer->accessed > cp->peers->fail_timeout))
46 {
47 break;
48 }
49
50 /* */
51
52 cp->cur_peer++;
53
54 if (cp->cur_peer >= cp->peers->number) {
55 cp->cur_peer = 0;
56 }
57
58 cp->tries--;
59
60 if (cp->tries == 0) {
61 return NGX_ERROR;
62 }
63 }
64 }
65 }
66
67
68
69
70
71 s = ngx_socket(AF_INET, SOCK_STREAM, IPPROTO_IP, 0);
72
73 if (s == -1) {
74 ngx_log_error(NGX_LOG_ALERT, cn->log, ngx_socket_errno,
75 ngx_socket_n " failed");
76 return NGX_HTTP_INTERNAL_SERVER_ERROR;
77 }
78
79 if (cn->rcvbuf) {
80 if (setsockopt(s, SOL_SOCKET, SO_RCVBUF,
81 (const void *) &cn->rcvbuf, sizeof(int)) == -1) {
82 ngx_log_error(NGX_LOG_ALERT, cn->log, ngx_socket_errno,
83 "setsockopt(SO_RCVBUF) failed");
84
85 if (ngx_close_socket(s) == -1) {
86 ngx_log_error(NGX_LOG_ALERT, cn->log, ngx_socket_errno,
87 ngx_close_socket_n " failed");
88 }
89
90 return NGX_HTTP_INTERNAL_SERVER_ERROR;
91 }
92 }
93
94 if (ngx_nonblocking(s) == -1) {
95 ngx_log_error(NGX_LOG_ALERT, cn->log, ngx_socket_errno,
96 ngx_nonblocking_n " failed");
97
98 if (ngx_close_socket(s) == -1) {
99 ngx_log_error(NGX_LOG_ALERT, cn->log, ngx_socket_errno,
100 ngx_close_socket_n " failed");
101 }
102
103 return NGX_HTTP_INTERNAL_SERVER_ERROR;
104 }
105
106 c = &ngx_connections[s];
107 rev = &ngx_read_events[s];
108 wev = &ngx_write_events[s];
109
110 instance = rev->instance;
111
112 ngx_memzero(c, sizeof(ngx_connection_t));
113 ngx_memzero(rev, sizeof(ngx_event_t));
114 ngx_memzero(wev, sizeof(ngx_event_t));
115
116 rev->index = wev->index = NGX_INVALID_INDEX;
117 rev->data = wev->data = c;
118 c->read = rev;
119 c->write = wev;
120
121 rev->instance = wev->instance = !instance;
122
123 rev->log = wev->log = c->log = cn->log;
124 c->fd = s;
125 wev->close_handler = rev->close_handler = ngx_event_close_connection;
126