Author: mturk
Date: Sun Mar 18 07:31:27 2012
New Revision: 1302080

URL: http://svn.apache.org/viewvc?rev=1302080&view=rev
Log:
Fix crash with IIS in case shared memory cannot be created. Also properly log 
the reason for shm errors

Modified:
    tomcat/jk/trunk/native/common/jk_shm.c
    tomcat/jk/trunk/native/iis/jk_isapi_plugin.c

Modified: tomcat/jk/trunk/native/common/jk_shm.c
URL: 
http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_shm.c?rev=1302080&r1=1302079&r2=1302080&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_shm.c (original)
+++ tomcat/jk/trunk/native/common/jk_shm.c Sun Mar 18 07:31:27 2012
@@ -150,7 +150,7 @@ size_t jk_shm_calculate_size(jk_map_t *i
 /* Use plain memory */
 int jk_shm_open(const char *fname, size_t sz, jk_logger_t *l)
 {
-    int rc;
+    int rc = -1;
     int attached = 0;
     char lkname[MAX_PATH];
 
@@ -169,7 +169,10 @@ int jk_shm_open(const char *fname, size_
     }
     jk_shmem.size = JK_SHM_ALIGN(sizeof(jk_shm_header_t) + sz);
 #if defined (WIN32)
+    jk_shm_map   = NULL;
+    jk_shm_hlock = NULL;
     if (fname) {
+        SIZE_T shmsz = 0;
         sprintf(lkname, "Global\\%s_MUTEX", fname);
         jk_shm_hlock = CreateMutex(jk_get_sa_with_null_dacl(), TRUE, lkname);
         if (jk_shm_hlock == NULL) {
@@ -179,48 +182,62 @@ int jk_shm_open(const char *fname, size_
             }
         }
         if (jk_shm_hlock == NULL) {
+            rc = GetLastError();
+            jk_log(l, JK_LOG_ERROR, "Failed to open shared memory mutex %s 
with errno=%d",
+                   lkname, rc);
             JK_LEAVE_CS(&jk_shmem.cs);
             JK_TRACE_EXIT(l);
-            return -1;
+            return rc;
         }
         if (attached) {
             DWORD ws = WaitForSingleObject(jk_shm_hlock, INFINITE);
             if (ws == WAIT_FAILED) {
+                rc = GetLastError();
                 CloseHandle(jk_shm_hlock);
                 jk_shm_hlock = NULL;
                 JK_LEAVE_CS(&jk_shmem.cs);
                 JK_TRACE_EXIT(l);
-                return -1;
+                return rc;
+            }
+            jk_shm_map = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, 
FALSE, fname);
+            if (jk_shm_map == NULL) {
+                rc = GetLastError();
+                jk_log(l, JK_LOG_ERROR, "Failed to open shared memory %s with 
errno=%d",
+                       fname, rc);
             }
-            jk_shm_map = OpenFileMapping(PAGE_READWRITE, FALSE, fname);
         }
-        else {
+        if (jk_shm_map == NULL) {
+            shmsz = jk_shmem.size;
             jk_shm_map = CreateFileMapping(INVALID_HANDLE_VALUE,
                                            jk_get_sa_with_null_dacl(),
-                                           PAGE_READWRITE,
+                                           FILE_MAP_READ | FILE_MAP_WRITE,
                                            0,
-                                           (DWORD)jk_shmem.size,
+                                           (DWORD)shmsz,
                                            fname);
         }
         if (jk_shm_map == NULL || jk_shm_map == INVALID_HANDLE_VALUE) {
+            rc = GetLastError();
+            jk_log(l, JK_LOG_ERROR, "Failed to map shared memory %s with 
errno=%d",
+                   fname, rc);
             CloseHandle(jk_shm_hlock);
             jk_shm_hlock = NULL;
             jk_shm_map   = NULL;
             JK_LEAVE_CS(&jk_shmem.cs);
             JK_TRACE_EXIT(l);
-            return -1;
+            return rc;
         }
         jk_shmem.hdr = (jk_shm_header_t *)MapViewOfFile(jk_shm_map,
-                                                        FILE_MAP_ALL_ACCESS,
+                                                        FILE_MAP_READ | 
FILE_MAP_WRITE,
                                                         0,
                                                         0,
-                                                        0);
+                                                        shmsz);
     }
     else
 #endif
     jk_shmem.hdr = (jk_shm_header_t *)calloc(1, jk_shmem.size);
     if (!jk_shmem.hdr) {
 #if defined (WIN32)
+        rc = GetLastError();
         if (jk_shm_map) {
             CloseHandle(jk_shm_map);
             jk_shm_map = NULL;
@@ -232,7 +249,7 @@ int jk_shm_open(const char *fname, size_
 #endif
         JK_LEAVE_CS(&jk_shmem.cs);
         JK_TRACE_EXIT(l);
-        return -1;
+        return rc;
     }
     if (!jk_shmem.filename) {
         if (fname)
@@ -267,10 +284,12 @@ int jk_shm_open(const char *fname, size_
         jk_shmem.hdr->h.data.pos     = 0;
         jk_shmem.hdr->h.data.workers = 0;
     }
-    if (jk_shm_hlock) {
+#if defined (WIN32)
+    if (jk_shm_hlock != NULL) {
         /* Unlock shared memory */
         ReleaseMutex(jk_shm_hlock);
     }
+#endif
     JK_LEAVE_CS(&jk_shmem.cs);
     if (JK_IS_DEBUG_LEVEL(l))
         jk_log(l, JK_LOG_DEBUG,
@@ -314,6 +333,7 @@ void jk_shm_close()
     if (jk_shmem.hdr) {
 #if defined (WIN32)
         if (jk_shm_hlock) {
+            WaitForSingleObject(jk_shm_hlock, 60000);
             CloseHandle(jk_shm_hlock);
             jk_shm_hlock = NULL;
         }

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=1302080&r1=1302079&r2=1302080&view=diff
==============================================================================
--- tomcat/jk/trunk/native/iis/jk_isapi_plugin.c (original)
+++ tomcat/jk/trunk/native/iis/jk_isapi_plugin.c Sun Mar 18 07:31:27 2012
@@ -469,8 +469,8 @@ static char dll_file_path[MAX_PATH];
 static char ini_file_name[MAX_PATH];
 static int using_ini_file = JK_FALSE;
 static HANDLE init_cs = NULL;
-static int is_inited = JK_FALSE;
-static int is_mapread = JK_FALSE;
+static volatile int is_inited = JK_FALSE;
+static volatile int is_mapread = JK_FALSE;
 
 static jk_uri_worker_map_t *uw_map = NULL;
 static jk_map_t *workers_map = NULL;
@@ -2168,10 +2168,12 @@ DWORD WINAPI HttpFilterProc(PHTTP_FILTER
                     StringCbCat(serverName, MAX_SERVERNAME, instanceId);
                 }
             }
-            WaitForSingleObject(init_cs, INFINITE);
-            if (!is_mapread)
-                is_mapread = init_jk(serverName);
-            ReleaseMutex(init_cs);
+            if (!is_mapread) {
+                WaitForSingleObject(init_cs, INFINITE);
+                if (!is_mapread)
+                    is_mapread = init_jk(serverName);
+                ReleaseMutex(init_cs);
+            }
         }
         /* If we can't read the map we become dormant */
         if (!is_mapread)
@@ -2248,10 +2250,12 @@ DWORD WINAPI HttpExtensionProc(LPEXTENSI
                     StringCbCat(serverName, MAX_SERVERNAME, instanceId);
                 }
             }
-            WaitForSingleObject(init_cs, INFINITE);
-            if (!is_mapread)
-                is_mapread = init_jk(serverName);
-            ReleaseMutex(init_cs);
+            if (!is_mapread) {
+                WaitForSingleObject(init_cs, INFINITE);
+                if (!is_mapread)
+                    is_mapread = init_jk(serverName);
+                ReleaseMutex(init_cs);
+            }
         }
         if (!is_mapread)
             is_inited = JK_FALSE;
@@ -2351,10 +2355,12 @@ BOOL WINAPI TerminateFilter(DWORD dwFlag
 {
     UNREFERENCED_PARAMETER(dwFlags);
 
+    if (!is_inited)
+        return TRUE;
     WaitForSingleObject(init_cs, INFINITE);
     if (is_inited) {
-        jk_log(logger, JK_LOG_INFO, "%s stopping", (FULL_VERSION_STRING));
         is_inited = JK_FALSE;
+        jk_log(logger, JK_LOG_INFO, "%s stopping", (FULL_VERSION_STRING));
         watchdog_interval = 0;
         if (watchdog_handle) {
             WaitForSingleObject(watchdog_handle, INFINITE);
@@ -2792,13 +2798,21 @@ static int init_jk(char *serverName)
                            "You can remove the shm_size attribute if you want 
to use the optimal size.");
                 }
                 if ((rv = jk_shm_open(shm_name, shm_config_size, logger)) != 
0) {
-                    /* TODO: Do not try to open the worker if we cannot create
-                     *       the shared memory segment.
-                     */
                     jk_log(logger, JK_LOG_ERROR,
-                           "Initializing shm:%s errno=%d. Load balancing 
workers will not function properly.",
+                           "Initializing shm:%s errno=%d. Load balancer will 
not work properly!",
                            jk_shm_name(), rv);
                 }
+                else if ((rv = jk_shm_open(NULL, shm_config_size, logger)) != 
0) {
+                    /* Do not try to open the worker if we cannot create
+                     * the shared memory segment or simple memory.
+                     */
+                    jk_log(logger, JK_LOG_EMERG,
+                           "Initializing shm:%s errno=%d. Cannot continue",
+                           jk_shm_name(), rv);
+                    jk_map_free(&workers_map);
+                    workers_map = NULL;
+                    return JK_FALSE;
+                }
                 else {
                     if (shm_loaded_name[0]) {
                         if (strcmp(shm_loaded_name, shm_name)) {



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

Reply via email to