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 2011/11/08 11:06:40 UTC

svn commit: r1199170 - /tomcat/jk/trunk/native/common/jk_shm.c

Author: mturk
Date: Tue Nov  8 10:06:40 2011
New Revision: 1199170

URL: http://svn.apache.org/viewvc?rev=1199170&view=rev
Log:
BZ47678: Part 2. Make sure we create (and lock) mutex before creating/attaching shared memory. This should solve sync problems when multiple processes try to open the shared memory

Modified:
    tomcat/jk/trunk/native/common/jk_shm.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=1199170&r1=1199169&r2=1199170&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_shm.c (original)
+++ tomcat/jk/trunk/native/common/jk_shm.c Tue Nov  8 10:06:40 2011
@@ -164,33 +164,41 @@ int jk_shm_open(const char *fname, size_
 
 #if defined (WIN32)
     if (fname) {
-        jk_shm_map = CreateFileMapping(INVALID_HANDLE_VALUE,
-                                       jk_get_sa_with_null_dacl(),
-                                       PAGE_READWRITE,
-                                       0,
-                                       (DWORD)(sizeof(jk_shm_header_t) + sz),
-                                       fname);
-        if (GetLastError() == ERROR_ALREADY_EXISTS) {
-            attached = 1;
-            if (jk_shm_map == NULL || jk_shm_map == INVALID_HANDLE_VALUE) {
-                jk_shm_map = OpenFileMapping(PAGE_READWRITE, FALSE, fname);
+        sprintf(lkname, "Global\\%s_MUTEX", fname);
+        jk_shm_hlock = CreateMutex(jk_get_sa_with_null_dacl(), TRUE, lkname);
+        if (jk_shm_hlock == NULL) {
+            if (GetLastError() == ERROR_ALREADY_EXISTS) {
+                attached = 1;
+                jk_shm_hlock = OpenMutex(MUTEX_ALL_ACCESS, FALSE, lkname);
             }
         }
-        if (jk_shm_map == NULL || jk_shm_map == INVALID_HANDLE_VALUE) {
+        if (jk_shm_hlock == NULL) {
             JK_TRACE_EXIT(l);
             return -1;
         }
-        sprintf(lkname, "Global\\%s_MUTEX", fname);
         if (attached) {
-            jk_shm_hlock = OpenMutex(MUTEX_ALL_ACCESS, FALSE, lkname);
+            DWORD ws = WaitForSingleObject(jk_shm_hlock, INFINITE);
+            if (ws == WAIT_FAILED) {
+                CloseHandle(jk_shm_hlock);
+                jk_shm_hlock = NULL;
+                JK_TRACE_EXIT(l);
+                return -1;
+            }
+            jk_shm_map = OpenFileMapping(PAGE_READWRITE, FALSE, fname);
         }
         else {
-            jk_shm_hlock = CreateMutex(jk_get_sa_with_null_dacl(), FALSE, lkname);            
+            jk_shm_map = CreateFileMapping(INVALID_HANDLE_VALUE,
+                                           jk_get_sa_with_null_dacl(),
+                                           PAGE_READWRITE,
+                                           0,
+                                           (DWORD)(sizeof(jk_shm_header_t) + sz),
+                                           fname);
         }
-        if (jk_shm_hlock == NULL || jk_shm_hlock == INVALID_HANDLE_VALUE) {
-            CloseHandle(jk_shm_map);
-            jk_shm_map = NULL;
+        if (jk_shm_map == NULL || jk_shm_map == INVALID_HANDLE_VALUE) {
             JK_TRACE_EXIT(l);
+            CloseHandle(jk_shm_hlock);
+            jk_shm_hlock = NULL;
+            jk_shm_map   = NULL;
             return -1;
         }
         jk_shmem.hdr = (jk_shm_header_t *)MapViewOfFile(jk_shm_map,
@@ -250,6 +258,10 @@ int jk_shm_open(const char *fname, size_
         jk_shmem.hdr->h.data.workers = 0;
     }
     JK_INIT_CS(&(jk_shmem.cs), rc);
+    if (jk_shm_hlock) {
+        /* Unlock shared memory */
+        ReleaseMutex(jk_shm_hlock);
+    }
     if (JK_IS_DEBUG_LEVEL(l))
         jk_log(l, JK_LOG_DEBUG,
                "%s shared memory %s size=%u free=%u addr=%#lx",
@@ -736,9 +748,9 @@ int jk_shm_lock()
         if (rv == WAIT_OBJECT_0 || rv == WAIT_ABANDONED)
             rc = JK_TRUE;
         else
-            rc = JK_FALSE;         
+            rc = JK_FALSE;
     }
-#else    
+#else
     if (rc == JK_TRUE && jk_shmem.fd_lock != -1) {
         JK_ENTER_LOCK(jk_shmem.fd_lock, rc);
     }
@@ -753,9 +765,9 @@ int jk_shm_unlock()
 #if defined (WIN32)
     if (rc == JK_TRUE && jk_shm_hlock != NULL) {
         if (!ReleaseMutex(jk_shm_hlock))
-            rc = JK_FALSE;         
+            rc = JK_FALSE;
     }
-#else    
+#else
     if (rc == JK_TRUE && jk_shmem.fd_lock != -1) {
         JK_LEAVE_LOCK(jk_shmem.fd_lock, rc);
     }



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