On Wed, Nov 16, 2011 at 21:03, Pranesh Vadhirajan
wrote:
> Hello Everyone,
>
> I am trying to understand how to implement sharing of objects in memory
> between various processes in apache. I have been using the routines defined
> in to implement the shared memory mapping functionality.
> However, I am not seeing any actual sharing of the objects in my output.
>
>
>
> I have attached the code segment of my module containing the request
> handler:
>
>
>
> #include "httpd.h"
>
> #include "http_core.h"
>
> #include "http_config.h"
>
> #include
>
> #include
>
> #include
>
> #include
>
> #include "sessions.h"
>
> #include
>
> #include
>
> #include
>
> #include
>
> #include
>
> #include
>
>
>
>
>
> void set_shared_region(int *shared_int)
>
> {
>
> int fd;
>
>
>
> /* Create shared memory object and set its size */
>
> fd = shm_open("/myregion", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
>
> if(fd == -1)
>
> fprintf(stderr,"shm_open error");
>
>
>
> if(ftruncate(fd, sizeof(int)) == -1)
>
> fprintf(stderr,"ftruncate error");
>
>
>
> /* Map shared memory object */
>
> shared_int = mmap(NULL, sizeof(int),PROT_READ | PROT_WRITE, MAP_SHARED,
> fd, 0);
>
> if(shared_int == MAP_FAILED)
>
> fprintf(stderr,"mmap error");
>
> }
>
>
>
> int start_mutex()
>
> {
>
> if(initial_mutex_value == 0)
>
> {
>
> if(sem_init(&session_mutex,1,1) < 0)
>
> {
>
> fprintf(stderr,"error initializing semaphore");
>
> return 0;
>
> }
>
> initial_mutex_value = 1;
>
> }
>
> return 1;
>
> }
>
>
>
> static int counter_handler(request_rec* r)
>
> {
>
> char time_buffer[30];
>
> char entry[1024];
>
> long int tid,pid;
>
> apr_ctime(time_buffer,r->request_time);
>
> start_mutex();
>
> sem_wait(&session_mutex);
>
> set_shared_region(&ctr);
>
> ctr++;
>
> sem_post(&session_mutex);
>
> //tid = (long int)getthreadid();
>
> pid = (long int)getpid();
>
> sprintf(entry,"counter: %i, thread: %ld, process: %ld, request: %s,
> time: %s;",ctr,(long int)0,pid,r->the_request,time_buffer);
>
> tempToDB(entry);
>
>
>
> return DECLINED;
>
> }
>
>
>
> static void counter_register_hooks (apr_pool_t *p)
>
> {
>
> ap_hook_handler(counter_handler, NULL, NULL, APR_HOOK_REALLY_FIRST);
>
> }
>
>
>
> module AP_MODULE_DECLARE_DATA counter_module =
>
> {
>
> STANDARD20_MODULE_STUFF,
>
> NULL,//uvds_metrics_dir_conf, /* Per-Directory Configuration */
>
> NULL,//uvds_metrics_dir_merge, /* Directory Config Merger */
>
> NULL,//uvds_metrics_server_conf, /* Per-Server Configuration */
>
> NULL,//uvds_metrics_server_merge, /* Server Config Merger */
>
> NULL,//uvds_metrics_cmds, /* Command Table (Directives) */
>
> counter_register_hooks /* Registering Hooks */
>
> };
>
>
>
> The handler code uses the variable ctr which is defined in the header file
> “sessions.h” . Here’s the relevant segment in sessions.h:
>
>
>
> #include
>
> #include
>
> #include
>
> #include "libpq-fe.h"
>
> #include
>
>
>
> sem_t session_mutex;
>
> int initial_mutex_value = 0;
>
> int ctr = 0;
>
>
>
> void tempToDB(char *entry);
>
>
>
>
>
>
>
> Here’s the output of my code:
>
>
>
> 64201;"counter: 1, thread:
> 0, process: 18194, request: POST /login?destination=login HTTP/1.1, time:
> Wed Nov 16 19:56:04 2011;"
>
> 64202;"counter: 2, thread: 0, process: 18194, request: POST
> /login?destination=login HTTP/1.1, time: Wed Nov 16 19:56:04 2011;"
>
> 64203;"counter: 3, thread: 0, process: 18194, request: GET /login HTTP/1.1,
> time: Wed Nov 16 19:56:05 2011;"
>
> 64204;"counter: 4, thread: 0, process: 18194, request: GET /login HTTP/1.1,
> time: Wed Nov 16 19:56:05 2011;"
>
> 64205;"counter: 5, thread: 0, process: 18194, request: GET /dashboard
> HTTP/1.1, time: Wed Nov 16 19:56:06 2011;"
>
> 64206;"counter: 6, thread: 0, process: 18194, request: GET /dashboard
> HTTP/1.1, time: Wed Nov 16 19:56:06 2011;"
>
> 64207;"counter: 7, thread: 0, process: 18194, request: GET /viewfeeds
> HTTP/1.1, time: Wed Nov 16 19:56:07 2011;"
>
> 64208;"counter: 8, thread: 0, process: 18194, request: GET /viewfeeds
> HTTP/1.1, time: Wed Nov 16 19:56:07 2011;"
>
> 64209;"counter: 9, thread: 0, process: 18194, request: GET
> /viewfeeds/dosort&sortby=none HTTP/1.1, time: Wed Nov 16 19:56:07 2011;"
>
> 64210;"counter: 10, thread: 0, process: 18194, request: GET
> /viewfeeds/dosort&sortby=none HTTP/1.1, time: Wed Nov 16 19:56:07 2011;"
>
> 64211;"counter: 1, thread: 0, process: 18201, request: GET
> /misc/viewfeeds/images/sidebar_05.png HTTP/1.1, time: Wed Nov 16 19:56:07
> 2011;"
>
> 64212;"counter: 2, thread: 0, process: 18201, request: GET
> /misc/viewfeeds/images/sidebar_05.png HTTP/1.1, time: Wed Nov 16 19:56:07
> 2011;"
>
> 64213;"counter: 11, thread: 0, process: 18194, request: GET /recordings
> HTTP/1.1,