You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2014/08/05 17:15:00 UTC
svn commit: r1615942 - in /tomcat/trunk:
java/org/apache/catalina/core/ContainerBase.java
java/org/apache/catalina/core/StandardContext.java webapps/docs/changelog.xml
Author: markt
Date: Tue Aug 5 15:15:00 2014
New Revision: 1615942
URL: http://svn.apache.org/r1615942
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=56784
Fix a couple of rare but theoretically possible atomicity bugs.
Modified:
tomcat/trunk/java/org/apache/catalina/core/ContainerBase.java
tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
tomcat/trunk/webapps/docs/changelog.xml
Modified: tomcat/trunk/java/org/apache/catalina/core/ContainerBase.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/ContainerBase.java?rev=1615942&r1=1615941&r2=1615942&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/ContainerBase.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/ContainerBase.java Tue Aug 5 15:15:00 2014
@@ -1267,16 +1267,15 @@ public abstract class ContainerBase exte
}
public ObjectName[] getChildren() {
- ObjectName result[]=new ObjectName[children.size()];
- Iterator<Container> it=children.values().iterator();
- int i=0;
- while( it.hasNext() ) {
- Object next=it.next();
- if( next instanceof ContainerBase ) {
- result[i++]=((ContainerBase)next).getObjectName();
+ List<ObjectName> names = new ArrayList<>(children.size());
+ Iterator<Container> it = children.values().iterator();
+ while (it.hasNext()) {
+ Object next = it.next();
+ if (next instanceof ContainerBase) {
+ names.add(((ContainerBase)next).getObjectName());
}
}
- return result;
+ return names.toArray(new ObjectName[names.size()]);
}
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=1615942&r1=1615941&r2=1615942&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardContext.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardContext.java Tue Aug 5 15:15:00 2014
@@ -41,6 +41,7 @@ import java.util.Map.Entry;
import java.util.Set;
import java.util.Stack;
import java.util.TreeMap;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
@@ -469,7 +470,7 @@ public class StandardContext extends Con
* The context initialization parameters for this web application,
* keyed by name.
*/
- private HashMap<String, String> parameters = new HashMap<>();
+ private final ConcurrentHashMap<String, String> parameters = new ConcurrentHashMap<>();
/**
@@ -3009,19 +3010,20 @@ public class StandardContext extends Con
@Override
public void addParameter(String name, String value) {
// Validate the proposed context initialization parameter
- if ((name == null) || (value == null))
+ if ((name == null) || (value == null)) {
throw new IllegalArgumentException
(sm.getString("standardContext.parameter.required"));
- if (parameters.get(name) != null)
- throw new IllegalArgumentException
- (sm.getString("standardContext.parameter.duplicate", name));
+ }
- // Add this parameter to our defined set
- synchronized (parameters) {
- parameters.put(name, value);
+ // Add this parameter to our defined set if not already present
+ String oldValue = parameters.putIfAbsent(name, value);
+
+ if (oldValue != null) {
+ throw new IllegalArgumentException(
+ sm.getString("standardContext.parameter.duplicate", name));
}
- fireContainerEvent("addParameter", name);
+ fireContainerEvent("addParameter", name);
}
@@ -3515,11 +3517,7 @@ public class StandardContext extends Con
*/
@Override
public String findParameter(String name) {
-
- synchronized (parameters) {
- return (parameters.get(name));
- }
-
+ return parameters.get(name);
}
@@ -3530,12 +3528,9 @@ public class StandardContext extends Con
*/
@Override
public String[] findParameters() {
-
- synchronized (parameters) {
- String results[] = new String[parameters.size()];
- return (parameters.keySet().toArray(results));
- }
-
+ List<String> parameterNames = new ArrayList<>(parameters.size());
+ parameterNames.addAll(parameters.keySet());
+ return parameterNames.toArray(new String[parameterNames.size()]);
}
@@ -4079,12 +4074,8 @@ public class StandardContext extends Con
*/
@Override
public void removeParameter(String name) {
-
- synchronized (parameters) {
- parameters.remove(name);
- }
+ parameters.remove(name);
fireContainerEvent("removeParameter", name);
-
}
Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1615942&r1=1615941&r2=1615942&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Tue Aug 5 15:15:00 2014
@@ -81,6 +81,10 @@
Cédric Couralet. (markt)
</fix>
<fix>
+ <bug>56784</bug>: Fix a couple of rare but theoretically possible
+ atomicity bugs. (markt)
+ </fix>
+ <fix>
<bug>56785</bug>: Avoid <code>NullPointerException</code> if directory
exists on the class path that is not readable by the Tomcat user.
(markt)
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org