Reset conduit states with only one access to PerthreadMap

Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/a6604d83
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/a6604d83
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/a6604d83

Branch: refs/heads/master
Commit: a6604d83c12787f1a41dbe52fc53f5888de0b484
Parents: 097d0fe
Author: Michael Mikhulya <[email protected]>
Authored: Fri Jan 30 18:42:39 2015 +0300
Committer: Jochen Kemnade <[email protected]>
Committed: Mon Feb 16 12:18:25 2015 +0100

----------------------------------------------------------------------
 .../InternalComponentResourcesImpl.java         | 50 ++++++--------------
 .../internal/transform/ParameterConduit.java    |  8 ++--
 .../internal/transform/ParameterWorker.java     | 24 ++++++----
 3 files changed, 34 insertions(+), 48 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/a6604d83/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 886d773..2081b20 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,6 +30,7 @@ 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;
@@ -80,8 +81,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
-    // Guarded by: LockSupport
-    private NamedSet<ParameterConduit> conduits;
+    private Map<String, ParameterConduit> conduits;
+    private PerThreadValue<Map<String, Object>> conduitStates;
 
     // Guarded by: LockSupport
     private Messages messages;
@@ -137,14 +138,6 @@ 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)
@@ -578,7 +571,13 @@ public class InternalComponentResourcesImpl extends 
LockSupport implements Inter
         if (variablesMap != null)
             variablesMap.clear();
 
-        resetParameterConduits();
+        if (conduitStates != null)
+        {
+            Map<String, Object> conduidStatesMap = conduitStates.get();
+
+            if (conduidStatesMap != null)
+                conduidStatesMap.clear();
+        }
     }
 
     public void addPageLifecycleListener(PageLifecycleListener listener)
@@ -596,32 +595,9 @@ 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)
     {
-        try
-        {
-            acquireReadLock();
-            return NamedSet.get(conduits, parameterName);
-        } finally
-        {
-            releaseReadLock();
-        }
+        return conduits.get(parameterName);
     }
 
     public void setParameterConduit(String parameterName, ParameterConduit 
conduit)
@@ -635,6 +611,7 @@ public class InternalComponentResourcesImpl extends 
LockSupport implements Inter
                 createConduits();
             }
 
+            conduit.init(conduitStates);
             conduits.put(parameterName, conduit);
         } finally
         {
@@ -649,7 +626,8 @@ public class InternalComponentResourcesImpl extends 
LockSupport implements Inter
             upgradeReadLockToWriteLock();
             if (conduits == null)
             {
-                conduits = NamedSet.create();
+                conduits = CollectionFactory.newCaseInsensitiveMap();
+                conduitStates = elementResources.createPerThreadValue();
             }
         } finally
         {

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/a6604d83/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 e2a99a7..ab2bc37 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,9 +14,12 @@
 
 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;
 
@@ -41,8 +44,5 @@ public interface ParameterConduit extends FieldConduit<Object>
      */
     boolean isBound();
 
-    /**
-     * Resets the conduit, clearing any <em>temporarily</em> cached data (from 
a non-invariant {@link Binding}).
-     */
-    void reset();
+    void init(PerThreadValue conduitStates);
 }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/a6604d83/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 9025fdc..533aef0 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,6 +22,7 @@ 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;
@@ -38,6 +39,7 @@ 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
@@ -73,16 +75,13 @@ public class ParameterWorker implements 
ComponentClassTransformWorker2
 
     private final TypeCoercer typeCoercer;
 
-    private final PerthreadManager perThreadManager;
-
     public ParameterWorker(ComponentClassCache classCache, BindingSource 
bindingSource,
-                           ComponentDefaultProvider defaultProvider, 
TypeCoercer typeCoercer, PerthreadManager perThreadManager)
+                           ComponentDefaultProvider defaultProvider, 
TypeCoercer typeCoercer)
     {
         this.classCache = classCache;
         this.bindingSource = bindingSource;
         this.defaultProvider = defaultProvider;
         this.typeCoercer = typeCoercer;
-        this.perThreadManager = perThreadManager;
     }
 
     private final Comparator<PlasticField> byPrincipalThenName = new 
Comparator<PlasticField>()
@@ -174,8 +173,6 @@ 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.
 
@@ -192,6 +189,8 @@ 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.
@@ -208,13 +207,18 @@ public class ParameterWorker implements 
ComponentClassTransformWorker2
 
                     private ParameterState getState()
                     {
-                        ParameterState state = stateValue.get();
+                        Map<String, ParameterState> map = states.get();
+                        if (map == null) {
+                            map = CollectionFactory.newMap();
+                            states.set(map);
+                        }
+                        ParameterState state = map.get(parameterName);
 
                         if (state == null)
                         {
                             state = new ParameterState();
                             state.value = defaultValue;
-                            stateValue.set(state);
+                            map.put(parameterName, state);
                         }
 
                         return state;
@@ -447,6 +451,10 @@ public class ParameterWorker implements 
ComponentClassTransformWorker2
                         parameterBinding = new LiteralBinding(null, "default " 
+ parameterName, defaultValue);
                     }
 
+                    @Override
+                    public void init(PerThreadValue threadLocalStorage) {
+                        states = (PerThreadValue<Map<String, 
ParameterState>>)threadLocalStorage;
+                    }
 
                 };
             }

Reply via email to