Mercurial > hg > nginx
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 |