mturk       2005/09/15 22:52:26

  Modified:    jk/native/common jk_lb_worker.c jk_shm.c jk_shm.h
                        jk_status.c
  Log:
  Fix bug #36525 by properly aligning shared memory header struct.
  This patch was provided and investigated by Rainer Jung. Thaks!
  
  Also bring back 64 bit sizes, because the problem was not with them,
  but rather they've cause different struct alignment.
  
  Revision  Changes    Path
  1.94      +5 -5      jakarta-tomcat-connectors/jk/native/common/jk_lb_worker.c
  
  Index: jk_lb_worker.c
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_lb_worker.c,v
  retrieving revision 1.93
  retrieving revision 1.94
  diff -u -r1.93 -r1.94
  --- jk_lb_worker.c    14 Sep 2005 06:50:14 -0000      1.93
  +++ jk_lb_worker.c    16 Sep 2005 05:52:26 -0000      1.94
  @@ -225,8 +225,8 @@
   {
       unsigned int i;
       int total_factor = 0;
  -    size_t mytraffic = 0;
  -    size_t curmin = 0;
  +    jk_u64_t mytraffic = 0;
  +    jk_u64_t curmin = 0;
   
       worker_record_t *candidate = NULL;
       if (p->lblock == JK_LB_LOCK_PESSIMISTIC)
  @@ -328,8 +328,8 @@
                                                jk_logger_t *l)
   {
       unsigned int i;
  -    size_t mytraffic = 0;
  -    size_t curmin = 0;
  +    jk_u64_t mytraffic = 0;
  +    jk_u64_t curmin = 0;
       worker_record_t *candidate = NULL;
       double diff;
       time_t now = time(NULL);
  
  
  
  1.20      +33 -22    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.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- jk_shm.c  12 Sep 2005 12:53:05 -0000      1.19
  +++ jk_shm.c  16 Sep 2005 05:52:26 -0000      1.20
  @@ -26,8 +26,8 @@
   #include "jk_mt.h"
   #include "jk_shm.h"
   
  -/** jk shm header record structure */
  -struct jk_shm_header
  +/** jk shm header core data structure */
  +struct jk_shm_header_data
   {
       /* Shared memory magic JK_SHM_MAGIC */
       char   magic[8];
  @@ -36,6 +36,17 @@
       unsigned int childs;
       unsigned int workers;
       time_t modified;
  +};
  +
  +typedef struct jk_shm_header_data jk_shm_header_data_t;
  +
  +/** jk shm header record structure */
  +struct jk_shm_header
  +{
  +    union {
  +        jk_shm_header_data_t data;
  +        char alignbuf[JK_SHM_ALIGN(sizeof(jk_shm_header_data_t))];
  +    };
       char   buf[1];
   };
   
  @@ -116,13 +127,13 @@
       jk_shmem.filename = "memory";
       jk_shmem.fd       = 0;
       jk_shmem.attached = 0;
  -    memcpy(jk_shmem.hdr->magic, shm_signature, 8);
  -    jk_shmem.hdr->size = sz;
  +    memcpy(jk_shmem.hdr->data.magic, shm_signature, 8);
  +    jk_shmem.hdr->data.size = sz;
       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 addr=%#lx",
  -               jk_shmem.size, jk_shmem.hdr->size, jk_shmem.hdr);
  +               jk_shmem.size, jk_shmem.hdr->data.size, jk_shmem.hdr);
       JK_TRACE_EXIT(l);
       return 0;
   }
  @@ -132,12 +143,12 @@
       JK_TRACE_ENTER(l);
       if (!jk_shm_open(fname, sz, l)) {
           jk_shmem.attached = 1;
  -        jk_shmem.hdr->childs++;
  +        jk_shmem.hdr->data.childs++;
           if (JK_IS_DEBUG_LEVEL(l))
               jk_log(l, JK_LOG_DEBUG,
                      "Attached shared memory [%d] size=%u free=%u addr=%#lx",
  -                   jk_shmem.hdr->childs, jk_shmem.hdr->size,
  -                   jk_shmem.hdr->size - jk_shmem.hdr->pos,
  +                   jk_shmem.hdr->data.childs, jk_shmem.hdr->data.size,
  +                   jk_shmem.hdr->data.size - jk_shmem.hdr->data.pos,
                      jk_shmem.hdr);
           JK_TRACE_EXIT(l);
           return 0;
  @@ -306,20 +317,20 @@
       /* Clear shared memory */
       if (!attached) {
           memset(jk_shmem.hdr, 0, jk_shmem.size);
  -        memcpy(jk_shmem.hdr->magic, shm_signature, 8);
  -        jk_shmem.hdr->size = sz;
  +        memcpy(jk_shmem.hdr->data.magic, shm_signature, 8);
  +        jk_shmem.hdr->data.size = sz;
           if (JK_IS_DEBUG_LEVEL(l))
               jk_log(l, JK_LOG_DEBUG,
                      "Initialized shared memory size=%u free=%u addr=%#lx",
  -                   jk_shmem.size, jk_shmem.hdr->size, jk_shmem.hdr);
  +                   jk_shmem.size, jk_shmem.hdr->data.size, jk_shmem.hdr);
       }
       else {
  -        jk_shmem.hdr->childs++;
  +        jk_shmem.hdr->data.childs++;
           if (JK_IS_DEBUG_LEVEL(l))
               jk_log(l, JK_LOG_INFO,
                      "Attached shared memory [%d] size=%u free=%u addr=%#lx",
  -                   jk_shmem.hdr->childs, jk_shmem.hdr->size,
  -                   jk_shmem.hdr->size - jk_shmem.hdr->pos,
  +                   jk_shmem.hdr->data.childs, jk_shmem.hdr->data.size,
  +                   jk_shmem.hdr->data.size - jk_shmem.hdr->data.pos,
                      jk_shmem.hdr);
           /* TODO: check header magic */
       }
  @@ -376,9 +387,9 @@
   
       if (jk_shmem.hdr) {
           size = JK_ALIGN_DEFAULT(size);
  -        if ((jk_shmem.hdr->size - jk_shmem.hdr->pos) >= size) {
  -            rc = &(jk_shmem.hdr->buf[jk_shmem.hdr->pos]);
  -            jk_shmem.hdr->pos += size;
  +        if ((jk_shmem.hdr->data.size - jk_shmem.hdr->data.pos) >= size) {
  +            rc = &(jk_shmem.hdr->buf[jk_shmem.hdr->data.pos]);
  +            jk_shmem.hdr->data.pos += size;
           }
       }
       else if (p)
  @@ -396,7 +407,7 @@
   time_t jk_shm_get_workers_time()
   {
       if (jk_shmem.hdr)
  -        return jk_shmem.hdr->modified;
  +        return jk_shmem.hdr->data.modified;
       else
           return jk_workers_modified_time;
   }
  @@ -404,7 +415,7 @@
   void jk_shm_set_workers_time(time_t t)
   {
       if (jk_shmem.hdr)
  -        jk_shmem.hdr->modified = t;
  +        jk_shmem.hdr->data.modified = t;
       else
           jk_workers_modified_time = t;
       jk_workers_access_time = t;
  @@ -450,8 +461,8 @@
       if (w) {
           memset(w, 0, sizeof(jk_shm_worker_t));
           if (jk_shmem.hdr) {
  -            jk_shmem.hdr->workers++;
  -            w->id = jk_shmem.hdr->workers;
  +            jk_shmem.hdr->data.workers++;
  +            w->id = jk_shmem.hdr->data.workers;
           }
           else
               w->id = -1;
  
  
  
  1.25      +3 -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.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- jk_shm.h  12 Sep 2005 13:14:37 -0000      1.24
  +++ jk_shm.h  16 Sep 2005 05:52:26 -0000      1.25
  @@ -86,9 +86,9 @@
       /* Service transfer rate time */
       volatile time_t  service_time;
       /* Number of bytes read from remote */
  -    volatile size_t readed;
  +    volatile jk_u64_t readed;
       /* Number of bytes transferred to remote */
  -    volatile size_t transferred;
  +    volatile jk_u64_t transferred;
       /* Number of times the worker was elected */
       volatile size_t  elected;
       /* Number of non 200 responses */
  
  
  
  1.46      +2 -2      jakarta-tomcat-connectors/jk/native/common/jk_status.c
  
  Index: jk_status.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_status.c,v
  retrieving revision 1.45
  retrieving revision 1.46
  diff -u -r1.45 -r1.46
  --- jk_status.c       12 Sep 2005 12:53:05 -0000      1.45
  +++ jk_status.c       16 Sep 2005 05:52:26 -0000      1.46
  @@ -166,7 +166,7 @@
   }
   
   /* Actually APR's apr_strfsize */
  -static char *status_strfsize(size_t size, char *buf)
  +static char *status_strfsize(jk_u64_t size, char *buf)
   {
       const char ord[] = "KMGTPE";
       const char *o = ord;
  
  
  

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

Reply via email to