Author: markt
Date: Sun May  3 01:15:41 2009
New Revision: 771009

URL: http://svn.apache.org/viewvc?rev=771009&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=46990
Various sync issues. Patch provided by s...@a.o

Modified:
    tomcat/tc6.0.x/trunk/   (props changed)
    tomcat/tc6.0.x/trunk/STATUS.txt
    tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/StandardContext.java
    tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/StandardHost.java
    
tomcat/tc6.0.x/trunk/java/org/apache/catalina/tribes/membership/Membership.java
    tomcat/tc6.0.x/trunk/java/org/apache/catalina/util/InstanceSupport.java
    tomcat/tc6.0.x/trunk/java/org/apache/catalina/util/LifecycleSupport.java
    tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml

Propchange: tomcat/tc6.0.x/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun May  3 01:15:41 2009
@@ -1 +1 @@
-/tomcat/trunk:601180,606992,612607,630314,640888,652744,653247,673796,673820,683982,684001,684081,684234,684269-684270,685177,687503,687645,689402,690781,691392,691805,692748,693378,694992,695053,695311,696780,696782,698012,698227,698236,698613,699427,699634,701355,709294,709811,709816,710063,710066,710125,710205,711126,711600,712461,712467,718360,719119,719124,719602,719626,719628,720046,720069,721040,723404,723738,726052,727303,728032,728768,728947,729057,729567,729569,729571,729681,729809,729815,729934,730250,730590,731651,732859,732863,734734,740675,740684,742677,742697,742714,744160,744238,746321,746384,747834,747863,748344,750258,750291,750921,751286-751287,751289,751295,753039,757774,758596,758616,758664,759074,761601,762868,762929,762936-762937,763166,763183,763193,763302,763599,763681,763706,765662,768335
+/tomcat/trunk:601180,606992,612607,630314,640888,652744,653247,673796,673820,683982,684001,684081,684234,684269-684270,685177,687503,687645,689402,690781,691392,691805,692748,693378,694992,695053,695311,696780,696782,698012,698227,698236,698613,699427,699634,701355,709294,709811,709816,710063,710066,710125,710205,711126,711600,712461,712467,718360,719119,719124,719602,719626,719628,720046,720069,721040,723404,723738,726052,727303,728032,728768,728947,729057,729567,729569,729571,729681,729809,729815,729934,730250,730590,731651,732859,732863,734734,740675,740684,742677,742697,742714,744160,744238,746321,746384,747834,747863,748344,750258,750291,750921,751286-751287,751289,751295,753039,757774,758596,758616,758664,759074,761601,762868,762929,762936-762937,763166,763183,763193,763298,763302,763599,763681,763706,765662,768335

Modified: tomcat/tc6.0.x/trunk/STATUS.txt
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/STATUS.txt?rev=771009&r1=771008&r2=771009&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/STATUS.txt (original)
+++ tomcat/tc6.0.x/trunk/STATUS.txt Sun May  3 01:15:41 2009
@@ -111,14 +111,6 @@
   +1: markt, pero
   -1: 
 
-* Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=46990
-  Correct various sync issues reported by FindBugs
-  Patch provided by s...@a.o
-  http://svn.apache.org/viewvc?rev=763298&view=rev
-  +1: markt, rjung, pero
-   0: remm (zzz)
-  -1: 
-
 * Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=46509
   Use correct link on error page in JSP security example
   Patch provided by Michael Moody

Modified: 
tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/StandardContext.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/StandardContext.java?rev=771009&r1=771008&r2=771009&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/StandardContext.java 
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/StandardContext.java Sun 
May  3 01:15:41 2009
@@ -202,6 +202,8 @@
      * application, in the order they were encountered in the web.xml file.
      */
     private String applicationListeners[] = new String[0];
+    
+    private final Object applicationListenersLock = new Object();
 
 
     /**
@@ -224,6 +226,8 @@
     private ApplicationParameter applicationParameters[] =
         new ApplicationParameter[0];
 
+    private final Object applicationParametersLock = new Object();
+    
 
     /**
      * The application available flag for this Context.
@@ -264,6 +268,8 @@
      * The security constraints for this web application.
      */
     private SecurityConstraint constraints[] = new SecurityConstraint[0];
+    
+    private final Object constraintsLock = new Object();
 
 
     /**
@@ -360,6 +366,8 @@
      * they were defined in the deployment descriptor.
      */
     private FilterMap filterMaps[] = new FilterMap[0];
+    
+    private final Object filterMapsLock = new Object();
 
 
     /**
@@ -374,6 +382,8 @@
      */
     private String instanceListeners[] = new String[0];
 
+    private final Object instanceListenersLock = new Object();
+
 
     /**
      * The login configuration descriptor for this web application.
@@ -491,12 +501,16 @@
      */
     private String securityRoles[] = new String[0];
 
+    private final Object securityRolesLock = new Object();
+
 
     /**
      * The servlet mappings for this web application, keyed by
      * matching pattern.
      */
     private HashMap servletMappings = new HashMap();
+    
+    private final Object servletMappingsLock = new Object();
 
 
     /**
@@ -540,12 +554,16 @@
      */
     private String watchedResources[] = new String[0];
 
+    private final Object watchedResourcesLock = new Object();
+
 
     /**
      * The welcome files for this application.
      */
     private String welcomeFiles[] = new String[0];
 
+    private final Object welcomeFilesLock = new Object();
+
 
     /**
      * The set of classnames of LifecycleListeners that will be added
@@ -553,6 +571,8 @@
      */
     private String wrapperLifecycles[] = new String[0];
 
+    private final Object wrapperLifecyclesLock = new Object();
+
 
     /**
      * The set of classnames of ContainerListeners that will be added
@@ -560,6 +580,8 @@
      */
     private String wrapperListeners[] = new String[0];
 
+    private final Object wrapperListenersLock = new Object();
+
 
     /**
      * The pathname to the work directory for this context (relative to
@@ -2000,7 +2022,7 @@
      */
     public void addApplicationListener(String listener) {
 
-        synchronized (applicationListeners) {
+        synchronized (applicationListenersLock) {
             String results[] =new String[applicationListeners.length + 1];
             for (int i = 0; i < applicationListeners.length; i++) {
                 if (listener.equals(applicationListeners[i])) {
@@ -2027,7 +2049,7 @@
      */
     public void addApplicationParameter(ApplicationParameter parameter) {
 
-        synchronized (applicationParameters) {
+        synchronized (applicationParametersLock) {
             String newName = parameter.getName();
             for (int i = 0; i < applicationParameters.length; i++) {
                 if (newName.equals(applicationParameters[i].getName()) &&
@@ -2124,7 +2146,7 @@
         }
 
         // Add this constraint to the set for our web application
-        synchronized (constraints) {
+        synchronized (constraintsLock) {
             SecurityConstraint results[] =
                 new SecurityConstraint[constraints.length + 1];
             for (int i = 0; i < constraints.length; i++)
@@ -2259,7 +2281,7 @@
      */
     public void addInstanceListener(String listener) {
 
-        synchronized (instanceListeners) {
+        synchronized (instanceListenersLock) {
             String results[] =new String[instanceListeners.length + 1];
             for (int i = 0; i < instanceListeners.length; i++)
                 results[i] = instanceListeners[i];
@@ -2402,7 +2424,7 @@
      */
     public void addSecurityRole(String role) {
 
-        synchronized (securityRoles) {
+        synchronized (securityRolesLock) {
             String results[] =new String[securityRoles.length + 1];
             for (int i = 0; i < securityRoles.length; i++)
                 results[i] = securityRoles[i];
@@ -2453,7 +2475,7 @@
                 (sm.getString("standardContext.servletMap.pattern", pattern));
 
         // Add this mapping to our registered set
-        synchronized (servletMappings) {
+        synchronized (servletMappingsLock) {
             String name2 = (String) servletMappings.get(pattern);
             if (name2 != null) {
                 // Don't allow more than one servlet on the same pattern
@@ -2497,7 +2519,7 @@
      */
     public void addWatchedResource(String name) {
 
-        synchronized (watchedResources) {
+        synchronized (watchedResourcesLock) {
             String results[] = new String[watchedResources.length + 1];
             for (int i = 0; i < watchedResources.length; i++)
                 results[i] = watchedResources[i];
@@ -2516,7 +2538,7 @@
      */
     public void addWelcomeFile(String name) {
 
-        synchronized (welcomeFiles) {
+        synchronized (welcomeFilesLock) {
             // Welcome files from the application deployment descriptor
             // completely replace those from the default conf/web.xml file
             if (replaceWelcomeFiles) {
@@ -2543,7 +2565,7 @@
      */
     public void addWrapperLifecycle(String listener) {
 
-        synchronized (wrapperLifecycles) {
+        synchronized (wrapperLifecyclesLock) {
             String results[] =new String[wrapperLifecycles.length + 1];
             for (int i = 0; i < wrapperLifecycles.length; i++)
                 results[i] = wrapperLifecycles[i];
@@ -2563,7 +2585,7 @@
      */
     public void addWrapperListener(String listener) {
 
-        synchronized (wrapperListeners) {
+        synchronized (wrapperListenersLock) {
             String results[] =new String[wrapperListeners.length + 1];
             for (int i = 0; i < wrapperListeners.length; i++)
                 results[i] = wrapperListeners[i];
@@ -2595,7 +2617,7 @@
             wrapper = new StandardWrapper();
         }
 
-        synchronized (instanceListeners) {
+        synchronized (instanceListenersLock) {
             for (int i = 0; i < instanceListeners.length; i++) {
                 try {
                     Class clazz = Class.forName(instanceListeners[i]);
@@ -2609,7 +2631,7 @@
             }
         }
 
-        synchronized (wrapperLifecycles) {
+        synchronized (wrapperLifecyclesLock) {
             for (int i = 0; i < wrapperLifecycles.length; i++) {
                 try {
                     Class clazz = Class.forName(wrapperLifecycles[i]);
@@ -2624,7 +2646,7 @@
             }
         }
 
-        synchronized (wrapperListeners) {
+        synchronized (wrapperListenersLock) {
             for (int i = 0; i < wrapperListeners.length; i++) {
                 try {
                     Class clazz = Class.forName(wrapperListeners[i]);
@@ -2659,7 +2681,9 @@
      */
     public ApplicationParameter[] findApplicationParameters() {
 
-        return (applicationParameters);
+        synchronized (applicationParametersLock) {
+            return (applicationParameters);
+        }
 
     }
 
@@ -2777,7 +2801,9 @@
      */
     public String[] findInstanceListeners() {
 
-        return (instanceListeners);
+        synchronized (instanceListenersLock) {
+            return (instanceListeners);
+        }
 
     }
 
@@ -2936,7 +2962,7 @@
      */
     public boolean findSecurityRole(String role) {
 
-        synchronized (securityRoles) {
+        synchronized (securityRolesLock) {
             for (int i = 0; i < securityRoles.length; i++) {
                 if (role.equals(securityRoles[i]))
                     return (true);
@@ -2953,7 +2979,9 @@
      */
     public String[] findSecurityRoles() {
 
-        return (securityRoles);
+        synchronized (securityRolesLock) {
+            return (securityRoles);
+        }
 
     }
 
@@ -2966,7 +2994,7 @@
      */
     public String findServletMapping(String pattern) {
 
-        synchronized (servletMappings) {
+        synchronized (servletMappingsLock) {
             return ((String) servletMappings.get(pattern));
         }
 
@@ -2979,7 +3007,7 @@
      */
     public String[] findServletMappings() {
 
-        synchronized (servletMappings) {
+        synchronized (servletMappingsLock) {
             String results[] = new String[servletMappings.size()];
             return
                ((String[]) servletMappings.keySet().toArray(results));
@@ -3062,7 +3090,7 @@
      */
     public boolean findWelcomeFile(String name) {
 
-        synchronized (welcomeFiles) {
+        synchronized (welcomeFilesLock) {
             for (int i = 0; i < welcomeFiles.length; i++) {
                 if (name.equals(welcomeFiles[i]))
                     return (true);
@@ -3078,7 +3106,9 @@
      * defined, a zero length array will be returned.
      */
     public String[] findWatchedResources() {
-        return watchedResources;
+        synchronized (watchedResourcesLock) {
+            return watchedResources;
+        }
     }
     
     
@@ -3088,7 +3118,9 @@
      */
     public String[] findWelcomeFiles() {
 
-        return (welcomeFiles);
+        synchronized (welcomeFilesLock) {
+            return (welcomeFiles);
+        }
 
     }
 
@@ -3099,7 +3131,9 @@
      */
     public String[] findWrapperLifecycles() {
 
-        return (wrapperLifecycles);
+        synchronized (wrapperLifecyclesLock) {
+            return (wrapperLifecycles);
+        }
 
     }
 
@@ -3110,7 +3144,9 @@
      */
     public String[] findWrapperListeners() {
 
-        return (wrapperListeners);
+        synchronized (wrapperListenersLock) {
+            return (wrapperListeners);
+        }
 
     }
 
@@ -3169,7 +3205,7 @@
      */
     public void removeApplicationListener(String listener) {
 
-        synchronized (applicationListeners) {
+        synchronized (applicationListenersLock) {
 
             // Make sure this welcome file is currently present
             int n = -1;
@@ -3209,7 +3245,7 @@
      */
     public void removeApplicationParameter(String name) {
 
-        synchronized (applicationParameters) {
+        synchronized (applicationParametersLock) {
 
             // Make sure this parameter is currently present
             int n = -1;
@@ -3268,7 +3304,7 @@
      */
     public void removeConstraint(SecurityConstraint constraint) {
 
-        synchronized (constraints) {
+        synchronized (constraintsLock) {
 
             // Make sure this constraint is currently present
             int n = -1;
@@ -3348,7 +3384,7 @@
      */
     public void removeFilterMap(FilterMap filterMap) {
 
-        synchronized (filterMaps) {
+        synchronized (filterMapsLock) {
 
             // Make sure this filter mapping is currently present
             int n = -1;
@@ -3384,7 +3420,7 @@
      */
     public void removeInstanceListener(String listener) {
 
-        synchronized (instanceListeners) {
+        synchronized (instanceListenersLock) {
 
             // Make sure this welcome file is currently present
             int n = -1;
@@ -3496,7 +3532,7 @@
      */
     public void removeSecurityRole(String role) {
 
-        synchronized (securityRoles) {
+        synchronized (securityRolesLock) {
 
             // Make sure this security role is currently present
             int n = -1;
@@ -3535,7 +3571,7 @@
     public void removeServletMapping(String pattern) {
 
         String name = null;
-        synchronized (servletMappings) {
+        synchronized (servletMappingsLock) {
             name = (String) servletMappings.remove(pattern);
         }
         Wrapper wrapper = (Wrapper) findChild(name);
@@ -3570,7 +3606,7 @@
      */
     public void removeWatchedResource(String name) {
         
-        synchronized (watchedResources) {
+        synchronized (watchedResourcesLock) {
 
             // Make sure this watched resource is currently present
             int n = -1;
@@ -3607,7 +3643,7 @@
      */
     public void removeWelcomeFile(String name) {
 
-        synchronized (welcomeFiles) {
+        synchronized (welcomeFilesLock) {
 
             // Make sure this welcome file is currently present
             int n = -1;
@@ -3647,7 +3683,7 @@
     public void removeWrapperLifecycle(String listener) {
 
 
-        synchronized (wrapperLifecycles) {
+        synchronized (wrapperLifecyclesLock) {
 
             // Make sure this welcome file is currently present
             int n = -1;
@@ -3686,7 +3722,7 @@
     public void removeWrapperListener(String listener) {
 
 
-        synchronized (wrapperListeners) {
+        synchronized (wrapperListenersLock) {
 
             // Make sure this welcome file is currently present
             int n = -1;
@@ -4633,7 +4669,9 @@
         // Notify our interested LifecycleListeners
         lifecycle.fireLifecycleEvent(DESTROY_EVENT, null);
 
-        instanceListeners = new String[0];
+        synchronized (instanceListenersLock) {
+            instanceListeners = new String[0];
+        }
 
     }
     

Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/StandardHost.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/StandardHost.java?rev=771009&r1=771008&r2=771009&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/StandardHost.java 
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/StandardHost.java Sun 
May  3 01:15:41 2009
@@ -72,6 +72,8 @@
      * The set of aliases for this Host.
      */
     private String[] aliases = new String[0];
+    
+    private final Object aliasesLock = new Object();
 
 
     /**
@@ -491,20 +493,19 @@
 
         alias = alias.toLowerCase();
 
-        // Skip duplicate aliases
-        for (int i = 0; i < aliases.length; i++) {
-            if (aliases[i].equals(alias))
-                return;
+        synchronized (aliasesLock) {
+            // Skip duplicate aliases
+            for (int i = 0; i < aliases.length; i++) {
+                if (aliases[i].equals(alias))
+                    return;
+            }
+            // Add this alias to the list
+            String newAliases[] = new String[aliases.length + 1];
+            for (int i = 0; i < aliases.length; i++)
+                newAliases[i] = aliases[i];
+            newAliases[aliases.length] = alias;
+            aliases = newAliases;
         }
-
-        // Add this alias to the list
-        String newAliases[] = new String[aliases.length + 1];
-        for (int i = 0; i < aliases.length; i++)
-            newAliases[i] = aliases[i];
-        newAliases[aliases.length] = alias;
-
-        aliases = newAliases;
-
         // Inform interested listeners
         fireContainerEvent(ADD_ALIAS_EVENT, alias);
 
@@ -533,7 +534,9 @@
      */
     public String[] findAliases() {
 
-        return (this.aliases);
+        synchronized (aliasesLock) {
+            return (this.aliases);
+        }
 
     }
 
@@ -608,7 +611,7 @@
 
         alias = alias.toLowerCase();
 
-        synchronized (aliases) {
+        synchronized (aliasesLock) {
 
             // Make sure this alias is currently present
             int n = -1;
@@ -743,7 +746,9 @@
      }
 
     public String[] getAliases() {
-        return aliases;
+        synchronized (aliasesLock) {
+            return aliases;
+        }
     }
 
     private boolean initialized=false;

Modified: 
tomcat/tc6.0.x/trunk/java/org/apache/catalina/tribes/membership/Membership.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/tribes/membership/Membership.java?rev=771009&r1=771008&r2=771009&view=diff
==============================================================================
--- 
tomcat/tc6.0.x/trunk/java/org/apache/catalina/tribes/membership/Membership.java 
(original)
+++ 
tomcat/tc6.0.x/trunk/java/org/apache/catalina/tribes/membership/Membership.java 
Sun May  3 01:15:41 2009
@@ -40,6 +40,8 @@
 {
     protected static final MemberImpl[] EMPTY_MEMBERS = new MemberImpl[0];
     
+    private final Object membersLock = new Object();
+    
     /**
      * The name of this membership, has to be the same as the name for the 
local
      * member
@@ -62,7 +64,7 @@
     protected Comparator memberComparator = new MemberComparator();
 
     public Object clone() {
-        synchronized (members) {
+        synchronized (membersLock) {
             Membership clone = new Membership(local, memberComparator);
             clone.map = (HashMap) map.clone();
             clone.members = new MemberImpl[members.length];
@@ -138,7 +140,7 @@
      * @param member The member to add
      */
     public synchronized MbrEntry addMember(MemberImpl member) {
-      synchronized (members) {
+      synchronized (membersLock) {
           MbrEntry entry = new MbrEntry(member);
           if (!map.containsKey(member) ) {
               map.put(member, entry);
@@ -159,7 +161,7 @@
      */
     public void removeMember(MemberImpl member) {
         map.remove(member);
-        synchronized (members) {
+        synchronized (membersLock) {
             int n = -1;
             for (int i = 0; i < members.length; i++) {
                 if (members[i] == member || members[i].equals(member)) {

Modified: 
tomcat/tc6.0.x/trunk/java/org/apache/catalina/util/InstanceSupport.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/util/InstanceSupport.java?rev=771009&r1=771008&r2=771009&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/util/InstanceSupport.java 
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/util/InstanceSupport.java Sun 
May  3 01:15:41 2009
@@ -64,6 +64,8 @@
      * The set of registered InstanceListeners for event notifications.
      */
     private InstanceListener listeners[] = new InstanceListener[0];
+    
+    private final Object listenersLock = new Object(); // Lock object for 
changes to listeners
 
 
     /**
@@ -95,7 +97,7 @@
      */
     public void addInstanceListener(InstanceListener listener) {
 
-      synchronized (listeners) {
+      synchronized (listenersLock) {
           InstanceListener results[] =
             new InstanceListener[listeners.length + 1];
           for (int i = 0; i < listeners.length; i++)
@@ -312,7 +314,7 @@
      */
     public void removeInstanceListener(InstanceListener listener) {
 
-        synchronized (listeners) {
+        synchronized (listenersLock) {
             int n = -1;
             for (int i = 0; i < listeners.length; i++) {
                 if (listeners[i] == listener) {

Modified: 
tomcat/tc6.0.x/trunk/java/org/apache/catalina/util/LifecycleSupport.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/util/LifecycleSupport.java?rev=771009&r1=771008&r2=771009&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/util/LifecycleSupport.java 
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/util/LifecycleSupport.java 
Sun May  3 01:15:41 2009
@@ -66,6 +66,8 @@
      * The set of registered LifecycleListeners for event notifications.
      */
     private LifecycleListener listeners[] = new LifecycleListener[0];
+    
+    private final Object listenersLock = new Object(); // Lock object for 
changes to listeners
 
 
     // --------------------------------------------------------- Public Methods
@@ -78,7 +80,7 @@
      */
     public void addLifecycleListener(LifecycleListener listener) {
 
-      synchronized (listeners) {
+      synchronized (listenersLock) {
           LifecycleListener results[] =
             new LifecycleListener[listeners.length + 1];
           for (int i = 0; i < listeners.length; i++)
@@ -126,7 +128,7 @@
      */
     public void removeLifecycleListener(LifecycleListener listener) {
 
-        synchronized (listeners) {
+        synchronized (listenersLock) {
             int n = -1;
             for (int i = 0; i < listeners.length; i++) {
                 if (listeners[i] == listener) {

Modified: tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml?rev=771009&r1=771008&r2=771009&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Sun May  3 01:15:41 2009
@@ -40,6 +40,10 @@
         the JNDIRealm. Patch provided by Brandon DuRette. (markt)
       </fix>
       <fix>
+        <bug>46562</bug>: Close shtml files after processing to allow other
+        processes to modify the files. (markt)
+      </fix>
+      <fix>
         <bug>46815</bug>: Make the MemoryUserDatabase read-only by default.
         (markt)
       </fix>
@@ -70,8 +74,8 @@
         provided by Jens Kapitza. (markt)
       </update>
       <fix>
-        <bug>46562</bug>: Close shtml files after processing to allow other
-        processes to modify the files. (markt)
+        <bug>46990</bug>: Fix synchronization issues reported by FindBugs. 
Patch
+        provided by Sebb. (markt)
       </fix>
     </changelog>
   </subsection>



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

Reply via email to