mturk       2005/02/07 11:06:35

  Modified:    jk/native/common jk_shm.c jk_shm.h
  Log:
  Change shared memory API. There will be always one and only shared
  memory, so make it's instance static. Also use two types of shared memory
  to lower the memory if JkShmFile is not defined in config. The overhed in
  that case is 2K for maximum of 512 workers.
  
  Revision  Changes    Path
  1.7       +132 -119  jakarta-tomcat-connectors/jk/native/common/jk_shm.c
  
  Index: jk_shm.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_shm.c,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- jk_shm.c  6 Feb 2005 11:30:02 -0000       1.6
  +++ jk_shm.c  7 Feb 2005 19:06:34 -0000       1.7
  @@ -23,66 +23,72 @@
   #include "jk_pool.h"
   #include "jk_shm.h"
   
  -const char shm_signature[] = { JK_SHM_MAGIC };
  +/** jk shm header record structure */
  +struct jk_shm_h_rec
  +{
  +    /* Shared memory magic JK_SHM_MAGIC */
  +    char            magic[8];
  +    int             workers;
  +    int             allocated;
  +    jk_shm_w_rec_t  *pr[1];
  +    jk_shm_w_rec_t  rr[1];
  +};
  +typedef struct jk_shm_h_rec jk_shm_h_rec_t;
  +
  +/** jk shm structure */
  +struct jk_shm
  +{
  +    size_t     size;
  +    const char *filename;
  +    int        fd;
  +    int        attached;
  +    jk_shm_h_rec_t  *hdr;
  +};
   
  -#if defined (WIN32) || defined(NETWARE)
  +typedef struct jk_shm jk_shm_t;
   
  -/* Simulate file */
  -static jk_shm_t *jk_global_shm = NULL;
  +static const char shm_signature[] = { JK_SHM_MAGIC };
  +static jk_shm_t jk_shmem = { 0, NULL, -1, 0, NULL};;
  +
  +#if defined (WIN32) || defined(NETWARE)
   
   /* Use plain memory */
  -int jk_shm_open(const char *fname, int workers, int dynamic, jk_shm_t *shm)
  +int jk_shm_open(const char *fname)
   {
  -    jk_shm_h_rec_t *hdr;
  -
  -    if (jk_global_shm) {
  -        shm->attached = jk_global_shm->attached;
  -        shm->size = jk_global_shm->size;
  -        shm->base = jk_global_shm->base;
  -        shm->filename = jk_global_shm->filename;
  +    if (jk_shmem.hdr) {
           return 0;
       }
  -    if (workers < 1 || workers > JK_SHM_MAX_WORKERS)
  -        workers = JK_SHM_MAX_WORKERS;
  -    if (dynamic < 1 || dynamic > JK_SHM_MAX_WORKERS)
  -        dynamic = JK_SHM_MAX_WORKERS;
   
  -    shm->size = sizeof(jk_shm_h_rec_t) + (workers + dynamic) * 
sizeof(jk_shm_w_rec_t);
  +    jk_shmem.size =  JK_SHM_ALIGN(sizeof(jk_shm_h_rec_t) + 
JK_SHM_MAX_WORKERS * sizeof(jk_shm_w_rec_t));
   
  -    shm->base = calloc(1, shm->size);
  -    if (!shm->base)
  +    jk_shmem.hdr = (jk_shm_h_rec_t *)calloc(1, jk_shmem.size);
  +    if (!jk_shmem.hdr)
           return -1;
  -    shm->filename = "memory";
  -    shm->fd = -1;
  -    shm->attached = 0;
  -
  -    hdr = (jk_shm_h_rec_t *)shm->base;
  +    jk_shmem.filename = "memory";
  +    jk_shmem.fd       = 0;
  +    jk_shmem.attached = 0;
   
  -    memcpy(hdr->magic, shm_signature, 8);
  -    hdr->workers = workers;
  -    hdr->dynamic = dynamic;
  -
  -    jk_global_shm = shm;
  +    memcpy(jk_shmem.hdr->magic, shm_signature, 8);
  +    jk_shmem.hdr->workers = JK_SHM_MAX_WORKERS;
       return 0;
   }
   
  -int jk_shm_attach(const char *fname, int workers, int dynamic, jk_shm_t *shm)
  +int jk_shm_attach(const char *fname)
   {
  -    if (!jk_shm_open(fname, workers, dynamic, shm)) {
  -        shm->attached = 1;
  +    if (!jk_shm_open(fname)) {
  +        jk_shmem.attached = 1;
           return 0;
       }
       else
           return -1;
   }
   
  -void jk_shm_close(jk_shm_t *shm)
  +void jk_shm_close()
   {
  -    if (shm) {
  -        if (shm->base)
  -            free(shm->base);
  -        shm->base = NULL;
  +    if (jk_shmem.hdr) {
  +        free(jk_shmem.hdr);
       }
  +    jk_shmem.hdr = NULL;
   }
   
   #else
  @@ -102,147 +108,154 @@
   #define MAP_FILE    (0)
   #endif
   
  -static int do_shm_open(const char *fname, int workers, int dynamic,
  -                       jk_shm_t *shm, int attached)
  +static int do_shm_open(const char *fname, int attached)
   {
  +    int rc;
       int fd;
       int flags = O_RDWR;
  +    void *base;
   
  -    shm->size = 0;
  -    shm->base = NULL;
  -
  -    if (workers < 1 || workers > JK_SHM_MAX_WORKERS)
  -        workers = JK_SHM_MAX_WORKERS;
  -    if (dynamic < 1 || dynamic > JK_SHM_MAX_WORKERS)
  -        dynamic = JK_SHM_MAX_WORKERS;
  -
  -    shm->filename = fname;
  -    shm->attached = attached;
  -    shm->size = sizeof(jk_shm_h_rec_t) + (workers + dynamic) * 
sizeof(jk_shm_w_rec_t);
  +    if (jk_shmem.hdr)
  +        jk_shm_close();
  +    jk_shmem.filename = fname;
  +    jk_shmem.attached = attached;
   
       /* Use plain memory in case there is no file name */
       if (!fname) {
  -        jk_shm_h_rec_t *hdr;
  -        shm->base = calloc(1, shm->size);
  -        if (!shm->base)
  +        jk_shmem.size = JK_SHM_ALIGN(sizeof(jk_shm_h_rec_t) + 
JK_SHM_MAX_WORKERS * sizeof(jk_shm_w_rec_t *));
  +        jk_shmem.hdr  = calloc(1, jk_shmem.size);
  +        if (!jk_shmem.hdr)
               return -1;
  -        hdr = (jk_shm_h_rec_t *)shm->base;
  -
  -        memcpy(hdr->magic, shm_signature, 8);
  -        hdr->workers = workers;
  -        hdr->dynamic = dynamic;
  -        shm->filename = "memory";
  +        memcpy(jk_shmem.hdr->magic, shm_signature, 8);
  +        jk_shmem.hdr->workers   = JK_SHM_MAX_WORKERS;
  +        jk_shmem.hdr->allocated = 0;
  +        jk_shmem.filename       = "memory";
           return 0;
       }
  +    
  +    jk_shmem.size = JK_SHM_ALIGN(sizeof(jk_shm_h_rec_t) + JK_SHM_MAX_WORKERS 
* sizeof(jk_shm_w_rec_t));
  +    
       if (!attached)
           flags |= (O_CREAT|O_TRUNC);
       fd = open(fname, flags, 0666);
       if (fd == -1) {
  -        shm->size = 0;
  -        return -1;
  +        jk_shmem.size = 0;
  +        return errno;
       }
   
       if (!attached) {
           size_t size = lseek(fd, 0, SEEK_END);
  -        if (size < shm->size) {
  -            size = shm->size;
  -            if (ftruncate(fd, shm->size)) {
  +        if (size < jk_shmem.size) {
  +            size = jk_shmem.size;
  +            if (ftruncate(fd, jk_shmem.size)) {
  +                rc = errno;
                   close(fd);
  -                shm->size = 0;
  -                return -1;
  +                jk_shmem.size = 0;
  +                return rc;
               }
           }
       }
       if (lseek(fd, 0, SEEK_SET) != 0) {
  +        rc = errno;
           close(fd);
  -        shm->size = 0;
  -        return -1;
  +        jk_shmem.size = 0;
  +        return rc;
       }
   
  -    shm->base = mmap(NULL, shm->size,
  -                     PROT_READ | PROT_WRITE,
  -                     MAP_FILE | MAP_SHARED,
  -                     fd, 0);
  -    if (shm->base == (void *)MAP_FAILED) {
  -        shm->base = NULL;
  -    }
  -    if (!shm->base) {
  +    base = mmap(NULL, jk_shmem.size,
  +                PROT_READ | PROT_WRITE,
  +                MAP_FILE | MAP_SHARED,
  +                fd, 0);
  +    if (base == (void *)MAP_FAILED || base == NULL) {
  +        rc = errno;
           close(fd);
  -        shm->size = 0;
  -        return -1;
  +        jk_shmem.size = 0;
  +        return rc;
       }
  -    shm->fd = fd;
  +    jk_shmem.hdr = base;
  +    jk_shmem.fd  = fd;
   
       /* Clear shared memory */
       if (!attached) {
  -        jk_shm_h_rec_t *hdr;
  -
  -        memset(shm->base, 0, shm->size);
  -        hdr = (jk_shm_h_rec_t *)shm->base;
  -
  -        memcpy(hdr->magic, shm_signature, 8);
  -        hdr->workers = workers;
  -        hdr->dynamic = dynamic;
  +        memset(jk_shmem.hdr, 0, jk_shmem.size);
  +        memcpy(jk_shmem.hdr->magic, shm_signature, 8);
  +        jk_shmem.hdr->workers = JK_SHM_MAX_WORKERS;
       }
       else {
           /* TODO: check header magic */
       }
  -
       return 0;
   }
   
  -int jk_shm_open(const char *fname, int workers, int dynamic, jk_shm_t *shm)
  +int jk_shm_open(const char *fname)
   {
  -    return do_shm_open(fname, workers, dynamic, shm, 0);
  +    return do_shm_open(fname, 0);
   }
   
  -int jk_shm_attach(const char *fname, int workers, int dynamic, jk_shm_t *shm)
  +int jk_shm_attach(const char *fname)
   {
  -    return do_shm_open(fname, workers, dynamic, shm, 1);
  +    return do_shm_open(fname, 1);
   }
   
  -void jk_shm_close(jk_shm_t *shm)
  +void jk_shm_close()
   {
  -    if (shm) {
  -        if (shm->base) {
  -            if (shm->fd >= 0) {
  -                munmap(shm->base, shm->size);
  -                close(shm->fd);
  +    if (jk_shmem.hdr) {
  +        if (jk_shmem.fd >= 0) {
  +            munmap((void *)jk_shmem.hdr, jk_shmem.size);
  +            close(jk_shmem.fd);
  +        }
  +        else {
  +            int i;
  +            for (i = 0; i < jk_shmem.hdr->allocated; i++) {
  +                if (jk_shmem.hdr->pr[i])
  +                    free(jk_shmem.hdr->pr[i]);
               }
  -            else
  -                free(shm->base);
  +            free(jk_shmem.hdr);
           }
  -        shm->base = NULL;
  -        shm->fd = -1;
       }
  +    jk_shmem.hdr = NULL;
  +    jk_shmem.fd  = -1;
   }
   
   
   #endif
   
  -jk_shm_h_rec_t *jk_shm_header(jk_shm_t *shm)
  +jk_shm_w_rec_t *jk_shm_worker(int id)
   {
  -    if (shm && shm->base) {
  -        return (jk_shm_h_rec_t *)shm->base;
  +    jk_shm_w_rec_t *w = NULL;
  +    if (jk_shmem.hdr && id >= 0) {
  +        if (id < jk_shmem.hdr->allocated) {
  +            if (jk_shmem.fd >= 0)
  +                w = &(jk_shmem.hdr->rr[id]);
  +            else
  +                w = jk_shmem.hdr->pr[id];
  +            if (id != w->id)
  +                w = NULL;            
  +        }
       }
  -    else
  -        return NULL;
  +    return w;
   }
   
  -jk_shm_w_rec_t *jk_shm_worker(jk_shm_t *shm, int id)
  +jk_shm_w_rec_t *jk_shm_worker_alloc()
   {
       jk_shm_w_rec_t *w = NULL;
  -    if (shm && shm->base && id >= 0) {
  -        jk_shm_h_rec_t *hdr = (jk_shm_h_rec_t *)shm->base;
  -        if (id < (hdr->workers + hdr->dynamic)) {
  -            unsigned char *base = (unsigned char *)shm->base;
  -            base += (sizeof(jk_shm_h_rec_t) + id * sizeof(jk_shm_w_rec_t));
  -            w = (jk_shm_w_rec_t *)base;
  -            /* Check worker id */
  -            if (id < hdr->workers && id != w->id)
  -                w = NULL;
  +    if (jk_shmem.hdr) {
  +        if (jk_shmem.hdr->allocated < jk_shmem.hdr->workers) {
  +            jk_shmem.hdr->allocated++;
  +            if (jk_shmem.fd >= 0) {
  +                w = &(jk_shmem.hdr->rr[jk_shmem.hdr->allocated]);
  +            }
  +            else {
  +                jk_shmem.hdr->pr[jk_shmem.hdr->allocated] = calloc(1, 
sizeof(jk_shm_w_rec_t));
  +                w = jk_shmem.hdr->pr[jk_shmem.hdr->allocated];
  +            }
  +            w->id = jk_shmem.hdr->allocated;
           }
  -
       }
       return w;
   }
  +
  +const char *jk_shm_name()
  +{
  +    return jk_shmem.filename;
  +}
  
  
  
  1.3       +14 -52    jakarta-tomcat-connectors/jk/native/common/jk_shm.h
  
  Index: jk_shm.h
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_shm.h,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- jk_shm.h  6 Feb 2005 10:35:55 -0000       1.2
  +++ jk_shm.h  7 Feb 2005 19:06:35 -0000       1.3
  @@ -23,6 +23,7 @@
   #define _JK_SHM_H
   
   #include "jk_global.h"
  +#include "jk_pool.h"
   
   #ifdef __cplusplus
   extern "C"
  @@ -42,41 +43,10 @@
   #define JK_SHM_DYNAMIC  16
   #define JK_SHM_MAGIC    '!', 'J', 'K', 'S', 'H', 'M', JK_SHM_MAJOR, 
JK_SHM_MINOR
   
  -/* Really huge numbers, but 1024 workers should be enough */
  -#define JK_SHM_MAX_WORKERS  768
  -#define JK_SHM_MAX_DYNAMIC  256
  +/* Really huge numbers, but 512 workers should be enough */
  +#define JK_SHM_MAX_WORKERS  512
   
  -/** jk shm structure */
  -struct jk_shm
  -{
  -    size_t     size;
  -    const char *filename;
  -    int        fd;
  -    void       *base;
  -    int        attached;
  -};
  -
  -typedef struct jk_shm jk_shm_t;
  -
  -/** jk shm header record structure */
  -struct jk_shm_h_rec
  -{
  -    /* Shared memory magic JK_SHM_MAGIC */
  -    char    magic[8];
  -    int     workers;
  -    int     dynamic;
  -
  -    /* Align to 128 bytes */
  -
  -    /* XXX:  the following should be #if sizeof(int) == 4 */
  -#if 1
  -    char    reserved[112];
  -#else
  -    char    reserved[104];
  -#endif
  -};
  -
  -typedef struct jk_shm_h_rec jk_shm_h_rec_t;
  +#define JK_SHM_ALIGN(x)  JK_ALIGN(x, 1024)
   
   /** jk shm worker record structure */
   struct jk_shm_w_rec
  @@ -117,40 +87,32 @@
       int     elected;
       /* Number of non 200 responses */
       int     errors;
  -    /* Align to 512 bytes */
  -
  -    /* XXX:  the following should be #if sizeof(int) == 4 */
  -#if 1
  -    char    reserved[244];
  -#else
  -    char    reserved[168];
  -#endif
  -
   };
  -
   typedef struct jk_shm_w_rec jk_shm_w_rec_t;
   
  +const char *jk_shm_name();
  +
   /* Open the shared memory creating file if needed
    */
  -int jk_shm_open(const char *fname, int workers, int dynamic, jk_shm_t *shm);
  +int jk_shm_open(const char *fname);
   
   /* Close the shared memory
    */
  -void jk_shm_close(jk_shm_t *shm);
  +void jk_shm_close();
   
   /* Attach the shared memory in child process.
    * File has to be opened in parent.
    */
  -int jk_shm_attach(const char *fname, int workers, int dynamic, jk_shm_t 
*shm);
  +int jk_shm_attach(const char *fname);
   
   
  -/* Return shm header record
  +/* Return shm worker record
    */
  -jk_shm_h_rec_t *jk_shm_header(jk_shm_t *shm);
  +jk_shm_w_rec_t *jk_shm_worker(int id);
   
  -/* Return shm worker record
  +/* allocate shm worker record
    */
  -jk_shm_w_rec_t *jk_shm_worker(jk_shm_t *shm, int id);
  +jk_shm_w_rec_t *jk_shm_alloc();
   
   
   #ifdef __cplusplus
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to