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