Hi thanks for your reply.
i've tried also with a merging function but i have the same behaviour. Attached the same example with also merge function. Maybe i'm doing something wrong in my merge function? 2014-12-04 16:33 GMT+01:00 Eric Johanson <er...@valmarc.com>: > You have no merge function defined for your server-level config structure > (kcache_config). I would definitely try implementing that function. > Otherwise, when apache goes to combine two levels of the config hierarchy > together, the resulting combination is likely to just be an empty version > of kcache_config, which sounds like it could be causing your problem. > > -Eric > > > From: nik600 [mailto:nik...@gmail.com] > Sent: Thursday, December 04, 2014 10:05 AM > To: modules-dev@httpd.apache.org > Subject: problem with shared memory and directives for httpd > > Dear all > > i'm experiencing a problem with shared memory and i'm not able to figure > it out. > > i've got a segment of shared memory in my module config and seen that if > set some settings for the module in my configuration this memory isn't > available in the request process. > > i've also attached an example (very simplified and without any mutex, just > to show the case). > > i've noticed that if i have in my server configuration: > > <IfModule mod_kcache.c> > KcacheEnabled On > </IfModule> > > The memory segment is not availabe: > > >>[Thu Dec 04 15:26:15 2014] [crit] [client 127.0.0.1] > kcache_return_result invalid config->s > > But if i comment this directive: > > <IfModule mod_kcache.c> > # KcacheEnabled On > </IfModule> > > The memory segment is available and gets updated: > > >>[Thu Dec 04 15:24:47 2014] [debug] src/mod_kcache.c(96): [client > 127.0.0.1] config->s->counter=68 > >>[Thu Dec 04 15:24:48 2014] [debug] src/mod_kcache.c(96): [client > 127.0.0.1] config->s->counter=69 > >>[Thu Dec 04 15:24:48 2014] [debug] src/mod_kcache.c(96): [client > 127.0.0.1] config->s->counter=70 > ... > > i've attached the full example (100 lines of code) > > I'll appreciate any help, thank all in advance > > -- > /*************/ > nik600 > http://www.kumbe.it > -- /*************/ nik600 http://www.kumbe.it
#include <httpd.h> #include <http_protocol.h> #include <http_config.h> #include <http_log.h> #include <sys/stat.h> #include <apr_shm.h> typedef struct { apr_size_t counter; /* my counter */ } kcache_config_stat; typedef struct { int enabled; apr_shm_t *counters_shm; /* the APR shared segment object*/ kcache_config_stat *s;/*my stats*/ } kcache_config; void* merge_conf(apr_pool_t* pool, void* BASE, void* ADD); void *create_dir_conf(apr_pool_t *pool, char *context); void *create_server_conf(apr_pool_t *p, server_rec *s); static void register_hooks(apr_pool_t *pool); const char *kcache_set_enabled(cmd_parms *cmd, void *cfg, const char *arg); static const command_rec kcache_directives[] = { AP_INIT_TAKE1("KcacheEnabled", kcache_set_enabled, NULL, RSRC_CONF, "KcacheEnabled must have Off or On value"), { NULL } }; module AP_MODULE_DECLARE_DATA kcache_module = { STANDARD20_MODULE_STUFF, create_dir_conf, merge_conf, create_server_conf, merge_conf, kcache_directives, register_hooks }; void* merge_conf(apr_pool_t* pool, void* BASE, void* ADD) { kcache_config* base = (kcache_config *) BASE ; /* This is what was set in the parent context */ kcache_config* add = (kcache_config *) ADD ; /* This is what is set in the new context */ kcache_config* conf = (kcache_config *) create_server_conf(pool, NULL); /* This will be the merged configuration */ /* Merge configurations */ conf->enabled = ( add->enabled == 0 ) ? base->enabled : add->enabled ; conf->s=base->s; conf->counters_shm=base->counters_shm; return conf ; } void *create_dir_conf(apr_pool_t *pool, char *context) { kcache_config *cfg = apr_pcalloc(pool, sizeof(kcache_config)); return cfg; } /* * creating the server cfg */ void *create_server_conf(apr_pool_t *pool, server_rec *s) { kcache_config *cfg = apr_pcalloc(pool, sizeof(kcache_config)); if(s!=NULL){ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,"kcache:create_server_conf creo la configurazione"); } return cfg; } ; const char *kcache_set_enabled(cmd_parms *cmd, void *cfg, const char *arg) { /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ kcache_config *conf = (kcache_config *) ap_get_module_config( cmd->server->module_config, &kcache_module); /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ if (conf) { if (!strcasecmp(arg, "on")) conf->enabled = 1; else conf->enabled = 0; } return NULL; } /* * init child */ static void kcache_child_init(apr_pool_t *p, server_rec *s) { ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,"kcache:kcache_child_init imposto l'indirizzo della shared memory"); kcache_config *scfg = ap_get_module_config(s->module_config, &kcache_module); scfg->s = apr_shm_baseaddr_get(scfg->counters_shm); } /* * create the shm */ static int kcache_post_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) { ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,"kcache:kcache_post_config creo la shared memory"); kcache_config *scfg = ap_get_module_config(s->module_config, &kcache_module); apr_shm_create(&scfg->counters_shm, sizeof(*scfg->s), NULL, pconf); scfg->s = apr_shm_baseaddr_get(scfg->counters_shm); scfg->s->counter = 0; return DECLINED; } static int kcache_handler_translate_files(request_rec* r) { /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ kcache_config *config = (kcache_config *) ap_get_module_config( r->server->module_config, &kcache_module); /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ if (!config->s) { ap_log_rerror(APLOG_MARK, APLOG_CRIT, 0, r, "kcache_return_result invalid config->s"); return DECLINED; } config->s->counter++; ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "config->s->counter=%"APR_SIZE_T_FMT,config->s->counter); return DECLINED; } static void register_hooks(apr_pool_t* pool) { static const char *succ[] = { "mod_proxy.c", "mod_alias.c", "mod_userdir.c", NULL }; ap_hook_child_init(kcache_child_init, NULL, NULL, APR_HOOK_REALLY_FIRST); ap_hook_post_config(kcache_post_config, NULL, NULL, APR_HOOK_REALLY_FIRST); ap_hook_translate_name(kcache_handler_translate_files, NULL, succ, APR_HOOK_REALLY_FIRST); }