You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2011/09/14 20:45:31 UTC

svn commit: r1170766 - /tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticManager.java

Author: hlship
Date: Wed Sep 14 18:45:31 2011
New Revision: 1170766

URL: http://svn.apache.org/viewvc?rev=1170766&view=rev
Log:
TAP5-1650: On a cold start with a large number of incoming requests, Tapestry can deadlock inside PlasticClassLoader/PlasticClassPool

Modified:
    tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticManager.java

Modified: tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticManager.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticManager.java?rev=1170766&r1=1170765&r2=1170766&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticManager.java (original)
+++ tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticManager.java Wed Sep 14 18:45:31 2011
@@ -204,11 +204,20 @@ public class PlasticManager implements P
 
         String name = String.format("$%s_%s", baseClass.getSimpleName(), PlasticUtils.nextUID());
 
-        PlasticClassTransformation<T> transformation = pool.createTransformation(baseClass.getName(), name);
+        lock();
 
-        callback.transform(transformation.getPlasticClass());
+        try
+        {
 
-        return transformation.createInstantiator();
+            PlasticClassTransformation<T> transformation = pool.createTransformation(baseClass.getName(), name);
+
+            callback.transform(transformation.getPlasticClass());
+
+            return transformation.createInstantiator();
+        } finally
+        {
+            unlock();
+        }
     }
 
     /**
@@ -223,11 +232,29 @@ public class PlasticManager implements P
     {
         assert callback != null;
 
-        PlasticClassTransformation<T> transformation = createProxyTransformation(interfaceType);
+        lock();
+
+        try
+        {
+            PlasticClassTransformation<T> transformation = createProxyTransformation(interfaceType);
 
-        callback.transform(transformation.getPlasticClass());
+            callback.transform(transformation.getPlasticClass());
+
+            return transformation.createInstantiator();
+        } finally
+        {
+            unlock();
+        }
+    }
 
-        return transformation.createInstantiator();
+    private void unlock()
+    {
+        getClassloaderLock().unlock();
+    }
+
+    private void lock()
+    {
+        getClassloaderLock().lock();
     }
 
     /**