Author: ivaynberg Date: Tue Jun 29 16:47:56 2010 New Revision: 959026 URL: http://svn.apache.org/viewvc?rev=959026&view=rev Log: optimize access to mount map, making webrequestcodingstrategy more concurrent
Modified: wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/protocol/http/request/WebRequestCodingStrategy.java Modified: wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/protocol/http/request/WebRequestCodingStrategy.java URL: http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/protocol/http/request/WebRequestCodingStrategy.java?rev=959026&r1=959025&r2=959026&view=diff ============================================================================== --- wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/protocol/http/request/WebRequestCodingStrategy.java (original) +++ wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/protocol/http/request/WebRequestCodingStrategy.java Tue Jun 29 16:47:56 2010 @@ -21,8 +21,10 @@ import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.TreeMap; import java.util.Map.Entry; +import java.util.TreeMap; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; import org.apache.wicket.Application; import org.apache.wicket.Component; @@ -169,6 +171,7 @@ public class WebRequestCodingStrategy im * </p> */ private final MountsMap mountsOnPath; + private final ReadWriteLock mountsOnPathLock = new ReentrantReadWriteLock(); /** * Construct. @@ -402,11 +405,16 @@ public class WebRequestCodingStrategy im */ public IRequestTargetUrlCodingStrategy[] listMounts() { - synchronized (mountsOnPath) + try { + mountsOnPathLock.readLock().lock(); return mountsOnPath.strategies().toArray( new IRequestTargetUrlCodingStrategy[mountsOnPath.size()]); } + finally + { + mountsOnPathLock.readLock().unlock(); + } } /** @@ -414,8 +422,9 @@ public class WebRequestCodingStrategy im */ public IRequestTargetUrlCodingStrategy urlCodingStrategyForPath(String path) { - synchronized (mountsOnPath) + try { + mountsOnPathLock.readLock().lock(); if (path == null) { return mountsOnPath.strategyForMount(null); @@ -428,8 +437,13 @@ public class WebRequestCodingStrategy im return strategy; } } + return null; } - return null; + finally + { + mountsOnPathLock.readLock().unlock(); + } + } /** @@ -461,8 +475,9 @@ public class WebRequestCodingStrategy im path = path.substring(1); } - synchronized (mountsOnPath) + try { + mountsOnPathLock.writeLock().lock(); if (mountsOnPath.strategyForMount(path) != null) { throw new WicketRuntimeException(path + " is already mounted for " + @@ -470,6 +485,10 @@ public class WebRequestCodingStrategy im } mountsOnPath.mount(path, encoder); } + finally + { + mountsOnPathLock.writeLock().unlock(); + } } /** @@ -523,10 +542,15 @@ public class WebRequestCodingStrategy im path = path.substring(1); } - synchronized (mountsOnPath) + try { + mountsOnPathLock.writeLock().lock(); mountsOnPath.unmount(path); } + finally + { + mountsOnPathLock.writeLock().unlock(); + } } /** @@ -981,8 +1005,9 @@ public class WebRequestCodingStrategy im if (IActivePageBehaviorListener.INTERFACE.getName().equals(listenerName)) { - url.append(url.indexOf("?") > -1 ? "&" : "?").append( - IGNORE_IF_NOT_ACTIVE_PARAMETER_NAME).append("=true"); + url.append(url.indexOf("?") > -1 ? "&" : "?") + .append(IGNORE_IF_NOT_ACTIVE_PARAMETER_NAME) + .append("=true"); } return url; } @@ -1020,8 +1045,9 @@ public class WebRequestCodingStrategy im */ protected IRequestTargetUrlCodingStrategy getMountEncoder(IRequestTarget requestTarget) { - synchronized (mountsOnPath) + try { + mountsOnPathLock.readLock().lock(); // TODO Post 1.2: Performance: Optimize algorithm if possible and/ or // cache lookup results for (IRequestTargetUrlCodingStrategy encoder : mountsOnPath.strategies()) @@ -1032,6 +1058,10 @@ public class WebRequestCodingStrategy im } } } + finally + { + mountsOnPathLock.readLock().unlock(); + } return null; }