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 }