Author: markt
Date: Wed Apr 8 16:08:42 2009
New Revision: 763298
URL: http://svn.apache.org/viewvc?rev=763298&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=46990
Various sync issues.
Modified:
tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
tomcat/trunk/java/org/apache/catalina/core/StandardHost.java
tomcat/trunk/java/org/apache/catalina/tribes/membership/Membership.java
tomcat/trunk/java/org/apache/catalina/util/InstanceSupport.java
tomcat/trunk/java/org/apache/catalina/util/LifecycleSupport.java
Modified: tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardContext.java?rev=763298&r1=763297&r2=763298&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardContext.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardContext.java Wed Apr 8
16:08:42 2009
@@ -201,6 +201,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();
/**
@@ -223,6 +225,8 @@
private ApplicationParameter applicationParameters[] =
new ApplicationParameter[0];
+ private final Object applicationParametersLock = new Object();
+
/**
* The application available flag for this Context.
@@ -263,6 +267,8 @@
* The security constraints for this web application.
*/
private SecurityConstraint constraints[] = new SecurityConstraint[0];
+
+ private final Object constraintsLock = new Object();
/**
@@ -364,6 +370,9 @@
* defined in the deployment descriptor.
*/
private FilterMap filterMaps[] = new FilterMap[0];
+
+ private final Object filterMapsLock = new Object();
+
/**
* Filter mappings added via {...@link ServletContext} may have to be
inserted
@@ -388,6 +397,8 @@
*/
private String instanceListeners[] = new String[0];
+ private final Object instanceListenersLock = new Object();
+
/**
* The login configuration descriptor for this web application.
@@ -508,6 +519,8 @@
*/
private String securityRoles[] = new String[0];
+ private final Object securityRolesLock = new Object();
+
/**
* The servlet mappings for this web application, keyed by
@@ -515,6 +528,8 @@
*/
private HashMap<String, String> servletMappings =
new HashMap<String, String>();
+
+ private final Object servletMappingsLock = new Object();
/**
@@ -559,12 +574,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
@@ -572,6 +591,7 @@
*/
private String wrapperLifecycles[] = new String[0];
+ private final Object wrapperLifecyclesLock = new Object();
/**
* The set of classnames of ContainerListeners that will be added
@@ -579,6 +599,7 @@
*/
private String wrapperListeners[] = new String[0];
+ private final Object wrapperListenersLock = new Object();
/**
* The pathname to the work directory for this context (relative to
@@ -2021,7 +2042,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])) {
@@ -2048,7 +2069,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()) &&
@@ -2145,7 +2166,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++)
@@ -2231,7 +2252,7 @@
validateFilterMap(filterMap);
// Add this filter mapping to our registered set
- synchronized (filterMaps) {
+ synchronized (filterMapsLock) {
FilterMap results[] =new FilterMap[filterMaps.length + 1];
System.arraycopy(filterMaps, 0, results, 0, filterMaps.length);
results[filterMaps.length] = filterMap;
@@ -2256,7 +2277,7 @@
validateFilterMap(filterMap);
// Add this filter mapping to our registered set
- synchronized (filterMaps) {
+ synchronized (filterMapsLock) {
FilterMap results[] = new FilterMap[filterMaps.length + 1];
System.arraycopy(filterMaps, 0, results, 0, filterMapInsertPoint);
results[filterMapInsertPoint] = filterMap;
@@ -2313,7 +2334,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];
@@ -2456,7 +2477,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];
@@ -2507,7 +2528,7 @@
(sm.getString("standardContext.servletMap.pattern", pattern));
// Add this mapping to our registered set
- synchronized (servletMappings) {
+ synchronized (servletMappingsLock) {
String name2 = servletMappings.get(pattern);
if (name2 != null) {
// Don't allow more than one servlet on the same pattern
@@ -2551,7 +2572,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];
@@ -2570,7 +2591,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) {
@@ -2597,7 +2618,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];
@@ -2617,7 +2638,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];
@@ -2649,7 +2670,7 @@
wrapper = new StandardWrapper();
}
- synchronized (instanceListeners) {
+ synchronized (instanceListenersLock) {
for (int i = 0; i < instanceListeners.length; i++) {
try {
Class<?> clazz = Class.forName(instanceListeners[i]);
@@ -2663,7 +2684,7 @@
}
}
- synchronized (wrapperLifecycles) {
+ synchronized (wrapperLifecyclesLock) {
for (int i = 0; i < wrapperLifecycles.length; i++) {
try {
Class<?> clazz = Class.forName(wrapperLifecycles[i]);
@@ -2678,7 +2699,7 @@
}
}
- synchronized (wrapperListeners) {
+ synchronized (wrapperListenersLock) {
for (int i = 0; i < wrapperListeners.length; i++) {
try {
Class<?> clazz = Class.forName(wrapperListeners[i]);
@@ -2713,7 +2734,9 @@
*/
public ApplicationParameter[] findApplicationParameters() {
- return (applicationParameters);
+ synchronized (applicationParametersLock) {
+ return (applicationParameters);
+ }
}
@@ -2829,7 +2852,9 @@
*/
public String[] findInstanceListeners() {
- return (instanceListeners);
+ synchronized (instanceListenersLock) {
+ return (instanceListeners);
+ }
}
@@ -2987,7 +3012,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);
@@ -3004,7 +3029,9 @@
*/
public String[] findSecurityRoles() {
- return (securityRoles);
+ synchronized (securityRolesLock) {
+ return (securityRoles);
+ }
}
@@ -3017,7 +3044,7 @@
*/
public String findServletMapping(String pattern) {
- synchronized (servletMappings) {
+ synchronized (servletMappingsLock) {
return (servletMappings.get(pattern));
}
@@ -3030,7 +3057,7 @@
*/
public String[] findServletMappings() {
- synchronized (servletMappings) {
+ synchronized (servletMappingsLock) {
String results[] = new String[servletMappings.size()];
return
(servletMappings.keySet().toArray(results));
@@ -3113,7 +3140,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);
@@ -3129,7 +3156,9 @@
* defined, a zero length array will be returned.
*/
public String[] findWatchedResources() {
- return watchedResources;
+ synchronized (watchedResourcesLock) {
+ return watchedResources;
+ }
}
@@ -3139,7 +3168,9 @@
*/
public String[] findWelcomeFiles() {
- return (welcomeFiles);
+ synchronized (welcomeFilesLock) {
+ return (welcomeFiles);
+ }
}
@@ -3150,7 +3181,9 @@
*/
public String[] findWrapperLifecycles() {
- return (wrapperLifecycles);
+ synchronized (wrapperLifecyclesLock) {
+ return (wrapperLifecycles);
+ }
}
@@ -3161,7 +3194,9 @@
*/
public String[] findWrapperListeners() {
- return (wrapperListeners);
+ synchronized (wrapperListenersLock) {
+ return (wrapperListeners);
+ }
}
@@ -3220,7 +3255,7 @@
*/
public void removeApplicationListener(String listener) {
- synchronized (applicationListeners) {
+ synchronized (applicationListenersLock) {
// Make sure this welcome file is currently present
int n = -1;
@@ -3260,7 +3295,7 @@
*/
public void removeApplicationParameter(String name) {
- synchronized (applicationParameters) {
+ synchronized (applicationParametersLock) {
// Make sure this parameter is currently present
int n = -1;
@@ -3319,7 +3354,7 @@
*/
public void removeConstraint(SecurityConstraint constraint) {
- synchronized (constraints) {
+ synchronized (constraintsLock) {
// Make sure this constraint is currently present
int n = -1;
@@ -3399,7 +3434,7 @@
*/
public void removeFilterMap(FilterMap filterMap) {
- synchronized (filterMaps) {
+ synchronized (filterMapsLock) {
// Make sure this filter mapping is currently present
int n = -1;
@@ -3438,7 +3473,7 @@
*/
public void removeInstanceListener(String listener) {
- synchronized (instanceListeners) {
+ synchronized (instanceListenersLock) {
// Make sure this welcome file is currently present
int n = -1;
@@ -3550,7 +3585,7 @@
*/
public void removeSecurityRole(String role) {
- synchronized (securityRoles) {
+ synchronized (securityRolesLock) {
// Make sure this security role is currently present
int n = -1;
@@ -3589,7 +3624,7 @@
public void removeServletMapping(String pattern) {
String name = null;
- synchronized (servletMappings) {
+ synchronized (servletMappingsLock) {
name = servletMappings.remove(pattern);
}
Wrapper wrapper = (Wrapper) findChild(name);
@@ -3624,7 +3659,7 @@
*/
public void removeWatchedResource(String name) {
- synchronized (watchedResources) {
+ synchronized (watchedResourcesLock) {
// Make sure this watched resource is currently present
int n = -1;
@@ -3661,7 +3696,7 @@
*/
public void removeWelcomeFile(String name) {
- synchronized (welcomeFiles) {
+ synchronized (welcomeFilesLock) {
// Make sure this welcome file is currently present
int n = -1;
@@ -3701,7 +3736,7 @@
public void removeWrapperLifecycle(String listener) {
- synchronized (wrapperLifecycles) {
+ synchronized (wrapperLifecyclesLock) {
// Make sure this welcome file is currently present
int n = -1;
@@ -3740,7 +3775,7 @@
public void removeWrapperListener(String listener) {
- synchronized (wrapperListeners) {
+ synchronized (wrapperListenersLock) {
// Make sure this welcome file is currently present
int n = -1;
@@ -4701,7 +4736,9 @@
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(DESTROY_EVENT, null);
- instanceListeners = new String[0];
+ synchronized (instanceListenersLock) {
+ instanceListeners = new String[0];
+ }
}
Modified: tomcat/trunk/java/org/apache/catalina/core/StandardHost.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardHost.java?rev=763298&r1=763297&r2=763298&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardHost.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardHost.java Wed Apr 8
16:08:42 2009
@@ -72,6 +72,8 @@
* The set of aliases for this Host.
*/
private String[] aliases = new String[0];
+
+ private final Object aliasesLock = new Object();
/**
@@ -514,20 +516,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);
@@ -556,7 +557,9 @@
*/
public String[] findAliases() {
- return (this.aliases);
+ synchronized (aliasesLock) {
+ return (this.aliases);
+ }
}
@@ -631,7 +634,7 @@
alias = alias.toLowerCase();
- synchronized (aliases) {
+ synchronized (aliasesLock) {
// Make sure this alias is currently present
int n = -1;
@@ -766,7 +769,9 @@
}
public String[] getAliases() {
- return aliases;
+ synchronized (aliasesLock) {
+ return aliases;
+ }
}
private boolean initialized=false;
Modified:
tomcat/trunk/java/org/apache/catalina/tribes/membership/Membership.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/tribes/membership/Membership.java?rev=763298&r1=763297&r2=763298&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/tribes/membership/Membership.java
(original)
+++ tomcat/trunk/java/org/apache/catalina/tribes/membership/Membership.java Wed
Apr 8 16:08:42 2009
@@ -41,6 +41,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
@@ -63,7 +65,7 @@
protected Comparator<Member> memberComparator = new MemberComparator();
public Object clone() {
- synchronized (members) {
+ synchronized (membersLock) {
Membership clone = new Membership(local, memberComparator);
clone.map = (HashMap<MemberImpl, MbrEntry>) map.clone();
clone.members = new MemberImpl[members.length];
@@ -139,7 +141,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);
@@ -160,7 +162,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/trunk/java/org/apache/catalina/util/InstanceSupport.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/util/InstanceSupport.java?rev=763298&r1=763297&r2=763298&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/util/InstanceSupport.java (original)
+++ tomcat/trunk/java/org/apache/catalina/util/InstanceSupport.java Wed Apr 8
16:08:42 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/trunk/java/org/apache/catalina/util/LifecycleSupport.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/util/LifecycleSupport.java?rev=763298&r1=763297&r2=763298&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/util/LifecycleSupport.java (original)
+++ tomcat/trunk/java/org/apache/catalina/util/LifecycleSupport.java Wed Apr 8
16:08:42 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) {
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org