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)