Index: native/mod_slotmem/sharedmem_util.c =================================================================== --- native/mod_slotmem/sharedmem_util.c (revision 222) +++ native/mod_slotmem/sharedmem_util.c (working copy) @@ -154,9 +154,12 @@ { const char *storename; apr_file_t *fp; - apr_size_t nbytes = item_size * item_num + sizeof(int) * (item_num + 1); + apr_size_t nbytes; apr_status_t rv; + apr_size_t vsize = sizeof(void *); + item_size = item_size % vsize ? (((item_size / vsize) +1 ) * vsize) : item_size; + nbytes = item_size * item_num + sizeof(int) * (item_num + 1); storename = store_filename(pool, name); rv = apr_file_open(&fp, storename, APR_READ | APR_WRITE, APR_OS_DEFAULT, pool); if (rv == APR_SUCCESS) { @@ -230,9 +233,16 @@ apr_status_t rv; const char *fname; const char *filename; - apr_size_t nbytes = item_size * item_num + sizeof(int) * (item_num + 1) + sizeof(struct sharedslotdesc); + apr_size_t nbytes; int i, *ident; + apr_size_t vsize = sizeof(void *); + apr_size_t dsize = sizeof(desc); + apr_size_t tsize = sizeof(int) * (item_num + 1); + item_size = item_size % vsize ? (((item_size / vsize) +1 ) * vsize) : item_size; + dsize = dsize % vsize ? (((dsize / vsize) +1 ) * vsize) : dsize; + tsize = tsize % vsize ? (((tsize / vsize) +1 ) * vsize) : tsize; + nbytes = item_size * item_num + tsize + dsize; if (globalpool == NULL) return APR_ENOSHMAVAIL; if (name) { @@ -279,7 +289,7 @@ res->shm = NULL; return APR_EINVAL; } - ptr = ptr + sizeof(desc); + ptr = ptr + dsize; } else { if (name) { @@ -303,7 +313,7 @@ desc.item_size = item_size; desc.item_num = item_num; memcpy(ptr, &desc, sizeof(desc)); - ptr = ptr + sizeof(desc); + ptr = ptr + dsize; /* write the idents table */ ident = (int *) ptr; for (i=0; iname = apr_pstrdup(globalpool, fname); res->ident = (int *) ptr; - res->base = ptr + sizeof(int) * (item_num + 1); + res->base = ptr + tsize; res->size = item_size; res->num = item_num; res->globalpool = globalpool; @@ -350,7 +360,14 @@ const char *fname; const char *filename; apr_status_t rv; + apr_size_t vsize = sizeof(void *); + apr_size_t dsize = sizeof(desc); + apr_size_t tsize = sizeof(int) * (desc.item_num + 1); + dsize = dsize % vsize ? (((dsize / vsize) +1 ) * vsize) : dsize; + tsize = tsize % vsize ? (((tsize / vsize) +1 ) * vsize) : tsize; + *item_size = *item_size % vsize ? (((*item_size / vsize) +1 ) * vsize) : *item_size; + if (globalpool == NULL) { return APR_ENOSHMAVAIL; } @@ -393,12 +410,12 @@ /* Read the description of the slotmem */ ptr = apr_shm_baseaddr_get(res->shm); memcpy(&desc, ptr, sizeof(desc)); - ptr = ptr + sizeof(desc); + ptr = ptr + dsize; /* For the chained slotmem stuff */ res->name = apr_pstrdup(globalpool, fname); res->ident = (int *)ptr; - res->base = ptr + sizeof(int) * (desc.item_num + 1); + res->base = ptr + tsize; res->size = desc.item_size; res->num = desc.item_num; res->globalpool = globalpool; Index: native/mod_manager/node.c =================================================================== --- native/mod_manager/node.c (revision 222) +++ native/mod_manager/node.c (working copy) @@ -85,6 +85,7 @@ nodeinfo_t *in = (nodeinfo_t *)*data; nodeinfo_t *ou = (nodeinfo_t *)mem; if (strcmp(in->mess.JVMRoute, ou->mess.JVMRoute) == 0) { + apr_size_t vsize = sizeof(void *); /* * The node information is made of several pieces: * Information from the cluster (nodemess_t). @@ -96,6 +97,7 @@ ou->mess.id = id; ou->updatetime = apr_time_now(); ou->offset = sizeof(nodemess_t) + sizeof(apr_time_t) + sizeof(int); + ou->offset = ou->offset % vsize ? (((ou->offset / vsize) +1 ) * vsize) : ou->offset; *data = ou; return APR_SUCCESS; } @@ -106,6 +108,7 @@ apr_status_t rv; nodeinfo_t *ou; int ident; + apr_size_t vsize = sizeof(void *); node->mess.id = 0; rv = s->storage->ap_slotmem_do(s->slotmem, insert_update, &node, s->p); @@ -126,9 +129,10 @@ /* set of offset to the proxy_worker_stat */ ou->offset = sizeof(nodemess_t) + sizeof(apr_time_t) + sizeof(int); + ou->offset = ou->offset % vsize ? (((ou->offset / vsize) +1 ) * vsize) : ou->offset; /* blank the proxy status information */ - memset(ou->stat, '\0', SIZEOFSCORE); + memset(&(ou->stat), '\0', SIZEOFSCORE); return APR_SUCCESS; } Index: native/mod_manager/mod_manager.c =================================================================== --- native/mod_manager/mod_manager.c (revision 222) +++ native/mod_manager/mod_manager.c (working copy) @@ -946,6 +946,7 @@ nodeinfo_t *ou; proxy_worker_stat *proxystat; char *flushpackets; + char *pptr; if (get_node(nodestatsmem, &ou, id[i]) != APR_SUCCESS) continue; ap_rprintf(r, "Node: [%d],Name: %.*s,Balancer: %.*s,Domain: %.*s,Host: %.*s,Port: %.*s,Type: %.*s", @@ -967,7 +968,9 @@ ap_rprintf(r, ",Flushpackets: %s,Flushwait: %d,Ping: %d,Smax: %d,Ttl: %d", flushpackets, ou->mess.flushwait, (int) ou->mess.ping, ou->mess.smax, (int) ou->mess.ttl); - proxystat = (proxy_worker_stat *) ou->stat; + pptr = (char *) ou; + pptr = pptr + ou->offset; + proxystat = (proxy_worker_stat *) pptr; ap_rprintf(r, ",Elected: %d,Read: %d,Transfered: %d,Connected: %d,Load: %d\n", (int) proxystat->elected, (int) proxystat->read, (int) proxystat->transferred, (int) proxystat->busy, (int) proxystat->lbfactor); @@ -1830,6 +1833,7 @@ proxy_worker_stat *proxystat; char *flushpackets; nodeinfo_t *ou = &nodes[i]; + char *pptr = (char *) ou; if (strcmp(domain, ou->mess.Domain) != 0) { ap_rprintf(r, "

Domain %.*s: ", (int) sizeof(ou->mess.Domain), ou->mess.Domain);