Author: mturk
Date: Mon Oct  6 07:28:20 2008
New Revision: 702160

URL: http://svn.apache.org/viewvc?rev=702160&view=rev
Log:
Implement global shared memory lock for IIS. With IIS 6+ we don't have a single 
process any more

Modified:
    tomcat/connectors/trunk/jk/native/common/jk_shm.c

Modified: tomcat/connectors/trunk/jk/native/common/jk_shm.c
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_shm.c?rev=702160&r1=702159&r2=702160&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_shm.c (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_shm.c Mon Oct  6 07:28:20 2008
@@ -81,6 +81,7 @@
 static time_t jk_workers_access_time = 0;
 #if defined (WIN32)
 static HANDLE jk_shm_map = NULL;
+static HANDLE jk_shm_hlock = NULL;
 #endif
 
 /* Calculate needed shm size */
@@ -150,6 +151,7 @@
 {
     int rc;
     int attached = 0;
+    char lkname[MAX_PATH];
     JK_TRACE_ENTER(l);
     if (jk_shmem.hdr) {
         if (JK_IS_DEBUG_LEVEL(l))
@@ -178,6 +180,19 @@
             JK_TRACE_EXIT(l);
             return -1;
         }
+        sprintf(lkname, "Global\\%s_MUTEX", fname);
+        if (attached) {
+            jk_shm_hlock = OpenMutex(MUTEX_ALL_ACCESS, FALSE, lkname);
+        }
+        else {
+            jk_shm_hlock = CreateMutex(NULL, FALSE, lkname);            
+        }
+        if (jk_shm_hlock == NULL || jk_shm_hlock == INVALID_HANDLE_VALUE) {
+            CloseHandle(jk_shm_map);
+            jk_shm_map = NULL;
+            JK_TRACE_EXIT(l);
+            return -1;
+        }
         jk_shmem.hdr = (jk_shm_header_t *)MapViewOfFile(jk_shm_map,
                                                         FILE_MAP_ALL_ACCESS,
                                                         0,
@@ -193,6 +208,10 @@
             CloseHandle(jk_shm_map);
             jk_shm_map = NULL;
         }
+        if (jk_shm_hlock) {
+            CloseHandle(jk_shm_hlock);
+            jk_shm_hlock = NULL;
+        }
 #endif
         JK_TRACE_EXIT(l);
         return -1;
@@ -270,6 +289,10 @@
     if (jk_shmem.hdr) {
         int rc;
 #if defined (WIN32)
+        if (jk_shm_hlock) {
+            CloseHandle(jk_shm_hlock);
+            jk_shm_hlock = NULL;
+        }
         if (jk_shm_map) {
             --jk_shmem.hdr->h.data.childs;
             UnmapViewOfFile(jk_shmem.hdr);
@@ -707,9 +730,19 @@
 {
     int rc;
     JK_ENTER_CS(&(jk_shmem.cs), rc);
+#if defined (WIN32)
+    if (rc == JK_TRUE && jk_shm_hlock != NULL) {
+        DWORD rv = WaitForSingleObject(jk_shm_hlock, INFINITE);
+        if (rv == WAIT_OBJECT_0 || rv == WAIT_ABANDONED)
+            rc = JK_TRUE;
+        else
+            rc = JK_FALSE;         
+    }
+#else    
     if (rc == JK_TRUE && jk_shmem.fd_lock != -1) {
         JK_ENTER_LOCK(jk_shmem.fd_lock, rc);
     }
+#endif
     return rc;
 }
 
@@ -717,9 +750,16 @@
 {
     int rc;
     JK_LEAVE_CS(&(jk_shmem.cs), rc);
+#if defined (WIN32)
+    if (rc == JK_TRUE && jk_shm_hlock != NULL) {
+        if (!ReleaseMutex(jk_shm_hlock))
+            rc = JK_FALSE;         
+    }
+#else    
     if (rc == JK_TRUE && jk_shmem.fd_lock != -1) {
         JK_LEAVE_LOCK(jk_shmem.fd_lock, rc);
     }
+#endif
     return rc;
 }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to