Re: Apache shared memory implementation

2011-11-16 Thread Sorin Manolache
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,  

Re: Apache shared memory implementation

2011-11-16 Thread William A. Rowe Jr.

On 11/16/2011 2:03 PM, Pranesh Vadhirajan wrote:


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.


Hi Pranesh; you are more likely to get help with this on a linux
developer forum, since there is nothing Apache specific here.

You might want to look at the httpd scoreboard implementation,
or better yet, mod_socache_shm.c in the new betas, none of which
use the linux/unix shm conventions.  These are all based on the
portability layer in APR, so that the shared objects work on
additional platforms.