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