Return-Path: Delivered-To: apmail-ws-axis-dev-archive@www.apache.org Received: (qmail 90456 invoked from network); 5 Dec 2007 05:58:43 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 5 Dec 2007 05:58:43 -0000 Received: (qmail 20221 invoked by uid 500); 5 Dec 2007 05:58:31 -0000 Delivered-To: apmail-ws-axis-dev-archive@ws.apache.org Received: (qmail 20101 invoked by uid 500); 5 Dec 2007 05:58:31 -0000 Mailing-List: contact axis-cvs-help@ws.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: List-Id: Delivered-To: mailing list axis-cvs@ws.apache.org Received: (qmail 20090 invoked by uid 500); 5 Dec 2007 05:58:31 -0000 Delivered-To: apmail-ws-axis2-cvs@ws.apache.org Received: (qmail 20087 invoked by uid 99); 5 Dec 2007 05:58:31 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 04 Dec 2007 21:58:31 -0800 X-ASF-Spam-Status: No, hits=-100.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 05 Dec 2007 05:58:39 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id E58A21A9832; Tue, 4 Dec 2007 21:58:17 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r601215 - in /webservices/axis2/trunk/c/src/core/transport/http/server/apache2: apache2_worker.c mod_axis2.c Date: Wed, 05 Dec 2007 05:58:17 -0000 To: axis2-cvs@ws.apache.org From: dinesh@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20071205055817.E58A21A9832@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: dinesh Date: Tue Dec 4 21:58:16 2007 New Revision: 601215 URL: http://svn.apache.org/viewvc?rev=601215&view=rev Log: fixed:axis2c-780, shared global pool for apache process, Thanks Udayashankar and Lahiru for the input Modified: webservices/axis2/trunk/c/src/core/transport/http/server/apache2/apache2_worker.c webservices/axis2/trunk/c/src/core/transport/http/server/apache2/mod_axis2.c Modified: webservices/axis2/trunk/c/src/core/transport/http/server/apache2/apache2_worker.c URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/src/core/transport/http/server/apache2/apache2_worker.c?rev=601215&r1=601214&r2=601215&view=diff ============================================================================== --- webservices/axis2/trunk/c/src/core/transport/http/server/apache2/apache2_worker.c (original) +++ webservices/axis2/trunk/c/src/core/transport/http/server/apache2/apache2_worker.c Tue Dec 4 21:58:16 2007 @@ -31,6 +31,7 @@ #include #include #include +#include #define READ_SIZE 2048 @@ -45,7 +46,12 @@ axis2_char_t * repo_path) { axis2_apache2_worker_t *apache2_worker = NULL; + axutil_hash_t* svc_map = NULL; + axis2_conf_t* conf = NULL; + axutil_hash_index_t *hi = NULL; + void* svc = NULL; AXIS2_ENV_CHECK(env, NULL); + AXIS2_LOG_INFO(env->log,"[Axis2] Axis2 aaa worker created"); apache2_worker = (axis2_apache2_worker_t *) AXIS2_MALLOC(env->allocator, sizeof(axis2_apache2_worker_t)); @@ -63,6 +69,55 @@ return NULL; } + /* + * we have to load all the services. This is because, before the fork (in linux) + * we should have a full code segment. Otherwise, we can't share function pointers of services + * between processed. In fork, the code segment will be duplicated across processes + */ + conf = axis2_conf_ctx_get_conf(apache2_worker->conf_ctx, env); + if (!conf) + { + axis2_apache2_worker_free((axis2_apache2_worker_t *) apache2_worker, + env); + return NULL; + } + + svc_map = axis2_conf_get_all_svcs(conf, env); + if (!svc_map) + { + axis2_apache2_worker_free((axis2_apache2_worker_t *) apache2_worker, + env); + return NULL; + } + + + for (hi = axutil_hash_first(svc_map, env); + hi; hi = axutil_hash_next(env, hi)) + { + void *impl_class = NULL; + axutil_param_t *impl_info_param = NULL; + + axutil_hash_this(hi, NULL, NULL, &svc); + if (!svc) + continue; + impl_class = axis2_svc_get_impl_class(svc, env); + if (impl_class) + continue; + impl_info_param = axis2_svc_get_param(svc, env, AXIS2_SERVICE_CLASS); + if (!impl_info_param) + continue; + + axutil_class_loader_init(env); + impl_class = axutil_class_loader_create_dll(env, impl_info_param); + axis2_svc_set_impl_class(svc, env, impl_class); + if (impl_class) + { + AXIS2_SVC_SKELETON_INIT((axis2_svc_skeleton_t *) impl_class, env); + } + } + + AXIS2_LOG_INFO(env->log,"[Axis2] Axis2 worker created"); + return apache2_worker; } @@ -79,7 +134,7 @@ apache2_worker->conf_ctx = NULL; } - AXIS2_FREE(env->allocator, apache2_worker->conf_ctx); + AXIS2_FREE(env->allocator, apache2_worker); return; } Modified: webservices/axis2/trunk/c/src/core/transport/http/server/apache2/mod_axis2.c URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/src/core/transport/http/server/apache2/mod_axis2.c?rev=601215&r1=601214&r2=601215&view=diff ============================================================================== --- webservices/axis2/trunk/c/src/core/transport/http/server/apache2/mod_axis2.c (original) +++ webservices/axis2/trunk/c/src/core/transport/http/server/apache2/mod_axis2.c Tue Dec 4 21:58:16 2007 @@ -28,6 +28,9 @@ #include #include #include +#include +#include + /* Configuration structure populated by apache2.conf */ typedef struct axis2_config_rec @@ -36,11 +39,14 @@ char *axis2_repo_path; axutil_log_levels_t log_level; int max_log_file_size; + int axis2_global_pool_size; } axis2_config_rec_t; axis2_apache2_worker_t *axis2_worker = NULL; const axutil_env_t *axutil_env = NULL; +apr_rmm_t* rmm = NULL; +apr_global_mutex_t *global_mutex = NULL; /******************************Function Headers********************************/ static void *axis2_create_svr( @@ -63,6 +69,12 @@ void *dummy, const char *arg); +static const char * +axis2_set_global_pool_size( + cmd_parms * cmd, + void * dummy, + const char *arg); + static const char *axis2_set_log_level( cmd_parms * cmd, void *dummy, @@ -107,6 +119,8 @@ "Axis2/C log level"), AP_INIT_TAKE1("Axis2MaxLogFileSize", axis2_set_max_log_file_size, NULL, RSRC_CONF, "Axis2/C maximum log file size"), + AP_INIT_TAKE1("Axis2GlobalPoolSize", axis2_set_global_pool_size, NULL, RSRC_CONF, + "Axis2/C global pool size"), AP_INIT_TAKE1("Axis2ServiceURLPrefix", axis2_set_svc_url_prefix, NULL, RSRC_CONF, "Axis2/C service URL prifix"), @@ -196,6 +210,26 @@ } static const char * +axis2_set_global_pool_size( + cmd_parms * cmd, + void *dummy, + const char *arg) +{ + axis2_config_rec_t *conf = NULL; + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) + { + return err; + } + + conf = + (axis2_config_rec_t *) ap_get_module_config(cmd->server->module_config, + &axis2_module); + conf->axis2_global_pool_size = 1024 * 1024 * atoi(arg); + return NULL; +} + +static const char * axis2_set_log_level( cmd_parms * cmd, void *dummy, @@ -324,7 +358,21 @@ axutil_allocator_t * allocator, size_t size) { - return apr_palloc((apr_pool_t *) (allocator->current_pool), size); +#if APR_HAS_SHARED_MEMORY + if (rmm == allocator->current_pool) + { + + void* ptr = NULL; + apr_rmm_off_t offset; + apr_global_mutex_lock(global_mutex); + offset = apr_rmm_malloc(rmm, size); + if (offset) + ptr = apr_rmm_addr_get(rmm, offset); + apr_global_mutex_unlock(global_mutex); + return ptr; + } +#endif + return apr_palloc((apr_pool_t *) (allocator->current_pool), size); } void *AXIS2_CALL @@ -333,8 +381,21 @@ void *ptr, size_t size) { - /* can't be easily implemented */ - return NULL; +#if APR_HAS_SHARED_MEMORY + if (rmm == allocator->current_pool) + { + void* ptr = NULL; + apr_rmm_off_t offset; + apr_global_mutex_lock(global_mutex); + offset = apr_rmm_realloc(rmm, ptr, size); + if (offset) + ptr = apr_rmm_addr_get(rmm, offset); + apr_global_mutex_unlock(global_mutex); + return ptr; + } +#endif + /* can't be easily implemented */ + return NULL; } void AXIS2_CALL @@ -342,59 +403,133 @@ axutil_allocator_t * allocator, void *ptr) { +#if APR_HAS_SHARED_MEMORY + if (rmm == allocator->current_pool) + { + apr_rmm_off_t offset; + apr_global_mutex_lock(global_mutex); + offset = apr_rmm_offset_get(rmm, ptr); + apr_rmm_free(rmm, offset); + apr_global_mutex_unlock(global_mutex); + } +#endif } -static void -axis2_module_init( - apr_pool_t * p, - server_rec * svr_rec) +static int axis2_post_config(apr_pool_t *pconf, apr_pool_t *plog, + apr_pool_t *ptemp, server_rec *svr_rec) { - apr_pool_t *pool; - apr_status_t status; + apr_status_t status = APR_SUCCESS; axutil_allocator_t *allocator = NULL; axutil_error_t *error = NULL; axutil_log_t *axutil_logger = NULL; axutil_thread_pool_t *thread_pool = NULL; - axis2_config_rec_t *conf = - (axis2_config_rec_t *) ap_get_module_config(svr_rec->module_config, - &axis2_module); - - /* We need to init xml readers before we go into threaded env - */ - axiom_xml_reader_init(); - + void *data = NULL; + const char *userdata_key = "axis2_init"; + axis2_config_rec_t *conf = + (axis2_config_rec_t *) ap_get_module_config(svr_rec->module_config, + &axis2_module); + + /* axis2_post_config() will be called twice. Don't bother + * going through all of the initialization on the first call + * because it will just be thrown away.*/ + apr_pool_userdata_get(&data, userdata_key, svr_rec->process->pool); + if (!data) + { + apr_pool_userdata_set((const void *)1, userdata_key, + apr_pool_cleanup_null, svr_rec->process->pool); + return OK; + } + +#if APR_HAS_SHARED_MEMORY + if (conf->axis2_global_pool_size > 0) + { + apr_shm_t *shm; + apr_rmm_off_t offset; + + status = apr_shm_create(&shm, conf->axis2_global_pool_size, NULL, pconf); + if (status != APR_SUCCESS) + { + ap_log_error(APLOG_MARK, APLOG_EMERG, status, svr_rec, + "[Axis2] Error creating shared memory pool"); + exit(APEXIT_INIT); + } + + status = apr_rmm_init(&rmm, NULL, apr_shm_baseaddr_get(shm), conf->axis2_global_pool_size, + pconf); + if (status != APR_SUCCESS) + { + ap_log_error(APLOG_MARK, APLOG_EMERG, status, svr_rec, + "[Axis2] Error creating relocatable memory pool"); + exit(APEXIT_INIT); + } + + status = apr_global_mutex_create(&global_mutex, NULL, + APR_LOCK_DEFAULT, pconf); + if (status != APR_SUCCESS) + { + ap_log_error(APLOG_MARK, APLOG_EMERG, status, svr_rec, + "[Axis2] Error creating global mutex"); + exit(APEXIT_INIT); + } + + /*status = unixd_set_global_mutex_perms(global_mutex); + if (status != APR_SUCCESS) + { + ap_log_error(APLOG_MARK, APLOG_EMERG, status, svr_rec, + "[Axis2] Permision cannot be set to global mutex"); + exit(APEXIT_INIT); + } + */ + + offset = apr_rmm_malloc(rmm, sizeof(axutil_allocator_t)); + if (!offset) + { + ap_log_error(APLOG_MARK, APLOG_EMERG, status, svr_rec, + "[Axis2] Error in creating allocator in global pool"); + exit(APEXIT_INIT); + } + allocator = apr_rmm_addr_get(rmm, offset); + allocator->malloc_fn = axis2_module_malloc; + allocator->realloc = axis2_module_realloc; + allocator->free_fn = axis2_module_free; + allocator->local_pool = (void *) rmm; + allocator->current_pool = (void *) rmm; + allocator->global_pool = (void *) rmm; + } + else +#endif /* create an allocator that uses APR memory pools and lasts the * lifetime of the httpd server child process */ - status = apr_pool_create(&pool, p); - if (status) - { - ap_log_error(APLOG_MARK, APLOG_EMERG, status, svr_rec, - "[Axis2] Error allocating mod_axis2 memory pool"); - exit(APEXIT_CHILDFATAL); - } - allocator = (axutil_allocator_t *) apr_palloc(pool, - sizeof(axutil_allocator_t)); - if (!allocator) - { - ap_log_error(APLOG_MARK, APLOG_EMERG, APR_ENOMEM, svr_rec, - "[Axis2] Error allocating mod_axis2 allocator"); - exit(APEXIT_CHILDFATAL); - } - allocator->malloc_fn = axis2_module_malloc; - allocator->realloc = axis2_module_realloc; - allocator->free_fn = axis2_module_free; - allocator->local_pool = (void *) pool; - allocator->current_pool = (void *) pool; - allocator->global_pool = (void *) pool; + { + apr_pool_t *pool = NULL; + status = apr_pool_create(&pool, pconf); + if (status) + { + ap_log_error(APLOG_MARK, APLOG_EMERG, status, svr_rec, + "[Axis2] Error allocating mod_axis2 memory pool"); + exit(APEXIT_INIT); + } + allocator = (axutil_allocator_t *) apr_palloc(pool, + sizeof(axutil_allocator_t)); + if (!allocator) + { + ap_log_error(APLOG_MARK, APLOG_EMERG, APR_ENOMEM, svr_rec, + "[Axis2] Error allocating mod_axis2 allocator"); + exit(APEXIT_INIT); + } + allocator->malloc_fn = axis2_module_malloc; + allocator->realloc = axis2_module_realloc; + allocator->free_fn = axis2_module_free; + allocator->local_pool = (void *) pool; + allocator->current_pool = (void *) pool; + allocator->global_pool = (void *) pool; + } - if (!allocator) - { - ap_log_error(APLOG_MARK, APLOG_EMERG, APR_EGENERAL, svr_rec, - "[Axis2] Error initializing mod_axis2 allocator"); - exit(APEXIT_CHILDFATAL); - } + /* We need to init xml readers before we go into threaded env + */ + axiom_xml_reader_init(); axutil_error_init(); error = axutil_error_create(allocator); @@ -404,6 +539,7 @@ "[Axis2] Error creating mod_axis2 error structure"); exit(APEXIT_CHILDFATAL); } + axutil_logger = axutil_log_create(allocator, NULL, conf->axutil_log_file); if (!axutil_logger) { @@ -429,7 +565,6 @@ } if (axutil_logger) { - axutil_logger->level = conf->log_level; axutil_logger->size = conf->max_log_file_size; AXIS2_LOG_INFO(axutil_env->log, "Apache Axis2/C version in use : %s", @@ -438,20 +573,30 @@ "Starting log with log level %d and max log file size %d", conf->log_level, conf->max_log_file_size); } - axis2_worker = axis2_apache2_worker_create(axutil_env, - conf->axis2_repo_path); + + axis2_worker = axis2_apache2_worker_create(axutil_env, + conf->axis2_repo_path); if (!axis2_worker) { ap_log_error(APLOG_MARK, APLOG_EMERG, APR_EGENERAL, svr_rec, "[Axis2] Error creating mod_axis2 apache2 worker"); exit(APEXIT_CHILDFATAL); } + return OK; +} + +static void +axis2_module_init( + apr_pool_t * p, + server_rec * svr_rec) +{ } static void axis2_register_hooks( apr_pool_t * p) { + ap_hook_post_config(axis2_post_config, NULL, NULL, APR_HOOK_MIDDLE); ap_hook_handler(axis2_handler, NULL, NULL, APR_HOOK_MIDDLE); ap_hook_child_init(axis2_module_init, NULL, NULL, APR_HOOK_MIDDLE); } --------------------------------------------------------------------- To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org For additional commands, e-mail: axis-cvs-help@ws.apache.org