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 12:15:39 UTC

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

Author: mturk
Date: Tue Nov  8 11:15:38 2011
New Revision: 1199192

URL: http://svn.apache.org/viewvc?rev=1199192&view=rev
Log:
Guard data shm data access with lock. We can have sync problems when multiple processes try to update the shared memory at the same time

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=1199192&r1=1199191&r2=1199192&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_shm.c (original)
+++ tomcat/jk/trunk/native/common/jk_shm.c Tue Nov  8 11:15:38 2011
@@ -83,6 +83,7 @@ static time_t jk_workers_access_time = 0
 static HANDLE jk_shm_map = NULL;
 static HANDLE jk_shm_hlock = NULL;
 #endif
+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)
@@ -152,6 +153,7 @@ int jk_shm_open(const char *fname, size_
     int rc;
     int attached = 0;
     char lkname[MAX_PATH];
+
     JK_TRACE_ENTER(l);
     if (jk_shmem.hdr) {
         if (JK_IS_DEBUG_LEVEL(l))
@@ -159,9 +161,10 @@ int jk_shm_open(const char *fname, size_
         JK_TRACE_EXIT(l);
         return 0;
     }
-
-    jk_shmem.size = JK_SHM_ALIGN(sizeof(jk_shm_header_t) + sz);
-
+    if (!jk_shm_inited_cs) {
+        jk_shm_inited_cs = 1;
+        JK_INIT_CS(&jk_shmem.cs, rc);
+    }
 #if defined (WIN32)
     if (fname) {
         sprintf(lkname, "Global\\%s_MUTEX", fname);
@@ -257,7 +260,6 @@ int jk_shm_open(const char *fname, size_
         jk_shmem.hdr->h.data.pos     = 0;
         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);
@@ -315,6 +317,7 @@ void jk_shm_close()
 #endif
         free(jk_shmem.hdr);
         JK_DELETE_CS(&(jk_shmem.cs), rc);
+        jk_shm_inited_cs = 0;
     }
     jk_shmem.hdr = NULL;
     if (jk_shmem.filename) {
@@ -690,10 +693,12 @@ void *jk_shm_alloc(jk_pool_t *p, size_t 
 
     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) {
             rc = &(jk_shmem.hdr->buf[jk_shmem.hdr->h.data.pos]);
             jk_shmem.hdr->h.data.pos += size;
         }
+        jk_shm_unlock();
     }
     else if (p)
         rc = jk_pool_alloc(p, size);
@@ -717,11 +722,13 @@ time_t jk_shm_get_workers_time()
 
 void jk_shm_set_workers_time(time_t t)
 {
+    jk_shm_lock();
     if (jk_shmem.hdr)
         jk_shmem.hdr->h.data.modified = t;
     else
         jk_workers_modified_time = t;
     jk_workers_access_time = t;
+    jk_shm_unlock();
 }
 
 int jk_shm_is_modified()
@@ -741,11 +748,13 @@ void jk_shm_sync_access_time()
 int jk_shm_lock()
 {
     int rc;
-    JK_ENTER_CS(&(jk_shmem.cs), rc);
+
+    if (!jk_shm_inited_cs)
+        return JK_FALSE;
+    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)
+        if (WaitForSingleObject(jk_shm_hlock, INFINITE) != WAIT_FAILED)
             rc = JK_TRUE;
         else
             rc = JK_FALSE;
@@ -761,17 +770,19 @@ int jk_shm_lock()
 int jk_shm_unlock()
 {
     int rc;
-    JK_LEAVE_CS(&(jk_shmem.cs), rc);
+
+    if (!jk_shm_inited_cs)
+        return JK_FALSE;
 #if defined (WIN32)
-    if (rc == JK_TRUE && jk_shm_hlock != NULL) {
-        if (!ReleaseMutex(jk_shm_hlock))
-            rc = JK_FALSE;
+    if (jk_shm_hlock != NULL) {
+        ReleaseMutex(jk_shm_hlock);
     }
 #else
-    if (rc == JK_TRUE && jk_shmem.fd_lock != -1) {
+    if (jk_shmem.fd_lock != -1) {
         JK_LEAVE_LOCK(jk_shmem.fd_lock, rc);
     }
 #endif
+    JK_LEAVE_CS(&jk_shmem.cs, rc);
     return rc;
 }
 



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


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

Posted by Mladen Truk <mt...@apache.org>.
On 11/08/2011 05:21 PM, Rainer Jung wrote:
> Hi Mladen,
>
>> -
>> -    jk_shmem.size = JK_SHM_ALIGN(sizeof(jk_shm_header_t) + sz);
>> -
>
> Tis removal was intentional?
>

Nope :)

Thanks
-- 
^TM

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


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

Posted by Rainer Jung <ra...@kippdata.de>.
Hi Mladen,

On 08.11.2011 03:15, mturk@apache.org wrote:
> Author: mturk
> Date: Tue Nov  8 11:15:38 2011
> New Revision: 1199192
> 
> URL: http://svn.apache.org/viewvc?rev=1199192&view=rev
> Log:
> Guard data shm data access with lock. We can have sync problems when multiple processes try to update the shared memory at the same time
> 
> 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=1199192&r1=1199191&r2=1199192&view=diff
> ==============================================================================
> --- tomcat/jk/trunk/native/common/jk_shm.c (original)
> +++ tomcat/jk/trunk/native/common/jk_shm.c Tue Nov  8 11:15:38 2011
> @@ -159,9 +161,10 @@ int jk_shm_open(const char *fname, size_
>          JK_TRACE_EXIT(l);
>          return 0;
>      }
> -
> -    jk_shmem.size = JK_SHM_ALIGN(sizeof(jk_shm_header_t) + sz);
> -

Tis removal was intentional?

> +    if (!jk_shm_inited_cs) {
> +        jk_shm_inited_cs = 1;
> +        JK_INIT_CS(&jk_shmem.cs, rc);
> +    }
>  #if defined (WIN32)
>      if (fname) {
>          sprintf(lkname, "Global\\%s_MUTEX", fname);

Regards,

Rainer

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