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]