Mercurial > hg > nginx
comparison src/stream/ngx_stream_upstream_zone_module.c @ 6198:311d232ad803
Upstream: fixed shared upstreams on win32.
author | Ruslan Ermilov <ru@nginx.com> |
---|---|
date | Tue, 16 Jun 2015 00:43:00 +0300 |
parents | 68c106e6fa0a |
children | 341e4303d25b |
comparison
equal
deleted
inserted
replaced
6197:0dcef374b8bb | 6198:311d232ad803 |
---|---|
12 | 12 |
13 static char *ngx_stream_upstream_zone(ngx_conf_t *cf, ngx_command_t *cmd, | 13 static char *ngx_stream_upstream_zone(ngx_conf_t *cf, ngx_command_t *cmd, |
14 void *conf); | 14 void *conf); |
15 static ngx_int_t ngx_stream_upstream_init_zone(ngx_shm_zone_t *shm_zone, | 15 static ngx_int_t ngx_stream_upstream_init_zone(ngx_shm_zone_t *shm_zone, |
16 void *data); | 16 void *data); |
17 static ngx_int_t ngx_stream_upstream_zone_copy_peers(ngx_slab_pool_t *shpool, | 17 static ngx_stream_upstream_rr_peers_t *ngx_stream_upstream_zone_copy_peers( |
18 ngx_stream_upstream_srv_conf_t *uscf); | 18 ngx_slab_pool_t *shpool, ngx_stream_upstream_srv_conf_t *uscf); |
19 | 19 |
20 | 20 |
21 static ngx_command_t ngx_stream_upstream_zone_commands[] = { | 21 static ngx_command_t ngx_stream_upstream_zone_commands[] = { |
22 | 22 |
23 { ngx_string("zone"), | 23 { ngx_string("zone"), |
115 ngx_stream_upstream_init_zone(ngx_shm_zone_t *shm_zone, void *data) | 115 ngx_stream_upstream_init_zone(ngx_shm_zone_t *shm_zone, void *data) |
116 { | 116 { |
117 size_t len; | 117 size_t len; |
118 ngx_uint_t i; | 118 ngx_uint_t i; |
119 ngx_slab_pool_t *shpool; | 119 ngx_slab_pool_t *shpool; |
120 ngx_stream_upstream_rr_peers_t *peers, **peersp; | |
120 ngx_stream_upstream_srv_conf_t *uscf, **uscfp; | 121 ngx_stream_upstream_srv_conf_t *uscf, **uscfp; |
121 ngx_stream_upstream_main_conf_t *umcf; | 122 ngx_stream_upstream_main_conf_t *umcf; |
122 | 123 |
123 shpool = (ngx_slab_pool_t *) shm_zone->shm.addr; | 124 shpool = (ngx_slab_pool_t *) shm_zone->shm.addr; |
125 umcf = shm_zone->data; | |
126 uscfp = umcf->upstreams.elts; | |
124 | 127 |
125 if (shm_zone->shm.exists) { | 128 if (shm_zone->shm.exists) { |
126 return NGX_ERROR; | 129 peers = shpool->data; |
130 | |
131 for (i = 0; i < umcf->upstreams.nelts; i++) { | |
132 uscf = uscfp[i]; | |
133 | |
134 if (uscf->shm_zone != shm_zone) { | |
135 continue; | |
136 } | |
137 | |
138 uscf->peer.data = peers; | |
139 peers = peers->zone_next; | |
140 } | |
141 | |
142 return NGX_OK; | |
127 } | 143 } |
128 | 144 |
129 len = sizeof(" in upstream zone \"\"") + shm_zone->shm.name.len; | 145 len = sizeof(" in upstream zone \"\"") + shm_zone->shm.name.len; |
130 | 146 |
131 shpool->log_ctx = ngx_slab_alloc(shpool, len); | 147 shpool->log_ctx = ngx_slab_alloc(shpool, len); |
137 &shm_zone->shm.name); | 153 &shm_zone->shm.name); |
138 | 154 |
139 | 155 |
140 /* copy peers to shared memory */ | 156 /* copy peers to shared memory */ |
141 | 157 |
142 umcf = shm_zone->data; | 158 peersp = (ngx_stream_upstream_rr_peers_t **) &shpool->data; |
143 uscfp = umcf->upstreams.elts; | |
144 | 159 |
145 for (i = 0; i < umcf->upstreams.nelts; i++) { | 160 for (i = 0; i < umcf->upstreams.nelts; i++) { |
146 uscf = uscfp[i]; | 161 uscf = uscfp[i]; |
147 | 162 |
148 if (uscf->shm_zone != shm_zone) { | 163 if (uscf->shm_zone != shm_zone) { |
149 continue; | 164 continue; |
150 } | 165 } |
151 | 166 |
152 if (ngx_stream_upstream_zone_copy_peers(shpool, uscf) != NGX_OK) { | 167 peers = ngx_stream_upstream_zone_copy_peers(shpool, uscf); |
168 if (peers == NULL) { | |
153 return NGX_ERROR; | 169 return NGX_ERROR; |
154 } | 170 } |
171 | |
172 *peersp = peers; | |
173 peersp = &peers->zone_next; | |
155 } | 174 } |
156 | 175 |
157 return NGX_OK; | 176 return NGX_OK; |
158 } | 177 } |
159 | 178 |
160 | 179 |
161 static ngx_int_t | 180 static ngx_stream_upstream_rr_peers_t * |
162 ngx_stream_upstream_zone_copy_peers(ngx_slab_pool_t *shpool, | 181 ngx_stream_upstream_zone_copy_peers(ngx_slab_pool_t *shpool, |
163 ngx_stream_upstream_srv_conf_t *uscf) | 182 ngx_stream_upstream_srv_conf_t *uscf) |
164 { | 183 { |
165 ngx_stream_upstream_rr_peer_t *peer, **peerp; | 184 ngx_stream_upstream_rr_peer_t *peer, **peerp; |
166 ngx_stream_upstream_rr_peers_t *peers, *backup; | 185 ngx_stream_upstream_rr_peers_t *peers, *backup; |
167 | 186 |
168 peers = ngx_slab_alloc(shpool, sizeof(ngx_stream_upstream_rr_peers_t)); | 187 peers = ngx_slab_alloc(shpool, sizeof(ngx_stream_upstream_rr_peers_t)); |
169 if (peers == NULL) { | 188 if (peers == NULL) { |
170 return NGX_ERROR; | 189 return NULL; |
171 } | 190 } |
172 | 191 |
173 ngx_memcpy(peers, uscf->peer.data, sizeof(ngx_stream_upstream_rr_peers_t)); | 192 ngx_memcpy(peers, uscf->peer.data, sizeof(ngx_stream_upstream_rr_peers_t)); |
174 | 193 |
175 peers->shpool = shpool; | 194 peers->shpool = shpool; |
177 for (peerp = &peers->peer; *peerp; peerp = &peer->next) { | 196 for (peerp = &peers->peer; *peerp; peerp = &peer->next) { |
178 /* pool is unlocked */ | 197 /* pool is unlocked */ |
179 peer = ngx_slab_calloc_locked(shpool, | 198 peer = ngx_slab_calloc_locked(shpool, |
180 sizeof(ngx_stream_upstream_rr_peer_t)); | 199 sizeof(ngx_stream_upstream_rr_peer_t)); |
181 if (peer == NULL) { | 200 if (peer == NULL) { |
182 return NGX_ERROR; | 201 return NULL; |
183 } | 202 } |
184 | 203 |
185 ngx_memcpy(peer, *peerp, sizeof(ngx_stream_upstream_rr_peer_t)); | 204 ngx_memcpy(peer, *peerp, sizeof(ngx_stream_upstream_rr_peer_t)); |
186 | 205 |
187 *peerp = peer; | 206 *peerp = peer; |
191 goto done; | 210 goto done; |
192 } | 211 } |
193 | 212 |
194 backup = ngx_slab_alloc(shpool, sizeof(ngx_stream_upstream_rr_peers_t)); | 213 backup = ngx_slab_alloc(shpool, sizeof(ngx_stream_upstream_rr_peers_t)); |
195 if (backup == NULL) { | 214 if (backup == NULL) { |
196 return NGX_ERROR; | 215 return NULL; |
197 } | 216 } |
198 | 217 |
199 ngx_memcpy(backup, peers->next, sizeof(ngx_stream_upstream_rr_peers_t)); | 218 ngx_memcpy(backup, peers->next, sizeof(ngx_stream_upstream_rr_peers_t)); |
200 | 219 |
201 backup->shpool = shpool; | 220 backup->shpool = shpool; |
203 for (peerp = &backup->peer; *peerp; peerp = &peer->next) { | 222 for (peerp = &backup->peer; *peerp; peerp = &peer->next) { |
204 /* pool is unlocked */ | 223 /* pool is unlocked */ |
205 peer = ngx_slab_calloc_locked(shpool, | 224 peer = ngx_slab_calloc_locked(shpool, |
206 sizeof(ngx_stream_upstream_rr_peer_t)); | 225 sizeof(ngx_stream_upstream_rr_peer_t)); |
207 if (peer == NULL) { | 226 if (peer == NULL) { |
208 return NGX_ERROR; | 227 return NULL; |
209 } | 228 } |
210 | 229 |
211 ngx_memcpy(peer, *peerp, sizeof(ngx_stream_upstream_rr_peer_t)); | 230 ngx_memcpy(peer, *peerp, sizeof(ngx_stream_upstream_rr_peer_t)); |
212 | 231 |
213 *peerp = peer; | 232 *peerp = peer; |
217 | 236 |
218 done: | 237 done: |
219 | 238 |
220 uscf->peer.data = peers; | 239 uscf->peer.data = peers; |
221 | 240 |
222 return NGX_OK; | 241 return peers; |
223 } | 242 } |