You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by mt...@apache.org on 2012/03/28 10:17:59 UTC

svn commit: r1306209 - in /tomcat/jk/trunk/native: apache-1.3/mod_jk.c apache-2.0/mod_jk.c common/jk_shm.c common/jk_shm.h iis/jk_isapi_plugin.c netscape/jk_nsapi_plugin.c

Author: mturk
Date: Wed Mar 28 08:17:59 2012
New Revision: 1306209

URL: http://svn.apache.org/viewvc?rev=1306209&view=rev
Log:
Step one in shared memory simplification. Make each allocated slot of same size. It'll waste few bytes, but will ensure grater consistency

Modified:
    tomcat/jk/trunk/native/apache-1.3/mod_jk.c
    tomcat/jk/trunk/native/apache-2.0/mod_jk.c
    tomcat/jk/trunk/native/common/jk_shm.c
    tomcat/jk/trunk/native/common/jk_shm.h
    tomcat/jk/trunk/native/iis/jk_isapi_plugin.c
    tomcat/jk/trunk/native/netscape/jk_nsapi_plugin.c

Modified: tomcat/jk/trunk/native/apache-1.3/mod_jk.c
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/apache-1.3/mod_jk.c?rev=1306209&r1=1306208&r2=1306209&view=diff
==============================================================================
--- tomcat/jk/trunk/native/apache-1.3/mod_jk.c (original)
+++ tomcat/jk/trunk/native/apache-1.3/mod_jk.c Wed Mar 28 08:17:59 2012
@@ -257,7 +257,7 @@ static jk_logger_t *main_log = NULL;
 static table *jk_log_fds = NULL;
 static jk_worker_env_t worker_env;
 static char *jk_shm_file = NULL;
-static size_t jk_shm_size = 0;
+static int jk_shm_size = 0;
 static int jk_shm_size_set = 0;
 /*
  * Worker stuff
@@ -1349,7 +1349,7 @@ static const char *jk_set_shm_size(cmd_p
         sz = JK_SHM_DEF_SIZE;
     else
         sz = JK_SHM_ALIGN(sz);
-    jk_shm_size = (size_t)sz;
+    jk_shm_size = sz;
     if (jk_shm_size)
         jk_shm_size_set = 1;
     return NULL;

Modified: tomcat/jk/trunk/native/apache-2.0/mod_jk.c
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/apache-2.0/mod_jk.c?rev=1306209&r1=1306208&r2=1306209&view=diff
==============================================================================
--- tomcat/jk/trunk/native/apache-2.0/mod_jk.c (original)
+++ tomcat/jk/trunk/native/apache-2.0/mod_jk.c Wed Mar 28 08:17:59 2012
@@ -269,7 +269,7 @@ static apr_hash_t *jk_log_fps = NULL;
 static jk_worker_env_t worker_env;
 static apr_global_mutex_t *jk_log_lock = NULL;
 static char *jk_shm_file = NULL;
-static size_t jk_shm_size = 0;
+static int jk_shm_size = 0;
 static int jk_shm_size_set = 0;
 static volatile int jk_watchdog_interval = 0;
 static volatile int jk_watchdog_running  = 0;
@@ -1438,7 +1438,7 @@ static const char *jk_set_shm_size(cmd_p
         sz = JK_SHM_DEF_SIZE;
     else
         sz = JK_SHM_ALIGN(sz);
-    jk_shm_size = (size_t)sz;
+    jk_shm_size = sz;
     if (jk_shm_size)
         jk_shm_size_set = 1;
     return NULL;

Modified: tomcat/jk/trunk/native/common/jk_shm.c
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_shm.c?rev=1306209&r1=1306208&r2=1306209&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_shm.c (original)
+++ tomcat/jk/trunk/native/common/jk_shm.c Wed Mar 28 08:17:59 2012
@@ -31,44 +31,48 @@
 #include "jk_ajp14_worker.h"
 #include "jk_shm.h"
 
-/** jk shm header core data structure */
+/** jk shm header core data structure
+ * This is always the first slot in shared memory.
+ */
 struct jk_shm_header_data
 {
     /* Shared memory magic JK_SHM_MAGIC */
-    char   magic[JK_SHM_MAGIC_SIZ];
-    size_t size;
-    size_t pos;
+    char         magic[JK_SHM_MAGIC_SIZ];
+    unsigned int size;
+    unsigned int pos;
     unsigned int childs;
     unsigned int workers;
-    time_t modified;
+    time_t       modified;
 };
 
 typedef struct jk_shm_header_data jk_shm_header_data_t;
 
-/** jk shm header record structure */
+/** 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 alignbuf[JK_SHM_SLOT_SIZE];
     } h;
     char   buf[1];
 };
 
 typedef struct jk_shm_header jk_shm_header_t;
 
-/** jk shm structure */
+/** jk shm in memory structure.
+ */
 struct jk_shm
 {
-    size_t     size;
-    unsigned   ajp_workers;
-    unsigned   lb_sub_workers;
-    unsigned   lb_workers;
-    char       *filename;
-    char       *lockname;
-    int        fd;
-    int        fd_lock;
-    int        attached;
+    unsigned int size;
+    unsigned int ajp_workers;
+    unsigned int lb_sub_workers;
+    unsigned int lb_workers;
+    char        *filename;
+    char        *lockname;
+    int          fd;
+    int          fd_lock;
+    int          attached;
     jk_shm_header_t  *hdr;
     JK_CRIT_SEC       cs;
 };
@@ -86,11 +90,11 @@ static HANDLE jk_shm_hlock = NULL;
 static int jk_shm_inited_cs = 0;
 
 /* Calculate needed shm size */
-size_t jk_shm_calculate_size(jk_map_t *init_data, jk_logger_t *l)
+int jk_shm_calculate_size(jk_map_t *init_data, jk_logger_t *l)
 {
     char **worker_list;
-    unsigned i;
-    unsigned num_of_workers;
+    unsigned int i;
+    unsigned int num_of_workers;
     int num_of_ajp_workers = 0;
     int num_of_lb_sub_workers = 0;
     int num_of_lb_workers = 0;
@@ -104,7 +108,6 @@ size_t jk_shm_calculate_size(jk_map_t *i
         JK_TRACE_EXIT(l);
         return 0;
     }
-
     for (i = 0; i < num_of_workers; i++) {
         const char *type = jk_get_worker_type(init_data, worker_list[i]);
 
@@ -114,7 +117,7 @@ size_t jk_shm_calculate_size(jk_map_t *i
         }
         else if (!strcmp(type, JK_LB_WORKER_NAME)) {
             char **member_list;
-            unsigned num_of_members;
+            unsigned int num_of_members;
             num_of_lb_workers++;
             if (jk_get_lb_worker_list(init_data, worker_list[i],
                                       &member_list, &num_of_members) == JK_FALSE) {
@@ -130,25 +133,24 @@ size_t jk_shm_calculate_size(jk_map_t *i
         }
     }
     if (JK_IS_DEBUG_LEVEL(l))
-        jk_log(l, JK_LOG_DEBUG, "shared memory will contain %d ajp workers of size %d and %d lb workers of size %d with %d members of size %d+%d",
-               num_of_ajp_workers, JK_SHM_AJP_SIZE(1),
-               num_of_lb_workers, JK_SHM_LB_SIZE(1),
-               num_of_lb_sub_workers, JK_SHM_LB_SUB_SIZE(1), JK_SHM_AJP_SIZE(1));
+        jk_log(l, JK_LOG_DEBUG, "shared memory will contain %d ajp workers and %d lb workers with %d members",
+               num_of_ajp_workers,
+               num_of_lb_workers,
+               num_of_lb_sub_workers);
     jk_shmem.ajp_workers = num_of_ajp_workers;
     jk_shmem.lb_sub_workers = num_of_lb_sub_workers;
     jk_shmem.lb_workers = num_of_lb_workers;
     JK_TRACE_EXIT(l);
-    return JK_SHM_AJP_SIZE(jk_shmem.ajp_workers) +
-           JK_SHM_LB_SUB_SIZE(jk_shmem.lb_sub_workers) +
-           JK_SHM_AJP_SIZE(jk_shmem.lb_sub_workers) +
-           JK_SHM_LB_SIZE(jk_shmem.lb_workers);
+    return (JK_SHM_SLOT_SIZE * (jk_shmem.ajp_workers +
+            jk_shmem.lb_sub_workers * 2 +
+            jk_shmem.lb_workers));
 }
 
 
 #if defined (WIN32) || defined(NETWARE)
 
 /* Use plain memory */
-int jk_shm_open(const char *fname, size_t sz, jk_logger_t *l)
+int jk_shm_open(const char *fname, int sz, jk_logger_t *l)
 {
     int rc = -1;
     int attached = 0;
@@ -168,7 +170,12 @@ int jk_shm_open(const char *fname, size_
         JK_LEAVE_CS(&jk_shmem.cs);
         return 0;
     }
-    jk_shmem.size = JK_SHM_ALIGN(sizeof(jk_shm_header_t) + sz);
+    if (sz < 0) {
+        jk_log(l, JK_LOG_ERROR, "Invalid shared memory size (%d)", sz);
+        JK_TRACE_EXIT(l);
+        return EINVAL;
+    }
+    jk_shmem.size = JK_SHM_ALIGN(JK_SHM_SLOT_SIZE + sz);
 #if defined (WIN32)
     jk_shm_map   = NULL;
     jk_shm_hlock = NULL;
@@ -315,7 +322,7 @@ int jk_shm_open(const char *fname, size_
     return 0;
 }
 
-int jk_shm_attach(const char *fname, size_t sz, jk_logger_t *l)
+int jk_shm_attach(const char *fname, int sz, jk_logger_t *l)
 {
     JK_TRACE_ENTER(l);
     if (!jk_shm_open(fname, sz, l)) {
@@ -480,7 +487,7 @@ static int do_shm_open_lock(const char *
 }
 
 static int do_shm_open(const char *fname, int attached,
-                       size_t sz, jk_logger_t *l)
+                       int sz, jk_logger_t *l)
 {
     int rc;
     int fd;
@@ -506,7 +513,12 @@ static int do_shm_open(const char *fname
         JK_TRACE_EXIT(l);
         return 0;
     }
-    jk_shmem.size = JK_SHM_ALIGN(sizeof(jk_shm_header_t) + sz);
+    if (sz < 0) {
+        jk_log(l, JK_LOG_ERROR, "Invalid shared memory size (%d)", sz);
+        JK_TRACE_EXIT(l);
+        return EINVAL;
+    }
+    jk_shmem.size = JK_SHM_ALIGN(JK_SHM_SLOT_SIZE + sz);
 
     if (!fname) {
         /* Use plain memory in case there is no file name */
@@ -659,12 +671,12 @@ static int do_shm_open(const char *fname
     return 0;
 }
 
-int jk_shm_open(const char *fname, size_t sz, jk_logger_t *l)
+int jk_shm_open(const char *fname, int sz, jk_logger_t *l)
 {
     return do_shm_open(fname, 0, sz, l);
 }
 
-int jk_shm_attach(const char *fname, size_t sz, jk_logger_t *l)
+int jk_shm_attach(const char *fname, int sz, jk_logger_t *l)
 {
     return do_shm_open(fname, 1, sz, l);
 }
@@ -742,21 +754,20 @@ void jk_shm_close(jk_logger_t *l)
 
 #endif
 
-void *jk_shm_alloc(jk_pool_t *p, size_t size)
+void *jk_shm_alloc(jk_pool_t *p)
 {
     void *rc = NULL;
 
     if (jk_shmem.hdr) {
-        size = JK_SHM_ALIGN(size);
         jk_shm_lock();
-        if ((jk_shmem.hdr->h.data.size - jk_shmem.hdr->h.data.pos) >= size) {
+        if ((jk_shmem.hdr->h.data.size - jk_shmem.hdr->h.data.pos) >= JK_SHM_SLOT_SIZE) {
             rc = &(jk_shmem.hdr->buf[jk_shmem.hdr->h.data.pos]);
-            jk_shmem.hdr->h.data.pos += size;
+            jk_shmem.hdr->h.data.pos += JK_SHM_SLOT_SIZE;
         }
         jk_shm_unlock();
     }
     else if (p)
-        rc = jk_pool_alloc(p, size);
+        rc = jk_pool_alloc(p, JK_SHM_SLOT_SIZE);
 
     return rc;
 }
@@ -841,9 +852,9 @@ int jk_shm_unlock()
 
 jk_shm_ajp_worker_t *jk_shm_alloc_ajp_worker(jk_pool_t *p)
 {
-    jk_shm_ajp_worker_t *w = (jk_shm_ajp_worker_t *)jk_shm_alloc(p, JK_SHM_AJP_WORKER_SIZE);
+    jk_shm_ajp_worker_t *w = (jk_shm_ajp_worker_t *)jk_shm_alloc(p);
     if (w) {
-        memset(w, 0, JK_SHM_AJP_WORKER_SIZE);
+        memset(w, 0, JK_SHM_SLOT_SIZE);
         if (jk_shmem.hdr) {
             jk_shmem.hdr->h.data.workers++;
             w->h.id = jk_shmem.hdr->h.data.workers;
@@ -857,9 +868,9 @@ jk_shm_ajp_worker_t *jk_shm_alloc_ajp_wo
 
 jk_shm_lb_sub_worker_t *jk_shm_alloc_lb_sub_worker(jk_pool_t *p)
 {
-    jk_shm_lb_sub_worker_t *w = (jk_shm_lb_sub_worker_t *)jk_shm_alloc(p, JK_SHM_LB_SUB_WORKER_SIZE);
+    jk_shm_lb_sub_worker_t *w = (jk_shm_lb_sub_worker_t *)jk_shm_alloc(p);
     if (w) {
-        memset(w, 0, JK_SHM_LB_SUB_WORKER_SIZE);
+        memset(w, 0, JK_SHM_SLOT_SIZE);
         if (jk_shmem.hdr) {
             jk_shmem.hdr->h.data.workers++;
             w->h.id = jk_shmem.hdr->h.data.workers;
@@ -873,9 +884,9 @@ jk_shm_lb_sub_worker_t *jk_shm_alloc_lb_
 
 jk_shm_lb_worker_t *jk_shm_alloc_lb_worker(jk_pool_t *p)
 {
-    jk_shm_lb_worker_t *w = (jk_shm_lb_worker_t *)jk_shm_alloc(p, JK_SHM_LB_WORKER_SIZE);
+    jk_shm_lb_worker_t *w = (jk_shm_lb_worker_t *)jk_shm_alloc(p);
     if (w) {
-        memset(w, 0, JK_SHM_LB_WORKER_SIZE);
+        memset(w, 0, JK_SHM_SLOT_SIZE);
         if (jk_shmem.hdr) {
             jk_shmem.hdr->h.data.workers++;
             w->h.id = jk_shmem.hdr->h.data.workers;

Modified: tomcat/jk/trunk/native/common/jk_shm.h
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_shm.h?rev=1306209&r1=1306208&r2=1306209&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_shm.h (original)
+++ tomcat/jk/trunk/native/common/jk_shm.h Wed Mar 28 08:17:59 2012
@@ -48,27 +48,29 @@ extern "C"
 #define JK_SHM_MAGIC    '!', 'J', 'K', 'S', 'H', 'M', JK_SHM_MAJOR, JK_SHM_MINOR
 #define JK_SHM_MAGIC_SIZ  8
 
+/* XXX: Check if adding struct members for overflow */
+#define JK_SHM_SLOT_SIZE          384
 /* Really huge numbers, but 64 workers should be enough */
 #define JK_SHM_MAX_WORKERS        64
-#define JK_SHM_ALIGNMENT          64
+#define JK_SHM_ALIGNMENT          JK_SHM_SLOT_SIZE
 #define JK_SHM_ALIGN(x)           JK_ALIGN((x), JK_SHM_ALIGNMENT)
-#define JK_SHM_AJP_WORKER_SIZE    JK_SHM_ALIGN(sizeof(jk_shm_ajp_worker_t))
-#define JK_SHM_LB_SUB_WORKER_SIZE JK_SHM_ALIGN(sizeof(jk_shm_lb_sub_worker_t))
-#define JK_SHM_LB_WORKER_SIZE     JK_SHM_ALIGN(sizeof(jk_shm_lb_worker_t))
-#define JK_SHM_AJP_SIZE(x)        ((x) * JK_SHM_AJP_WORKER_SIZE)
-#define JK_SHM_LB_SUB_SIZE(x)     ((x) * JK_SHM_LB_SUB_WORKER_SIZE)
-#define JK_SHM_LB_SIZE(x)         ((x) * JK_SHM_LB_WORKER_SIZE)
-#define JK_SHM_DEF_SIZE           JK_SHM_AJP_SIZE(JK_SHM_MAX_WORKERS) + JK_SHM_LB_SUB_SIZE(JK_SHM_MAX_WORKERS) + JK_SHM_LB_SIZE(JK_SHM_MAX_WORKERS)
+#define JK_SHM_DEF_SIZE           ((JK_SHM_SLOT_SIZE * JK_SHM_MAX_WORKERS * 3) + JK_SHM_ALIGNMENT)
 
 /** jk shm generic worker record structure */
 struct jk_shm_worker_header
 {
+    /* Shared memory slot id */
     int     id;
+    /* JK_XXX_WORKER_TYPE */
     int     type;
     /* worker name */
     char    name[JK_SHM_STR_SIZ+1];
+    /* parent slot id.
+     * Zero in case worker does not belong to balancer.
+     */
+    int     parent_id;
     /* Sequence counter starting at 0 and increasing
-     * every time we change the config
+     * every time we change the config.
      */
     volatile unsigned int sequence;
 };
@@ -191,11 +193,11 @@ typedef struct jk_shm_lb_worker jk_shm_l
 const char *jk_shm_name(void);
 
 /* Calculate needed shm size */
-size_t jk_shm_calculate_size(jk_map_t *init_data, jk_logger_t *l);
+int jk_shm_calculate_size(jk_map_t *init_data, jk_logger_t *l);
 
 /* Open the shared memory creating file if needed
  */
-int jk_shm_open(const char *fname, size_t sz, jk_logger_t *l);
+int jk_shm_open(const char *fname, int sz, jk_logger_t *l);
 
 /* Close the shared memory
  */
@@ -204,12 +206,12 @@ void jk_shm_close(jk_logger_t *l);
 /* Attach the shared memory in child process.
  * File has to be opened in parent.
  */
-int jk_shm_attach(const char *fname, size_t sz, jk_logger_t *l);
+int jk_shm_attach(const char *fname, int sz, 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);
+void *jk_shm_alloc(jk_pool_t *p);
 
 /* allocate shm ajp worker record
  * If there is no shm present the pool will be used instead

Modified: tomcat/jk/trunk/native/iis/jk_isapi_plugin.c
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/iis/jk_isapi_plugin.c?rev=1306209&r1=1306208&r2=1306209&view=diff
==============================================================================
--- tomcat/jk/trunk/native/iis/jk_isapi_plugin.c (original)
+++ tomcat/jk/trunk/native/iis/jk_isapi_plugin.c Wed Mar 28 08:17:59 2012
@@ -496,7 +496,7 @@ static char worker_file[MAX_PATH * 2];
 static char worker_mount_file[MAX_PATH * 2] = {0};
 static int  worker_mount_reload = JK_URIMAP_DEF_RELOAD;
 static char rewrite_rule_file[MAX_PATH * 2] = {0};
-static size_t shm_config_size = -1;
+static int  shm_config_size = -1;
 static int  strip_session = 0;
 static int  use_auth_notification_flags = 1;
 static int  chunked_encoding_enabled = JK_FALSE;

Modified: tomcat/jk/trunk/native/netscape/jk_nsapi_plugin.c
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/netscape/jk_nsapi_plugin.c?rev=1306209&r1=1306208&r2=1306209&view=diff
==============================================================================
--- tomcat/jk/trunk/native/netscape/jk_nsapi_plugin.c (original)
+++ tomcat/jk/trunk/native/netscape/jk_nsapi_plugin.c Wed Mar 28 08:17:59 2012
@@ -65,7 +65,7 @@ static jk_logger_t *logger = NULL;
 static jk_worker_env_t worker_env;
 static jk_map_t *init_map = NULL;
 static jk_uri_worker_map_t *uw_map = NULL;
-static size_t jk_shm_size = 0;
+static int jk_shm_size = 0;
 
 #ifdef NETWARE
 int (*PR_IsSocketSecure) (SYS_NETFD * csd);     /* pointer to PR_IsSocketSecure function */



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