Author: markt
Date: Fri Oct 28 15:11:14 2011
New Revision: 1190389

URL: http://svn.apache.org/viewvc?rev=1190389&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=52091
Address performance issues related to lock contention in StandardWrapper
Patch provided by Taiki Sugawara.

Modified:
    tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java

Modified: tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java?rev=1190389&r1=1190388&r2=1190389&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java Fri Oct 28 
15:11:14 2011
@@ -26,6 +26,7 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Stack;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 import javax.management.ListenerNotFoundException;
 import javax.management.MBeanNotificationInfo;
@@ -275,6 +276,15 @@ public class StandardWrapper extends Con
      */
     protected static Class<?>[] classType = new Class[]{ServletConfig.class};
 
+    private final ReentrantReadWriteLock parametersLock =
+            new ReentrantReadWriteLock();
+
+    private final ReentrantReadWriteLock mappingsLock =
+            new ReentrantReadWriteLock();
+
+    private final ReentrantReadWriteLock referencesLock =
+            new ReentrantReadWriteLock();
+
 
     // ------------------------------------------------------------- Properties
 
@@ -712,8 +722,11 @@ public class StandardWrapper extends Con
     @Override
     public void addInitParameter(String name, String value) {
 
-        synchronized (parameters) {
+        try {
+            parametersLock.writeLock().lock();
             parameters.put(name, value);
+        } finally {
+            parametersLock.writeLock().unlock();
         }
         fireContainerEvent("addInitParameter", name);
 
@@ -741,8 +754,11 @@ public class StandardWrapper extends Con
     @Override
     public void addMapping(String mapping) {
 
-        synchronized (mappings) {
+        try {
+            mappingsLock.writeLock().lock();
             mappings.add(mapping);
+        } finally {
+            mappingsLock.writeLock().unlock();
         }
         if(parent.getState().equals(LifecycleState.STARTED))
             fireContainerEvent(ADD_MAPPING_EVENT, mapping);
@@ -760,8 +776,11 @@ public class StandardWrapper extends Con
     @Override
     public void addSecurityReference(String name, String link) {
 
-        synchronized (references) {
+        try {
+            referencesLock.writeLock().lock();
             references.put(name, link);
+        } finally {
+            referencesLock.writeLock().unlock();
         }
         fireContainerEvent("addSecurityReference", name);
 
@@ -916,8 +935,11 @@ public class StandardWrapper extends Con
     @Override
     public String findInitParameter(String name) {
 
-        synchronized (parameters) {
+        try {
+            parametersLock.readLock().lock();
             return parameters.get(name);
+        } finally {
+            parametersLock.readLock().unlock();
         }
 
     }
@@ -930,9 +952,12 @@ public class StandardWrapper extends Con
     @Override
     public String[] findInitParameters() {
 
-        synchronized (parameters) {
+        try {
+            parametersLock.readLock().lock();
             String results[] = new String[parameters.size()];
             return parameters.keySet().toArray(results);
+        } finally {
+            parametersLock.readLock().unlock();
         }
 
     }
@@ -944,8 +969,11 @@ public class StandardWrapper extends Con
     @Override
     public String[] findMappings() {
 
-        synchronized (mappings) {
+        try {
+            mappingsLock.readLock().lock();
             return mappings.toArray(new String[mappings.size()]);
+        } finally {
+            mappingsLock.readLock().unlock();
         }
 
     }
@@ -960,8 +988,11 @@ public class StandardWrapper extends Con
     @Override
     public String findSecurityReference(String name) {
 
-        synchronized (references) {
+        try {
+            referencesLock.readLock().lock();
             return references.get(name);
+        } finally {
+            referencesLock.readLock().unlock();
         }
 
     }
@@ -974,9 +1005,12 @@ public class StandardWrapper extends Con
     @Override
     public String[] findSecurityReferences() {
 
-        synchronized (references) {
+        try {
+            referencesLock.readLock().lock();
             String results[] = new String[references.size()];
             return references.keySet().toArray(results);
+        } finally {
+            referencesLock.readLock().unlock();
         }
 
     }
@@ -1224,8 +1258,11 @@ public class StandardWrapper extends Con
     @Override
     public void removeInitParameter(String name) {
 
-        synchronized (parameters) {
+        try {
+            parametersLock.writeLock().lock();
             parameters.remove(name);
+        } finally {
+            parametersLock.writeLock().unlock();
         }
         fireContainerEvent("removeInitParameter", name);
 
@@ -1253,8 +1290,11 @@ public class StandardWrapper extends Con
     @Override
     public void removeMapping(String mapping) {
 
-        synchronized (mappings) {
+        try {
+            mappingsLock.writeLock().lock();
             mappings.remove(mapping);
+        } finally {
+            mappingsLock.writeLock().unlock();
         }
         if(parent.getState().equals(LifecycleState.STARTED))
             fireContainerEvent(REMOVE_MAPPING_EVENT, mapping);
@@ -1270,8 +1310,11 @@ public class StandardWrapper extends Con
     @Override
     public void removeSecurityReference(String name) {
 
-        synchronized (references) {
+        try {
+            referencesLock.writeLock().lock();
             references.remove(name);
+        } finally {
+            referencesLock.writeLock().unlock();
         }
         fireContainerEvent("removeSecurityReference", name);
 
@@ -1481,8 +1524,11 @@ public class StandardWrapper extends Con
     @Override
     public Enumeration<String> getInitParameterNames() {
 
-        synchronized (parameters) {
+        try {
+            parametersLock.readLock().lock();
             return (new Enumerator<String>(parameters.keySet()));
+        } finally {
+            parametersLock.readLock().unlock();
         }
 
     }



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

Reply via email to