diff options
Diffstat (limited to 'rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.c')
-rw-r--r-- | rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.c | 351 |
1 files changed, 0 insertions, 351 deletions
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.c deleted file mode 100644 index b75ae933..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.c +++ /dev/null @@ -1,351 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*************************************************************************** - * Description: Workers controller * - * Author: Gal Shachor <shachor@il.ibm.com> * - * Author: Henri Gomez <hgomez@apache.org> * - * Version: $Revision: 708019 $ * - ***************************************************************************/ - -#define _PLACE_WORKER_LIST_HERE -#include "jk_worker_list.h" -#include "jk_worker.h" -#include "jk_util.h" -#include "jk_mt.h" - -static void close_workers(jk_logger_t *l); - -static worker_factory get_factory_for(const char *type); - -static int build_worker_map(jk_map_t *init_data, - char **worker_list, - unsigned num_of_workers, - jk_worker_env_t *we, jk_logger_t *l); - -/* Global worker list */ -static jk_map_t *worker_map; -#if _MT_CODE -static JK_CRIT_SEC worker_lock; -#endif -static int worker_maintain_time = 0; - -int wc_open(jk_map_t *init_data, jk_worker_env_t *we, jk_logger_t *l) -{ - int rc; - JK_TRACE_ENTER(l); - - if (!jk_map_alloc(&worker_map)) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - JK_INIT_CS(&worker_lock, rc); - if (rc == JK_FALSE) { - jk_log(l, JK_LOG_ERROR, - "creating thread lock (errno=%d)", - errno); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - jk_map_dump(init_data, l); - we->init_data = init_data; - if (!jk_get_worker_list(init_data, &(we->worker_list), - &we->num_of_workers)) { - JK_TRACE_EXIT(l); - we->num_of_workers = 0; - we->worker_list = NULL; - return JK_FALSE; - } - - worker_maintain_time = jk_get_worker_maintain_time(init_data); - if(worker_maintain_time < 0) - worker_maintain_time = 0; - - if (!build_worker_map(init_data, we->worker_list, - we->num_of_workers, we, l)) { - close_workers(l); - we->num_of_workers = 0; - we->worker_list = NULL; - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - - -void wc_close(jk_logger_t *l) -{ - int rc; - JK_TRACE_ENTER(l); - JK_DELETE_CS(&worker_lock, rc); - close_workers(l); - JK_TRACE_EXIT(l); -} - -jk_worker_t *wc_get_worker_for_name(const char *name, jk_logger_t *l) -{ - jk_worker_t *rc; - - JK_TRACE_ENTER(l); - if (!name) { - JK_LOG_NULL_PARAMS(l); - JK_TRACE_EXIT(l); - return NULL; - } - - rc = jk_map_get(worker_map, name, NULL); - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, "%s a worker %s", - rc ? "found" : "did not find", name); - JK_TRACE_EXIT(l); - return rc; -} - -int wc_create_worker(const char *name, int use_map, - jk_map_t *init_data, - jk_worker_t **rc, jk_worker_env_t *we, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - - if (rc) { - const char *type = jk_get_worker_type(init_data, name); - worker_factory fac = get_factory_for(type); - jk_worker_t *w = NULL; - unsigned int i, num_of_maps; - char **map_names; - int wtype; - - *rc = NULL; - - if (!fac) { - jk_log(l, JK_LOG_ERROR, "Unknown worker type %s for worker %s", - type, name); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "about to create instance %s of %s", name, - type); - - if (((wtype = fac(&w, name, l)) == 0) || !w) { - jk_log(l, JK_LOG_ERROR, - "factory for %s failed for %s", type, - name); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "about to validate and init %s", name); - if (!w->validate(w, init_data, we, l)) { - w->destroy(&w, l); - jk_log(l, JK_LOG_ERROR, - "validate failed for %s", name); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (!w->init(w, init_data, we, l)) { - w->destroy(&w, l); - jk_log(l, JK_LOG_ERROR, "init failed for %s", - name); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - if (use_map && - jk_get_worker_mount_list(init_data, name, - &map_names, - &num_of_maps) && num_of_maps) { - for (i = 0; i < num_of_maps; i++) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "mounting %s to worker %s", - map_names[i], name); - if (uri_worker_map_add(we->uri_to_worker, map_names[i], - name, SOURCE_TYPE_WORKERDEF, l) == JK_FALSE) { - w->destroy(&w, l); - jk_log(l, JK_LOG_ERROR, - "mounting %s failed for %s", - map_names[i], name); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - } - w->type = wtype; - *rc = w; - JK_TRACE_EXIT(l); - return JK_TRUE; - } - - JK_LOG_NULL_PARAMS(l); - return JK_FALSE; -} - -static void close_workers(jk_logger_t *l) -{ - int sz = jk_map_size(worker_map); - - JK_TRACE_ENTER(l); - - if (sz > 0) { - int i; - for (i = 0; i < sz; i++) { - jk_worker_t *w = jk_map_value_at(worker_map, i); - if (w) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "close_workers will destroy worker %s", - jk_map_name_at(worker_map, i)); - w->destroy(&w, l); - } - } - } - jk_map_free(&worker_map); - JK_TRACE_EXIT(l); -} - -static int build_worker_map(jk_map_t *init_data, - char **worker_list, - unsigned num_of_workers, - jk_worker_env_t *we, jk_logger_t *l) -{ - unsigned i; - - JK_TRACE_ENTER(l); - - for (i = 0; i < num_of_workers; i++) { - jk_worker_t *w = NULL; - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "creating worker %s", worker_list[i]); - - if (wc_create_worker(worker_list[i], 1, init_data, &w, we, l)) { - jk_worker_t *oldw = NULL; - if (!jk_map_put(worker_map, worker_list[i], w, (void *)&oldw)) { - w->destroy(&w, l); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (oldw) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "removing old %s worker", - worker_list[i]); - oldw->destroy(&oldw, l); - } - } - else { - jk_log(l, JK_LOG_ERROR, - "failed to create worker %s", - worker_list[i]); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -static worker_factory get_factory_for(const char *type) -{ - worker_factory_record_t *factory = &worker_factories[0]; - while (factory->name) { - if (0 == strcmp(factory->name, type)) { - return factory->fac; - } - - factory++; - } - - return NULL; -} - -const char *wc_get_name_for_type(int type, jk_logger_t *l) -{ - worker_factory_record_t *factory = &worker_factories[0]; - while (factory->name) { - if (type == factory->type) { - jk_log(l, JK_LOG_DEBUG, - "Found worker type '%s'", - factory->name); - return factory->name; - } - - factory++; - } - - return NULL; -} - -void wc_maintain(jk_logger_t *l) -{ - static time_t last_maintain = 0; - static int running_maintain = 0; - int sz = jk_map_size(worker_map); - - JK_TRACE_ENTER(l); - - /* Only proceed if all of the below hold true: - * - there are workers - * - maintenance wasn't disabled by configuration - * - time since last maintenance is big enough - */ - if (sz > 0 && worker_maintain_time > 0 && - difftime(time(NULL), last_maintain) >= worker_maintain_time) { - int i; - JK_ENTER_CS(&worker_lock, i); - if (running_maintain || - difftime(time(NULL), last_maintain) < worker_maintain_time) { - /* Already in maintain */ - JK_LEAVE_CS(&worker_lock, i); - JK_TRACE_EXIT(l); - return; - } - /* Set the maintain run flag so other threads skip - * the maintain until we are finished. - */ - running_maintain = 1; - JK_LEAVE_CS(&worker_lock, i); - - for (i = 0; i < sz; i++) { - jk_worker_t *w = jk_map_value_at(worker_map, i); - if (w && w->maintain) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Maintaining worker %s", - jk_map_name_at(worker_map, i)); - w->maintain(w, time(NULL), l); - } - } - JK_ENTER_CS(&worker_lock, i); - last_maintain = time(NULL); - running_maintain = 0; - JK_LEAVE_CS(&worker_lock, i); - } - JK_TRACE_EXIT(l); -} |