problem with shared memory and directives for httpd

2014-12-04 Thread nik600
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
#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 *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, NULL,
		NULL, create_server_conf, NULL, kcache_directives, register_hooks };

/*
 * creating the server cfg
 */
void *create_server_conf(apr_pool_t *pool, server_rec *s) {
	kcache_config *cfg = apr_pcalloc(pool, sizeof(kcache_config));

	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);
}


RE: problem with shared memory and directives for httpd

2014-12-04 Thread Eric Johanson
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


Re: problem with shared memory and directives for httpd

2014-12-04 Thread nik600
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, 

RE: problem with shared memory and directives for httpd

2014-12-04 Thread Eric Johanson
Okay but why are you managing the kcache_config structure with both the 
per-directory AND the server-level functions?  You should decide if your 
kcache_config is server-wide or if it is per-directory, and use only the 
appropriate functions.
-Eric


From: nik600 [mailto:nik...@gmail.com]
Sent: Thursday, December 04, 2014 11:15 AM
To: modules-dev@httpd.apache.org
Subject: Re: problem with shared memory and directives for httpd

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.commailto: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.commailto:nik...@gmail.com]
Sent: Thursday, December 04, 2014 10:05 AM
To: modules-dev@httpd.apache.orgmailto: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


Re: problem with shared memory and directives for httpd

2014-12-04 Thread nik600
because i've tried with both or with only one.

IE, if i use:

module AP_MODULE_DECLARE_DATA kcache_module = {
STANDARD20_MODULE_STUFF,NULL , NULL, create_server_conf, merge_conf,
kcache_directives, register_hooks };

i have the same behaviour


2014-12-04 17:32 GMT+01:00 Eric Johanson er...@valmarc.com:

 Okay but why are you managing the kcache_config structure with both the
 per-directory AND the server-level functions?  You should decide if your
 kcache_config is server-wide or if it is per-directory, and use only the
 appropriate functions.
 -Eric


 From: nik600 [mailto:nik...@gmail.com]
 Sent: Thursday, December 04, 2014 11:15 AM
 To: modules-dev@httpd.apache.org
 Subject: Re: problem with shared memory and directives for httpd

 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.commailto:
 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.commailto:nik...@gmail.com]
 Sent: Thursday, December 04, 2014 10:05 AM
 To: modules-dev@httpd.apache.orgmailto: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




-- 
/*/
nik600
http://www.kumbe.it


Re: problem with shared memory and directives for httpd

2014-12-04 Thread Yann Ylavic
Hi,

to not depend on where you declare :

 IfModule mod_kcache.c
  KcacheEnabled On
 /IfModule

you need to iterate over the server_rec list in post_config and
child_init hooks.

Please see attached modifications (where only a server_config is used).

Regards,
Yann.


On Thu, Dec 4, 2014 at 5:46 PM, nik600 nik...@gmail.com wrote:
 because i've tried with both or with only one.

 IE, if i use:

 module AP_MODULE_DECLARE_DATA kcache_module = {
 STANDARD20_MODULE_STUFF,NULL , NULL, create_server_conf, merge_conf,
 kcache_directives, register_hooks };

 i have the same behaviour


 2014-12-04 17:32 GMT+01:00 Eric Johanson er...@valmarc.com:

 Okay but why are you managing the kcache_config structure with both the
 per-directory AND the server-level functions?  You should decide if your
 kcache_config is server-wide or if it is per-directory, and use only the
 appropriate functions.
 -Eric


 From: nik600 [mailto:nik...@gmail.com]
 Sent: Thursday, December 04, 2014 11:15 AM
 To: modules-dev@httpd.apache.org
 Subject: Re: problem with shared memory and directives for httpd

 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.commailto:
 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.commailto:nik...@gmail.com]
 Sent: Thursday, December 04, 2014 10:05 AM
 To: modules-dev@httpd.apache.orgmailto: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




 --
 /*/
 nik600
 http://www.kumbe.it
--- mod_kcache.c2014-12-04 22:39:18.356881323 +0100
+++ mod_kcache.new.c2014-12-04 22:49:16.804640988 +0100
@@ -10,7 +10,7 @@ typedef struct {
 } kcache_config_stat;
 
 typedef struct {
-   int enabled;
+   int enabled, enabled_set;
apr_shm_t *counters_shm; /* the APR shared segment object*/
kcache_config_stat *s;/*my stats*/
 } kcache_config;
@@ -27,8 +27,15 @@ static const command_rec kcache_directiv
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 };
+module AP_MODULE_DECLARE_DATA kcache_module = {
+STANDARD20_MODULE_STUFF,
+NULL, /* no create_dir_conf */
+NULL, /* no merge_dir_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 */
@@ -36,26 +43,18 @@ void* merge_conf(apr_pool_t* pool, void*
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;
+conf-enabled = ( add-enabled_set ) ? add-enabled : base-enabled;
 
 return conf ;
 }
-void *create_dir_conf(apr_pool_t *pool, char 

Re: problem with shared memory and directives for httpd

2014-12-04 Thread Yann Ylavic
On Thu, Dec 4, 2014 at 10:52 PM, Yann Ylavic ylavic@gmail.com wrote:
 Please see attached modifications (where only a server_config is used).

Note that I did not even test compile the chages, just a POC...


Re: problem with shared memory and directives for httpd

2014-12-04 Thread nik600
yes, now it works, thanks again!

2014-12-04 23:49 GMT+01:00 nik600 nik...@gmail.com:

 Thanks a lot!

 i've understand the logic... i'll try and let you know!

 2014-12-04 23:43 GMT+01:00 Yann Ylavic ylavic@gmail.com:

 On Thu, Dec 4, 2014 at 10:52 PM, Yann Ylavic ylavic@gmail.com
 wrote:
  Please see attached modifications (where only a server_config is used).

 Note that I did not even test compile the chages, just a POC...




 --
 /*/
 nik600
 http://www.kumbe.it




-- 
/*/
nik600
http://www.kumbe.it