summaryrefslogtreecommitdiffstats
path: root/modules/proxy/proxy_util.c
diff options
context:
space:
mode:
authorJim Jagielski <jim@apache.org>2011-02-10 14:29:53 +0100
committerJim Jagielski <jim@apache.org>2011-02-10 14:29:53 +0100
commit1d0800cd286d1eaadfe133e9c98e520c10de3b86 (patch)
treeebb5eaa0aa1614450e63ccd9388fa5b236730b58 /modules/proxy/proxy_util.c
parentUpdates. (diff)
downloadapache2-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.c59
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;
+}
+