tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mt...@apache.org
Subject cvs commit: jakarta-tomcat-connectors/jk/native/common jk_shm.c jk_shm.h
Date Sun, 13 Feb 2005 12:08:05 GMT
mturk       2005/02/13 04:08:05

  Modified:    jk/native/common jk_shm.c jk_shm.h
  Log:
  Add logging and global lock file to shared memory.
  
  Revision  Changes    Path
  1.10      +157 -16   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.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- jk_shm.c	12 Feb 2005 17:01:00 -0000	1.9
  +++ jk_shm.c	13 Feb 2005 12:08:05 -0000	1.10
  @@ -31,7 +31,10 @@
       char   magic[8];
       size_t size;
       size_t pos;
  -    int    childs;
  +    unsigned int childs;
  +    unsigned int workers;
  +
  +    unsigned int urimaps;
       time_t modified;
       char   buf[1];
   };
  @@ -44,50 +47,71 @@
       size_t     size;
       const char *filename;
       int        fd;
  +    int        fd_lock;
       int        attached;
       jk_shm_header_t  *hdr;
  -    CRITICAL_SECTION cs;
  +    JK_CRIT_SEC       cs;
   };
   
   typedef struct jk_shm jk_shm_t;
   
   static const char shm_signature[] = { JK_SHM_MAGIC };
  -static jk_shm_t jk_shmem = { 0, NULL, -1, 0, NULL};
  +static jk_shm_t jk_shmem = { 0, NULL, -1, -1, 0, NULL, 0};
   static time_t jk_workers_modified_time = 0;
   
   #if defined (WIN32) || defined(NETWARE)
   
   /* Use plain memory */
  -int jk_shm_open(const char *fname)
  +int jk_shm_open(const char *fname, jk_logger_t *l)
   {
       int rc;
  +    JK_TRACE_ENTER(l);
       if (jk_shmem.hdr) {
  +        if (JK_IS_DEBUG_LEVEL(l))
  +            jk_log(l, JK_LOG_DEBUG, "Shared memory is already opened");
  +        JK_TRACE_EXIT(l);
           return 0;
       }
   
       jk_shmem.size =  JK_SHM_ALIGN(sizeof(jk_shm_header_t) + JK_SHM_SIZE);
   
       jk_shmem.hdr = (jk_shm_header_t *)calloc(1, jk_shmem.size);
  -    if (!jk_shmem.hdr)
  +    if (!jk_shmem.hdr) {
  +        JK_TRACE_EXIT(l);
           return -1;
  +    }
       jk_shmem.filename = "memory";
       jk_shmem.fd       = 0;
       jk_shmem.attached = 0;
       memcpy(jk_shmem.hdr->magic, shm_signature, 8);
       jk_shmem.hdr->size = JK_SHM_SIZE;
       JK_INIT_CS(&(jk_shmem.cs), rc);
  +    if (JK_IS_DEBUG_LEVEL(l))
  +        jk_log(l, JK_LOG_DEBUG,
  +               "Initialized shared memory size=%u free=%u",
  +               jk_shmem.size, jk_shmem.hdr->size);
  +    JK_TRACE_EXIT(l);
       return 0;
   }
   
  -int jk_shm_attach(const char *fname)
  +int jk_shm_attach(const char *fname, jk_logger_t *l)
   {
  -    if (!jk_shm_open(fname)) {
  +    JK_TRACE_ENTER(l);
  +    if (!jk_shm_open(fname, l)) {
           jk_shmem.attached = 1;
           jk_shmem.hdr->childs++;
  +        if (JK_IS_DEBUG_LEVEL(l))
  +            jk_log(l, JK_LOG_DEBUG,
  +                   "Attached shared memory [%d] size=%u free=%u",
  +                   jk_shmem.hdr->childs, jk_shmem.hdr->size,
  +                   jk_shmem.hdr->size - jk_shmem.hdr->pos);
  +        JK_TRACE_EXIT(l);
           return 0;
       }
  -    else
  +    else {
  +        JK_TRACE_EXIT(l);
           return -1;
  +    }
   }
   
   void jk_shm_close()
  @@ -117,15 +141,63 @@
   #define MAP_FILE    (0)
   #endif
   
  -static int do_shm_open(const char *fname, int attached)
  +static int do_shm_open_lock(const char *fname, int attached, jk_logger_t *l)
  +{
  +    int rc;
  +    int fd;
  +    int flags = O_RDWR;
  +    char flkname[256];
  +    JK_TRACE_ENTER(l);
  +
  +    jk_shmem.fd_lock = -1;
  +    strcpy(flkname, fname);
  +    strcat(flkname, ".lock");
  +    if (!attached)
  +        flags |= (O_CREAT|O_TRUNC);
  +    fd = open(flkname, flags, 0666);
  +    if (fd == -1) {
  +        JK_TRACE_EXIT(l);
  +        return errno;
  +    }
  +
  +    if (!attached) {
  +        if (ftruncate(fd, 1)) {
  +            rc = errno;
  +            close(fd);
  +            JK_TRACE_EXIT(l);
  +            return rc;
  +         }
  +    }
  +    if (lseek(fd, 0, SEEK_SET) != 0) {
  +        rc = errno;
  +        close(fd);
  +        JK_TRACE_EXIT(l);
  +        return rc;
  +    }
  +    jk_shmem.fd_lock = fd;
  +
  +    if (JK_IS_DEBUG_LEVEL(l))
  +        jk_log(l, JK_LOG_DEBUG,
  +               "Opened shared memory lock %s", flkname);
  +    JK_TRACE_EXIT(l);
  +    return 0;
  +}
  +
  +static int do_shm_open(const char *fname, int attached, jk_logger_t *l)
   {
       int rc;
       int fd;
       int flags = O_RDWR;
       void *base;
   
  -    if (jk_shmem.hdr)
  -        jk_shm_close();
  +    JK_TRACE_ENTER(l);
  +    if (jk_shmem.hdr) {
  +        /* Probably a call from vhost */
  +        if (JK_IS_DEBUG_LEVEL(l))
  +            jk_log(l, JK_LOG_DEBUG,
  +                    "Shared memory is already open");
  +        return 0;
  +    }
       jk_shmem.filename = fname;
       jk_shmem.attached = attached;
   
  @@ -134,6 +206,10 @@
       /* Use plain memory in case there is no file name */
       if (!fname) {
           jk_shmem.filename  = "memory";
  +        if (JK_IS_DEBUG_LEVEL(l))
  +            jk_log(l, JK_LOG_DEBUG,
  +                   "Using process memory as shared memory");
  +        JK_TRACE_EXIT(l);
           return 0;
       }    
       
  @@ -142,6 +218,7 @@
       fd = open(fname, flags, 0666);
       if (fd == -1) {
           jk_shmem.size = 0;
  +        JK_TRACE_EXIT(l);
           return errno;
       }
   
  @@ -153,14 +230,19 @@
                   rc = errno;
                   close(fd);
                   jk_shmem.size = 0;
  +                JK_TRACE_EXIT(l);
                   return rc;
               }
  +            if (JK_IS_DEBUG_LEVEL(l))
  +                jk_log(l, JK_LOG_DEBUG,
  +                       "Truncated shared memory to %u", size);
           }
       }
       if (lseek(fd, 0, SEEK_SET) != 0) {
           rc = errno;
           close(fd);
           jk_shmem.size = 0;
  +        JK_TRACE_EXIT(l);
           return rc;
       }
   
  @@ -172,6 +254,7 @@
           rc = errno;
           close(fd);
           jk_shmem.size = 0;
  +        JK_TRACE_EXIT(l);
           return rc;
       }
       jk_shmem.hdr = base;
  @@ -182,33 +265,55 @@
           memset(jk_shmem.hdr, 0, jk_shmem.size);
           memcpy(jk_shmem.hdr->magic, shm_signature, 8);
           jk_shmem.hdr->size = JK_SHM_SIZE;
  +        if (JK_IS_DEBUG_LEVEL(l))
  +            jk_log(l, JK_LOG_DEBUG,
  +                   "Initialized shared memory size=%u free=%u",
  +                   jk_shmem.size, jk_shmem.hdr->size);
       }
       else {
           jk_shmem.hdr->childs++;
  +        if (JK_IS_DEBUG_LEVEL(l))
  +            jk_log(l, JK_LOG_INFO,
  +                   "Attached shared memory [%d] size=%u free=%u",
  +                   jk_shmem.hdr->childs, jk_shmem.hdr->size,
  +                   jk_shmem.hdr->size - jk_shmem.hdr->pos);
           /* TODO: check header magic */
       }
       JK_INIT_CS(&(jk_shmem.cs), rc);
  +    if ((rc = do_shm_open_lock(fname, attached, l))) {
  +        munmap((void *)jk_shmem.hdr, jk_shmem.size);
  +        close(jk_shmem.fd);
  +        jk_shmem.hdr = NULL;
  +        jk_shmem.fd  = -1;
  +        JK_TRACE_EXIT(l);
  +        return rc;
  +    }
  +    JK_TRACE_EXIT(l);
       return 0;
   }
   
  -int jk_shm_open(const char *fname)
  +int jk_shm_open(const char *fname, jk_logger_t *l)
   {
  -    return do_shm_open(fname, 0);
  +    return do_shm_open(fname, 0, l);
   }
   
  -int jk_shm_attach(const char *fname)
  +int jk_shm_attach(const char *fname, jk_logger_t *l)
   {
  -    return do_shm_open(fname, 1);
  +    return do_shm_open(fname, 1, l);
   }
   
   void jk_shm_close()
   {
       int rc;
       if (jk_shmem.hdr) {
  +        if (jk_shmem.fd_lock >= 0) {
  +            close(jk_shmem.fd_lock);
  +        }
           if (jk_shmem.fd >= 0) {
               munmap((void *)jk_shmem.hdr, jk_shmem.size);
               close(jk_shmem.fd);
           }
  +        jk_shmem.fd_lock = -1;
       }
       if (jk_shmem.size)
           JK_DELETE_CS(&(jk_shmem.cs), rc);
  @@ -263,6 +368,9 @@
   {
       int rc;
       JK_ENTER_CS(&(jk_shmem.cs), rc);
  +    if (rc == JK_TRUE && jk_shmem.fd_lock != -1) {
  +        JK_ENTER_LOCK(jk_shmem.fd_lock, rc);
  +    }
       return rc;
   }
   
  @@ -270,5 +378,38 @@
   {
       int rc;
       JK_LEAVE_CS(&(jk_shmem.cs), rc);
  +    if (rc == JK_TRUE && jk_shmem.fd_lock != -1) {
  +        JK_LEAVE_LOCK(jk_shmem.fd_lock, rc);
  +    }
       return rc;
   }
  +
  +jk_shm_worker_t *jk_shm_alloc_worker(jk_pool_t *p)
  +{
  +    jk_shm_worker_t *w = (jk_shm_worker_t *)jk_shm_alloc(p, sizeof(jk_shm_worker_t));
  +    if (w) {
  +        memset(w, 0, sizeof(jk_shm_worker_t));
  +        if (jk_shmem.hdr) {
  +            jk_shmem.hdr->workers++;
  +            w->id = jk_shmem.hdr->workers;
  +        }
  +        else
  +            w->id = -1;
  +    }
  +    return w;
  +}
  +
  +jk_shm_urimap_t *jk_shm_alloc_urimap(jk_pool_t *p)
  +{
  +    jk_shm_urimap_t *u = (jk_shm_urimap_t *)jk_shm_alloc(p, sizeof(jk_shm_urimap_t));
  +    if (u) {
  +        memset(u, 0, sizeof(jk_shm_urimap_t));
  +        if (jk_shmem.hdr) {
  +            jk_shmem.hdr->urimaps++;
  +            u->id = jk_shmem.hdr->urimaps;
  +        }
  +        else
  +            u->id = -1;
  +    }
  +    return u;
  +}
  
  
  
  1.8       +27 -3     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.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- jk_shm.h	12 Feb 2005 17:01:00 -0000	1.7
  +++ jk_shm.h	13 Feb 2005 12:08:05 -0000	1.8
  @@ -24,6 +24,7 @@
   
   #include "jk_global.h"
   #include "jk_pool.h"
  +#include "jk_util.h"
   
   #ifdef __cplusplus
   extern "C"
  @@ -40,6 +41,7 @@
   #define JK_SHM_MAJOR    '1'
   #define JK_SHM_MINOR    '0'
   #define JK_SHM_STR_SIZ  63
  +#define JK_SHM_URI_SIZ  127
   #define JK_SHM_DYNAMIC  16
   #define JK_SHM_MAGIC    '!', 'J', 'K', 'S', 'H', 'M', JK_SHM_MAJOR, JK_SHM_MINOR
   
  @@ -90,11 +92,23 @@
   };
   typedef struct jk_shm_worker jk_shm_worker_t;
   
  +/** jk shm uri worker map record structure */
  +struct jk_shm_urimap
  +{
  +    int          id;
  +    unsigned int match_type;
  +    size_t       ctxt_len;
  +    char         context[JK_SHM_URI_SIZ+1];
  +    char         worker[JK_SHM_STR_SIZ+1];
  +    char         suffix[JK_SHM_STR_SIZ+1];
  +};
  +typedef struct jk_shm_urimap jk_shm_urimap_t;
  +
   const char *jk_shm_name();
   
   /* Open the shared memory creating file if needed
    */
  -int jk_shm_open(const char *fname);
  +int jk_shm_open(const char *fname, jk_logger_t *l);
   
   /* Close the shared memory
    */
  @@ -103,13 +117,23 @@
   /* Attach the shared memory in child process.
    * File has to be opened in parent.
    */
  -int jk_shm_attach(const char *fname);
  +int jk_shm_attach(const char *fname, jk_logger_t *l);
   
   /* allocate shm memory
    * If there is no shm present the pool will be used instead
    */
   void *jk_shm_alloc(jk_pool_t *p, size_t size);
   
  +/* allocate shm worker record
  + * If there is no shm present the pool will be used instead
  + */
  +jk_shm_worker_t *jk_shm_alloc_worker(jk_pool_t *p);
  +
  +/* allocate shm uri worker map record
  + * If there is no shm present the pool will be used instead
  + */
  +jk_shm_urimap_t *jk_shm_alloc_urimap(jk_pool_t *p);
  +
   /* Return workers.properties last modified time
    */
   time_t jk_shm_get_workers_time();
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: tomcat-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tomcat-dev-help@jakarta.apache.org


Mime
View raw message