You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by jk...@apache.org on 2017/10/18 06:13:21 UTC

tapestry-5 git commit: reduce lock-contention during page loading #2

Repository: tapestry-5
Updated Branches:
  refs/heads/master 1c42cceef -> b58621fbf


reduce lock-contention during page loading #2


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

Branch: refs/heads/master
Commit: b58621fbf8a01e9f7fea2c19881b83f5d6de651f
Parents: 1c42cce
Author: Michael Mikhulya <m....@gmail.com>
Authored: Tue Jul 19 11:55:30 2016 +0300
Committer: Jochen Kemnade <jk...@apache.org>
Committed: Wed Oct 18 08:11:34 2017 +0200

----------------------------------------------------------------------
 .../internal/plastic/PlasticClassPool.java      | 63 ++++++++++----------
 .../internal/plastic/PlasticInternalUtils.java  |  7 +++
 2 files changed, 38 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/b58621fb/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java
----------------------------------------------------------------------
diff --git a/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java b/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java
index 3cf1700..dfbb8cf 100644
--- a/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java
+++ b/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java
@@ -56,7 +56,7 @@ public class PlasticClassPool implements ClassLoaderDelegate, Opcodes, PlasticCl
      * Maps class names to instantiators for that class name.
      * Synchronized on the loader.
      */
-    private final Map<String, ClassInstantiator> instantiators = PlasticInternalUtils.newMap();
+    private final Map<String, ClassInstantiator> instantiators = PlasticInternalUtils.newConcurrentMap();
 
     private final InheritanceData emptyInheritanceData = new InheritanceData(null);
 
@@ -599,50 +599,49 @@ public class PlasticClassPool implements ClassLoaderDelegate, Opcodes, PlasticCl
 
     public ClassInstantiator getClassInstantiator(String className)
     {
-        synchronized (loader)
+        ClassInstantiator result = instantiators.get(className);
+
+        if (result == null)
         {
-            if (!instantiators.containsKey(className))
+            try
             {
-                try
-                {
-                    loader.loadClass(className);
-                } catch (ClassNotFoundException ex)
-                {
-                    throw new RuntimeException(ex);
-                }
+                loader.loadClass(className);
+                result = instantiators.get(className);
+            } catch (ClassNotFoundException ex)
+            {
+                throw new RuntimeException(ex);
             }
+        }
 
-            ClassInstantiator result = instantiators.get(className);
 
-            if (result == null)
-            {
-                // TODO: Verify that the problem is incorrect package, and not any other failure.
+        if (result != null)
+        {
+            return result;
+        }
 
-                StringBuilder b = new StringBuilder();
-                b.append("Class '")
-                        .append(className)
-                        .append("' is not a transformed class. Transformed classes should be in one of the following packages: ");
+        // TODO: Verify that the problem is incorrect package, and not any other failure.
 
-                String sep = "";
+        StringBuilder b = new StringBuilder();
+        b.append("Class '")
+                .append(className)
+                .append("' is not a transformed class. Transformed classes should be in one of the following packages: ");
 
-                List<String> names = new ArrayList<String>(controlledPackages);
-                Collections.sort(names);
+        String sep = "";
 
-                for (String name : names)
-                {
-                    b.append(sep);
-                    b.append(name);
+        List<String> names = new ArrayList<String>(controlledPackages);
+        Collections.sort(names);
 
-                    sep = ", ";
-                }
+        for (String name : names)
+        {
+            b.append(sep);
+            b.append(name);
 
-                String message = b.append('.').toString();
+            sep = ", ";
+        }
 
-                throw new IllegalArgumentException(message);
-            }
+        String message = b.append('.').toString();
 
-            return result;
-        }
+        throw new IllegalArgumentException(message);
     }
 
     TypeCategory getTypeCategory(String typeName)

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/b58621fb/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticInternalUtils.java
----------------------------------------------------------------------
diff --git a/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticInternalUtils.java b/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticInternalUtils.java
index 8dc86a3..f0ea0fb 100644
--- a/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticInternalUtils.java
+++ b/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticInternalUtils.java
@@ -25,6 +25,8 @@ import java.lang.reflect.Array;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -196,6 +198,11 @@ public class PlasticInternalUtils
         return new HashMap<K, V>();
     }
 
+    public static <K, V> ConcurrentMap<K, V> newConcurrentMap()
+    {
+        return new ConcurrentHashMap<K, V>();
+    }
+
     public static <T> Set<T> newSet()
     {
         return new HashSet<T>();