You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2011/09/14 22:37:14 UTC
svn commit: r1170840 -
/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java
Author: hlship
Date: Wed Sep 14 20:37:14 2011
New Revision: 1170840
URL: http://svn.apache.org/viewvc?rev=1170840&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/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java
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=1170840&r1=1170839&r2=1170840&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 Wed Sep 14 20:37:14 2011
@@ -161,7 +161,7 @@ public final class ComponentInstantiator
hub.addUpdateListener(this);
}
- public synchronized void checkForUpdates()
+ public void checkForUpdates()
{
if (changeTracker.containsChanges())
{
@@ -171,8 +171,7 @@ public final class ComponentInstantiator
public void objectWasInvalidated()
{
- changeTracker.clear();
- classToInstantiator.clear();
+ classLoaderLock.lock();
// Release the existing class pool, loader and so forth.
// Create a new one.
@@ -186,38 +185,55 @@ public final class ComponentInstantiator
*/
private void initializeService()
{
- PlasticManagerBuilder builder = PlasticManager.withClassLoader(parent).delegate(this)
- .packages(controlledPackageNames).classLoaderLock(classLoaderLock);
+ classLoaderLock.lock();
- if (!productionMode)
+ try
{
- builder.enable(TransformationOption.FIELD_WRITEBEHIND);
- }
- manager = builder.create();
+ PlasticManagerBuilder builder = PlasticManager.withClassLoader(parent).delegate(this)
+ .packages(controlledPackageNames).classLoaderLock(classLoaderLock);
+
+ if (!productionMode)
+ {
+ builder.enable(TransformationOption.FIELD_WRITEBEHIND);
+ }
- manager.addPlasticClassListener(this);
+ manager = builder.create();
- classFactory = new ClassFactoryImpl(manager.getClassLoader(), logger);
+ manager.addPlasticClassListener(this);
- proxyFactory = new PlasticProxyFactoryImpl(manager.getClassLoader(), logger, classLoaderLock);
+ classFactory = new ClassFactoryImpl(manager.getClassLoader(), logger);
- classToInstantiator.clear();
- classToModel.clear();
+ proxyFactory = new PlasticProxyFactoryImpl(manager.getClassLoader(), logger, classLoaderLock);
+
+ classToInstantiator.clear();
+ classToModel.clear();
+ } finally
+ {
+ classLoaderLock.unlock();
+ }
}
- public synchronized Instantiator getInstantiator(final String className)
+ public Instantiator getInstantiator(final String className)
{
- Instantiator result = classToInstantiator.get(className);
+ classLoaderLock.lock();
- if (result == null)
+ try
{
- result = createInstantiatorForClass(className);
+ Instantiator result = classToInstantiator.get(className);
- classToInstantiator.put(className, result);
- }
+ if (result == null)
+ {
+ result = createInstantiatorForClass(className);
+
+ classToInstantiator.put(className, result);
+ }
- return result;
+ return result;
+ } finally
+ {
+ classLoaderLock.unlock();
+ }
}
private Instantiator createInstantiatorForClass(final String className)