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-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org