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