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();
}
/**