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]