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/16 01:11:44 UTC
svn commit: r1171324 - in /tapestry/tapestry5/trunk:
plastic/src/main/java/org/apache/tapestry5/internal/plastic/
plastic/src/main/java/org/apache/tapestry5/plastic/
tapestry-core/src/main/java/org/apache/tapestry5/internal/services/
Author: hlship
Date: Thu Sep 15 23:11:43 2011
New Revision: 1171324
URL: http://svn.apache.org/viewvc?rev=1171324&view=rev
Log:
Revert "TAP5-1650: On a cold start with a large number of incoming requests, Tapestry can deadlock inside PlasticClassLoader/PlasticClassPool"
This reverts commit c0589deb1530f51567c19dfa5ebe59fcf465bb28.
Modified:
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticManager.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java
Modified: tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java?rev=1171324&r1=1171323&r2=1171324&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java (original)
+++ tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java Thu Sep 15 23:11:43 2011
@@ -25,7 +25,6 @@ import java.lang.annotation.Annotation;
import java.lang.reflect.Modifier;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.locks.Lock;
/**
* Responsible for managing a class loader that allows ASM {@link ClassNode}s
@@ -59,11 +58,6 @@ public class PlasticClassPool implements
}
};
- public Lock getClassLoaderLock()
- {
- return loader.classloaderLock;
- }
-
static class BaseClassDef
{
final InheritanceData inheritanceData;
@@ -401,7 +395,7 @@ public class PlasticClassPool implements
}
}
- public ClassInstantiator getClassInstantiator(String className)
+ public synchronized ClassInstantiator getClassInstantiator(String className)
{
ClassInstantiator result;
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=1171324&r1=1171323&r2=1171324&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 Thu Sep 15 23:11:43 2011
@@ -14,16 +14,15 @@
package org.apache.tapestry5.plastic;
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.Set;
+
import org.apache.tapestry5.internal.plastic.Lockable;
import org.apache.tapestry5.internal.plastic.NoopDelegate;
import org.apache.tapestry5.internal.plastic.PlasticClassPool;
import org.apache.tapestry5.internal.plastic.PlasticInternalUtils;
-import java.util.Collection;
-import java.util.EnumSet;
-import java.util.Set;
-import java.util.concurrent.locks.Lock;
-
/**
* Manages the internal class loaders and other logics necessary to load and transform existing classes,
* or to create new classes dynamically at runtime. New instances are instantiates using
@@ -97,7 +96,7 @@ public class PlasticManager implements P
/**
* Creates the PlasticManager with the current set of options.
- *
+ *
* @return the PlasticManager
*/
public PlasticManager create()
@@ -116,9 +115,7 @@ public class PlasticManager implements P
return withClassLoader(Thread.currentThread().getContextClassLoader());
}
- /**
- * Creates a new builder using the specified class loader.
- */
+ /** Creates a new builder using the specified class loader. */
public static PlasticManagerBuilder withClassLoader(ClassLoader loader)
{
return new PlasticManagerBuilder(loader);
@@ -127,15 +124,19 @@ public class PlasticManager implements P
/**
* The standard constructor for PlasticManager, allowing a parent class loader to be specified (this is most often
* the thread's contextClassLoader), as well as the delegate and the names of all controlled packages.
- *
- * @param parentClassLoader main source for (untransformed) classes
- * @param delegate performs transformations on top-level classes from controlled packages
- * @param controlledPackageNames defines the packages that are to be transformed; top-classes in these packages
- * (or sub-packages) will be passed to the delegate for transformation
- * @param options used when transforming classes
+ *
+ * @param parentClassLoader
+ * main source for (untransformed) classes
+ * @param delegate
+ * performs transformations on top-level classes from controlled packages
+ * @param controlledPackageNames
+ * defines the packages that are to be transformed; top-classes in these packages
+ * (or sub-packages) will be passed to the delegate for transformation
+ * @param options
+ * used when transforming classes
*/
private PlasticManager(ClassLoader parentClassLoader, PlasticManagerDelegate delegate,
- Set<String> controlledPackageNames, Set<TransformationOption> options)
+ Set<String> controlledPackageNames, Set<TransformationOption> options)
{
assert parentClassLoader != null;
assert delegate != null;
@@ -148,7 +149,7 @@ public class PlasticManager implements P
* Returns the ClassLoader that is used to instantiate transformed classes. The parent class loader
* of the returned class loader is the context class loader, or the class loader specified by
* {@link #withClassLoader(ClassLoader)}.
- *
+ *
* @return class loader used to load classes in controlled packages
*/
public ClassLoader getClassLoader()
@@ -162,7 +163,7 @@ public class PlasticManager implements P
* PlasticClassTransformation.
* TODO: This may make a kind of callback when we get to proxy creation, rather then pure transformation.
* TODO: Clean up this mess!
- *
+ *
* @throws ClassNotFoundException
*/
<T> PlasticClassTransformation<T> getPlasticClass(String className) throws ClassNotFoundException
@@ -174,12 +175,14 @@ public class PlasticManager implements P
/**
* Gets the {@link ClassInstantiator} for the indicated class, which must be in a transformed package.
- *
- * @param className fully qualified class name
+ *
+ * @param className
+ * fully qualified class name
* @return instantiator (configured via the
* {@linkplain PlasticManagerDelegate#configureInstantiator(String, ClassInstantiator) delegate} for the
* class
- * @throws IllegalArgumentException if the class is not a transformed class
+ * @throws IllegalArgumentException
+ * if the class is not a transformed class
*/
public <T> ClassInstantiator<T> getClassInstantiator(String className)
{
@@ -188,9 +191,11 @@ public class PlasticManager implements P
/**
* Creates an entirely new class, extending from the provided base class.
- *
- * @param baseClass class to extend from, which must be a class, not an interface
- * @param callback used to configure the new class
+ *
+ * @param baseClass
+ * class to extend from, which must be a class, not an interface
+ * @param callback
+ * used to configure the new class
* @return the instantiator, which allows instances of the new class to be created
*/
public <T> ClassInstantiator<T> createClass(Class<T> baseClass, PlasticClassTransformer callback)
@@ -213,9 +218,11 @@ public class PlasticManager implements P
/**
* Creates an entirely new class. The class extends from Object and implements the provided interface.
- *
- * @param interfaceType class to extend from, which must be a class, not an interface
- * @param callback used to configure the new class
+ *
+ * @param interfaceType
+ * class to extend from, which must be a class, not an interface
+ * @param callback
+ * used to configure the new class
* @return the instantiator, which allows instances of the new class to be created
* @see #createProxyTransformation(Class)
*/
@@ -234,8 +241,9 @@ public class PlasticManager implements P
* Creates the underlying {@link PlasticClassTransformation} for an interface proxy. This should only be
* used in the cases where encapsulating the PlasticClass construction into a {@linkplain PlasticClassTransformer
* callback} is not feasible (which is the case for some of the older APIs inside Tapestry IoC).
- *
- * @param interfaceType class proxy will extend from
+ *
+ * @param interfaceType
+ * class proxy will extend from
* @return transformation from which an instantiator may be created
*/
public <T> PlasticClassTransformation<T> createProxyTransformation(Class interfaceType)
@@ -265,13 +273,4 @@ public class PlasticManager implements P
{
pool.removePlasticClassListener(listener);
}
-
- /**
- * Returns a {@link Lock} that can be used to ensure synchronization with the manager's class loading and
- * class transformation.
- */
- public Lock getClassloaderLock()
- {
- return pool.getClassLoaderLock();
- }
}
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java?rev=1171324&r1=1171323&r2=1171324&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java Thu Sep 15 23:11:43 2011
@@ -53,7 +53,6 @@ import org.slf4j.Logger;
import java.util.Map;
import java.util.Set;
-import java.util.concurrent.locks.Lock;
/**
* A wrapper around a {@link PlasticManager} that allows certain classes to be modified as they are loaded.
@@ -226,19 +225,8 @@ public final class ComponentInstantiator
// Force the creation of the class (and the transformation of the class). This will first
// trigger transformations of any base classes.
- final ClassInstantiator<Component> plasticInstantiator;
-
- Lock lock = manager.getClassloaderLock();
-
- lock.lock();
-
- try
- {
- plasticInstantiator = manager.getClassInstantiator(className);
- } finally
- {
- lock.unlock();
- }
+ final ClassInstantiator<Component> plasticInstantiator = manager
+ .getClassInstantiator(className);
final ComponentModel model = classToModel.get(className);