diff options
author | Jim Jagielski <jim@apache.org> | 2011-02-10 14:29:53 +0100 |
---|---|---|
committer | Jim Jagielski <jim@apache.org> | 2011-02-10 14:29:53 +0100 |
commit | 1d0800cd286d1eaadfe133e9c98e520c10de3b86 (patch) | |
tree | ebb5eaa0aa1614450e63ccd9388fa5b236730b58 /modules/proxy/proxy_util.c | |
parent | Updates. (diff) | |
download | apache2-1d0800cd286d1eaadfe133e9c98e520c10de3b86.tar.xz apache2-1d0800cd286d1eaadfe133e9c98e520c10de3b86.zip |
move function...
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1069381 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to '')
-rw-r--r-- | modules/proxy/proxy_util.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c index 89abd248d5..e1d135c3d8 100644 --- a/modules/proxy/proxy_util.c +++ b/modules/proxy/proxy_util.c @@ -2933,3 +2933,62 @@ PROXY_DECLARE(char *) ap_proxy_parse_wstatus(apr_pool_t *p, proxy_worker *w) return ret; } +PROXY_DECLARE(apr_status_t) ap_proxy_update_members(proxy_balancer *b, server_rec *s, + proxy_server_conf *conf) +{ + proxy_worker **workers; + int i; + int index; + proxy_worker_shared *shm; + ap_slotmem_provider_t *storage = b->storage; + + if (b->s->wupdated <= b->wupdated) + return APR_SUCCESS; + /* + * Look thru the list of workers in shm + * and see which one(s) we are lacking... + * again, the cast to unsigned int is safe + * since our upper limit is always max_workers + * which is int. + */ + for (index = 0; index < b->max_workers; index++) { + int found; + apr_status_t rv; + if ((rv = storage->dptr(b->slot, (unsigned int)index, (void *)&shm)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s, "worker slotmem_dptr failed"); + return APR_EGENERAL; + } + /* account for possible "holes" in the slotmem + * (eg: slots 0-2 are used, but 3 isn't, but 4-5 is) + */ + if (!shm->hash) + continue; + found = 0; + workers = (proxy_worker **)b->workers->elts; + for (i = 0; i < b->workers->nelts; i++, workers++) { + proxy_worker *worker = *workers; + if (worker->hash == shm->hash) { + found = 1; + break; + } + } + if (!found) { + proxy_worker **runtime; + runtime = apr_array_push(b->workers); + *runtime = apr_palloc(conf->pool, sizeof(proxy_worker)); + (*runtime)->hash = shm->hash; + (*runtime)->context = NULL; + (*runtime)->cp = NULL; + (*runtime)->balancer = b; + (*runtime)->s = shm; + (*runtime)->tmutex = NULL; + if ((rv = ap_proxy_initialize_worker(*runtime, s, conf->pool)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s, "Cannot init worker"); + return rv; + } + } + } + b->wupdated = b->s->wupdated; + return APR_SUCCESS; +} + |