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 <[email protected]>:
> 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:[email protected]]
> Sent: Thursday, December 04, 2014 10:05 AM
> To: [email protected]
> 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);
}