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 2007/03/15 14:28:41 UTC
svn commit: r518624 - /tomcat/connectors/trunk/jk/native/common/jk_shm.c
Author: mturk
Date: Thu Mar 15 06:28:39 2007
New Revision: 518624
URL: http://svn.apache.org/viewvc?view=rev&rev=518624
Log:
Make shared memory lock reopenable by compile time define.
It is used anyhow for the kernels that have bug in flock.
Defaults to old behavior.
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?view=diff&rev=518624&r1=518623&r2=518624
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_shm.c (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_shm.c Thu Mar 15 06:28:39 2007
@@ -228,34 +228,21 @@
#define MAP_FILE (0)
#endif
-static int do_shm_open_lock(int attached, jk_logger_t *l)
+#ifdef JK_SHM_LOCK_REOPEN
+static int shm_lock_reopen = 1;
+#else
+static int shm_lock_reopen = 0;
+#endif
+
+static int do_shm_open_lock(const char *fname, int attached, jk_logger_t *l)
{
int rc;
char flkname[256];
JK_TRACE_ENTER(l);
- if (!jk_shmem.lockname) {
- int i;
- jk_shmem.fd_lock = -1;
- mode_t mask = umask(0);
- for (i = 0; i < 8; i++) {
- strcpy(flkname, "/tmp/jkshmlock.XXXXXX");
- if (mktemp(flkname)) {
- jk_shmem.fd_lock = open(flkname, O_RDWR|O_CREAT|O_TRUNC, 0666);
- if (jk_shmem.fd_lock >= 0)
- break;
- }
- }
- umask(mask);
- if (jk_shmem.fd_lock == -1) {
- rc = errno;
- JK_TRACE_EXIT(l);
- return rc;
- }
- jk_shmem.lockname = strdup(flkname);
- }
- else if (attached) {
- jk_shmem.fd_lock = open(jk_shmem.lockname, O_RDWR, 0666);
+ if (attached) {
+ if (shm_lock_reopen)
+ jk_shmem.fd_lock = open(jk_shmem.lockname, O_RDWR, 0666);
if (jk_shmem.fd_lock == -1) {
rc = errno;
JK_TRACE_EXIT(l);
@@ -267,27 +254,53 @@
JK_TRACE_EXIT(l);
return 0;
}
- else {
-
-
- }
- if (!attached) {
- if (ftruncate(jk_shmem.fd_lock, 1)) {
- rc = errno;
- close(jk_shmem.fd_lock);
+ if (!jk_shmem.lockname) {
+ if (shm_lock_reopen) {
+ int i;
jk_shmem.fd_lock = -1;
+ mode_t mask = umask(0);
+ for (i = 0; i < 8; i++) {
+ strcpy(flkname, "/tmp/jkshmlock.XXXXXX");
+ if (mktemp(flkname)) {
+ jk_shmem.fd_lock = open(flkname, O_RDWR|O_CREAT|O_TRUNC, 0666);
+ if (jk_shmem.fd_lock >= 0)
+ break;
+ }
+ }
+ umask(mask);
+ }
+ else {
+ strcpy(flkname, fname);
+ strcat(flkname, ".lock");
+ jk_shmem.fd_lock = open(flkname, O_RDWR|O_CREAT|O_TRUNC, 0666);
+ }
+ if (jk_shmem.fd_lock == -1) {
+ rc = errno;
JK_TRACE_EXIT(l);
return rc;
- }
+ }
+ jk_shmem.lockname = strdup(flkname);
}
- if (lseek(jk_shmem.fd_lock, 0, SEEK_SET) != 0) {
+ else {
+ /* Nothing to do */
+ JK_TRACE_EXIT(l);
+ return 0;
+ }
+
+ if (ftruncate(jk_shmem.fd_lock, 1)) {
rc = errno;
close(jk_shmem.fd_lock);
jk_shmem.fd_lock = -1;
JK_TRACE_EXIT(l);
return rc;
}
+ if (lseek(jk_shmem.fd_lock, 0, SEEK_SET) != 0) {
+ rc = errno;
+ close(jk_shmem.fd_lock);
+ jk_shmem.fd_lock = -1;
+ return rc;
+ }
if (JK_IS_DEBUG_LEVEL(l))
jk_log(l, JK_LOG_DEBUG,
"Opened shared memory lock %s", jk_shmem.lockname);
@@ -382,8 +395,10 @@
jk_shmem.size, jk_shmem.hdr->h.data.size, jk_shmem.hdr);
}
else {
- unsigned int nchild = jk_shmem.hdr->h.data.childs + 1;
+ unsigned int nchild;
+ jk_shmem.hdr->h.data.childs++;
jk_shmem.attached = (int)getpid();
+ nchild = jk_shmem.hdr->h.data.childs;
if (JK_IS_DEBUG_LEVEL(l))
jk_log(l, JK_LOG_DEBUG,
"Attached shared memory [%d] size=%u free=%u addr=%#lx",
@@ -404,12 +419,11 @@
nchild);
}
}
- jk_shmem.hdr->h.data.childs = nchild;
jk_shmem.hdr->h.data.pos = 0;
jk_shmem.hdr->h.data.workers = 0;
}
JK_INIT_CS(&(jk_shmem.cs), rc);
- if ((rc = do_shm_open_lock(attached, l))) {
+ if ((rc = do_shm_open_lock(fname, attached, l))) {
if (!attached) {
munmap((void *)jk_shmem.hdr, jk_shmem.size);
close(jk_shmem.fd);
@@ -440,8 +454,10 @@
--jk_shmem.hdr->h.data.childs;
if (jk_shmem.fd_lock >= 0) {
- close(jk_shmem.fd_lock);
- jk_shmem.fd_lock = -1;
+ if (shm_lock_reopen) {
+ close(jk_shmem.fd_lock);
+ jk_shmem.fd_lock = -1;
+ }
}
JK_DELETE_CS(&(jk_shmem.cs), rc);
if (jk_shmem.attached) {
@@ -460,16 +476,18 @@
if (jk_shmem.fd >= 0) {
munmap((void *)jk_shmem.hdr, jk_shmem.size);
close(jk_shmem.fd);
- if (jk_shmem.lockname) {
- unlink(jk_shmem.lockname);
- free(jk_shmem.lockname);
- jk_shmem.lockname = NULL;
- }
+ }
+ if (jk_shmem.fd_lock >= 0)
+ close(jk_shmem.fd_lock);
+ if (jk_shmem.lockname) {
+ unlink(jk_shmem.lockname);
+ free(jk_shmem.lockname);
}
}
- jk_shmem.size = 0;
- jk_shmem.hdr = NULL;
- jk_shmem.fd = -1;
+ jk_shmem.size = 0;
+ jk_shmem.hdr = NULL;
+ jk_shmem.fd = -1;
+ jk_shmem.fd_lock = -1;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org