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/16 01:11:28 UTC

svn commit: r1171321 - /tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java

Author: hlship
Date: Thu Sep 15 23:11:28 2011
New Revision: 1171321

URL: http://svn.apache.org/viewvc?rev=1171321&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 cec8f4ae4ddd776729f5a3a684b53b4fbb4dee15.

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=1171321&r1=1171320&r2=1171321&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:28 2011
@@ -161,7 +161,7 @@ public final class ComponentInstantiator
         hub.addUpdateListener(this);
     }
 
-    public void checkForUpdates()
+    public synchronized void checkForUpdates()
     {
         if (changeTracker.containsChanges())
         {
@@ -171,7 +171,8 @@ public final class ComponentInstantiator
 
     public void objectWasInvalidated()
     {
-        classLoaderLock.lock();
+        changeTracker.clear();
+        classToInstantiator.clear();
 
         // Release the existing class pool, loader and so forth.
         // Create a new one.
@@ -185,55 +186,38 @@ public final class ComponentInstantiator
      */
     private void initializeService()
     {
-        classLoaderLock.lock();
+        PlasticManagerBuilder builder = PlasticManager.withClassLoader(parent).delegate(this)
+                .packages(controlledPackageNames).classLoaderLock(classLoaderLock);
 
-        try
+        if (!productionMode)
         {
+            builder.enable(TransformationOption.FIELD_WRITEBEHIND);
+        }
 
-            PlasticManagerBuilder builder = PlasticManager.withClassLoader(parent).delegate(this)
-                    .packages(controlledPackageNames).classLoaderLock(classLoaderLock);
-
-            if (!productionMode)
-            {
-                builder.enable(TransformationOption.FIELD_WRITEBEHIND);
-            }
-
-            manager = builder.create();
+        manager = builder.create();
 
-            manager.addPlasticClassListener(this);
+        manager.addPlasticClassListener(this);
 
-            classFactory = new ClassFactoryImpl(manager.getClassLoader(), logger);
+        classFactory = new ClassFactoryImpl(manager.getClassLoader(), logger);
 
-            proxyFactory = new PlasticProxyFactoryImpl(manager.getClassLoader(), logger, classLoaderLock);
+        proxyFactory = new PlasticProxyFactoryImpl(manager.getClassLoader(), logger, classLoaderLock);
 
-            classToInstantiator.clear();
-            classToModel.clear();
-        } finally
-        {
-            classLoaderLock.unlock();
-        }
+        classToInstantiator.clear();
+        classToModel.clear();
     }
 
-    public Instantiator getInstantiator(final String className)
+    public synchronized Instantiator getInstantiator(final String className)
     {
-        classLoaderLock.lock();
+        Instantiator result = classToInstantiator.get(className);
 
-        try
+        if (result == null)
         {
-            Instantiator result = classToInstantiator.get(className);
+            result = createInstantiatorForClass(className);
 
-            if (result == null)
-            {
-                result = createInstantiatorForClass(className);
-
-                classToInstantiator.put(className, result);
-            }
-
-            return result;
-        } finally
-        {
-            classLoaderLock.unlock();
+            classToInstantiator.put(className, result);
         }
+
+        return result;
     }
 
     private Instantiator createInstantiatorForClass(final String className)