Repository: tapestry-5 Updated Branches: refs/heads/master 626af954f -> 932dda19a
Revert "Reset conduit states with only one access to PerthreadMap", I committed that by accident while reviewing This reverts commit a6604d83c12787f1a41dbe52fc53f5888de0b484. Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/932dda19 Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/932dda19 Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/932dda19 Branch: refs/heads/master Commit: 932dda19a822ab67274a9cc80f54440936556951 Parents: 626af95 Author: Jochen Kemnade <[email protected]> Authored: Mon Feb 16 15:45:22 2015 +0100 Committer: Jochen Kemnade <[email protected]> Committed: Mon Feb 16 15:45:22 2015 +0100 ---------------------------------------------------------------------- .../InternalComponentResourcesImpl.java | 50 ++++++++++++++------ .../internal/transform/ParameterConduit.java | 8 ++-- .../internal/transform/ParameterWorker.java | 24 ++++------ 3 files changed, 48 insertions(+), 34 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/932dda19/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java index 2081b20..886d773 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java @@ -30,7 +30,6 @@ import org.apache.tapestry5.ioc.internal.util.InternalUtils; import org.apache.tapestry5.ioc.internal.util.LockSupport; import org.apache.tapestry5.ioc.internal.util.TapestryException; import org.apache.tapestry5.ioc.services.PerThreadValue; -import org.apache.tapestry5.ioc.util.CaseInsensitiveMap; import org.apache.tapestry5.model.ComponentModel; import org.apache.tapestry5.runtime.Component; import org.apache.tapestry5.runtime.PageLifecycleCallbackHub; @@ -81,8 +80,8 @@ public class InternalComponentResourcesImpl extends LockSupport implements Inter // Maps from parameter name to ParameterConduit, used to support mixins // which need access to the containing component's PC's - private Map<String, ParameterConduit> conduits; - private PerThreadValue<Map<String, Object>> conduitStates; + // Guarded by: LockSupport + private NamedSet<ParameterConduit> conduits; // Guarded by: LockSupport private Messages messages; @@ -138,6 +137,14 @@ public class InternalComponentResourcesImpl extends LockSupport implements Inter } + private static Worker<ParameterConduit> RESET_PARAMETER_CONDUIT = new Worker<ParameterConduit>() + { + public void work(ParameterConduit value) + { + value.reset(); + } + }; + public InternalComponentResourcesImpl(Page page, ComponentPageElement element, ComponentResources containerResources, ComponentPageElementResources elementResources, String completeId, String nestedId, Instantiator componentInstantiator, boolean mixin) @@ -571,13 +578,7 @@ public class InternalComponentResourcesImpl extends LockSupport implements Inter if (variablesMap != null) variablesMap.clear(); - if (conduitStates != null) - { - Map<String, Object> conduidStatesMap = conduitStates.get(); - - if (conduidStatesMap != null) - conduidStatesMap.clear(); - } + resetParameterConduits(); } public void addPageLifecycleListener(PageLifecycleListener listener) @@ -595,9 +596,32 @@ public class InternalComponentResourcesImpl extends LockSupport implements Inter page.addResetListener(listener); } + private void resetParameterConduits() + { + try + { + acquireReadLock(); + + if (conduits != null) + { + conduits.eachValue(RESET_PARAMETER_CONDUIT); + } + } finally + { + releaseReadLock(); + } + } + public ParameterConduit getParameterConduit(String parameterName) { - return conduits.get(parameterName); + try + { + acquireReadLock(); + return NamedSet.get(conduits, parameterName); + } finally + { + releaseReadLock(); + } } public void setParameterConduit(String parameterName, ParameterConduit conduit) @@ -611,7 +635,6 @@ public class InternalComponentResourcesImpl extends LockSupport implements Inter createConduits(); } - conduit.init(conduitStates); conduits.put(parameterName, conduit); } finally { @@ -626,8 +649,7 @@ public class InternalComponentResourcesImpl extends LockSupport implements Inter upgradeReadLockToWriteLock(); if (conduits == null) { - conduits = CollectionFactory.newCaseInsensitiveMap(); - conduitStates = elementResources.createPerThreadValue(); + conduits = NamedSet.create(); } } finally { http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/932dda19/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterConduit.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterConduit.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterConduit.java index ab2bc37..e2a99a7 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterConduit.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterConduit.java @@ -14,12 +14,9 @@ package org.apache.tapestry5.internal.transform; -import java.util.Map; - import org.apache.tapestry5.Binding; import org.apache.tapestry5.annotations.Parameter; import org.apache.tapestry5.internal.InternalComponentResources; -import org.apache.tapestry5.ioc.services.PerThreadValue; import org.apache.tapestry5.ioc.services.TypeCoercer; import org.apache.tapestry5.plastic.FieldConduit; @@ -44,5 +41,8 @@ public interface ParameterConduit extends FieldConduit<Object> */ boolean isBound(); - void init(PerThreadValue conduitStates); + /** + * Resets the conduit, clearing any <em>temporarily</em> cached data (from a non-invariant {@link Binding}). + */ + void reset(); } http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/932dda19/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterWorker.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterWorker.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterWorker.java index 533aef0..9025fdc 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterWorker.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterWorker.java @@ -22,7 +22,6 @@ import org.apache.tapestry5.func.Predicate; import org.apache.tapestry5.internal.InternalComponentResources; import org.apache.tapestry5.internal.bindings.LiteralBinding; import org.apache.tapestry5.internal.services.ComponentClassCache; -import org.apache.tapestry5.ioc.internal.util.CollectionFactory; import org.apache.tapestry5.ioc.internal.util.InternalUtils; import org.apache.tapestry5.ioc.internal.util.TapestryException; import org.apache.tapestry5.ioc.services.PerThreadValue; @@ -39,7 +38,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Comparator; -import java.util.Map; /** * Responsible for identifying parameters via the {@link org.apache.tapestry5.annotations.Parameter} annotation on @@ -75,13 +73,16 @@ public class ParameterWorker implements ComponentClassTransformWorker2 private final TypeCoercer typeCoercer; + private final PerthreadManager perThreadManager; + public ParameterWorker(ComponentClassCache classCache, BindingSource bindingSource, - ComponentDefaultProvider defaultProvider, TypeCoercer typeCoercer) + ComponentDefaultProvider defaultProvider, TypeCoercer typeCoercer, PerthreadManager perThreadManager) { this.classCache = classCache; this.bindingSource = bindingSource; this.defaultProvider = defaultProvider; this.typeCoercer = typeCoercer; + this.perThreadManager = perThreadManager; } private final Comparator<PlasticField> byPrincipalThenName = new Comparator<PlasticField>() @@ -173,6 +174,8 @@ public class ParameterWorker implements ComponentClassTransformWorker2 final Class fieldType = classCache.forName(fieldTypeName); + final PerThreadValue<ParameterState> stateValue = perThreadManager.createValue(); + // Rely on some code generation in the component to set the default binding from // the field, or from a default method. @@ -189,8 +192,6 @@ public class ParameterWorker implements ComponentClassTransformWorker2 private boolean invariant = false; - PerThreadValue<Map<String, ParameterState>> states; - { // Inform the ComponentResources about the parameter conduit, so it can be // shared with mixins. @@ -207,18 +208,13 @@ public class ParameterWorker implements ComponentClassTransformWorker2 private ParameterState getState() { - Map<String, ParameterState> map = states.get(); - if (map == null) { - map = CollectionFactory.newMap(); - states.set(map); - } - ParameterState state = map.get(parameterName); + ParameterState state = stateValue.get(); if (state == null) { state = new ParameterState(); state.value = defaultValue; - map.put(parameterName, state); + stateValue.set(state); } return state; @@ -451,10 +447,6 @@ public class ParameterWorker implements ComponentClassTransformWorker2 parameterBinding = new LiteralBinding(null, "default " + parameterName, defaultValue); } - @Override - public void init(PerThreadValue threadLocalStorage) { - states = (PerThreadValue<Map<String, ParameterState>>)threadLocalStorage; - } }; }
