Author: hlship
Date: Fri Oct  7 18:40:52 2011
New Revision: 1180143

URL: http://svn.apache.org/viewvc?rev=1180143&view=rev
Log:
TAP5-1650: Apply patch to minimize (but not fully remove) class-loader related 
deadlocks

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=1180143&r1=1180142&r2=1180143&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
 Fri Oct  7 18:40:52 2011
@@ -82,11 +82,11 @@ public final class ComponentInstantiator
 
     // These change whenever the invalidation event hub sends an invalidation 
notification
 
-    private ClassFactory classFactory;
+    private volatile ClassFactory classFactory;
 
-    private PlasticProxyFactory proxyFactory;
+    private volatile PlasticProxyFactory proxyFactory;
 
-    private PlasticManager manager;
+    private volatile PlasticManager manager;
 
     /**
      * Map from class name to Instantiator.
@@ -228,33 +228,38 @@ public final class ComponentInstantiator
                 {
                     public Instantiator invoke()
                     {
-                        // Force the creation of the class (and the 
transformation of the class). This will first
-                        // trigger transformations of any base classes.
+                        ClassLoader proxyClassLoader = 
proxyFactory.getClassLoader();
 
-                        final ClassInstantiator<Component> plasticInstantiator 
= manager
-                                .getClassInstantiator(className);
-
-                        final ComponentModel model = 
classToModel.get(className);
-
-                        return new Instantiator()
+                        synchronized (proxyClassLoader)
                         {
-                            public Component 
newInstance(InternalComponentResources resources)
-                            {
-                                return 
plasticInstantiator.with(ComponentResources.class, resources)
-                                        
.with(InternalComponentResources.class, resources).newInstance();
-                            }
+                            // Force the creation of the class (and the 
transformation of the class). This will first
+                            // trigger transformations of any base classes.
 
-                            public ComponentModel getModel()
-                            {
-                                return model;
-                            }
+                            final ClassInstantiator<Component> 
plasticInstantiator = manager
+                                    .getClassInstantiator(className);
+
+                            final ComponentModel model = 
classToModel.get(className);
 
-                            @Override
-                            public String toString()
+                            return new Instantiator()
                             {
-                                return String.format("[Instantiator[%s]", 
className);
-                            }
-                        };
+                                public Component 
newInstance(InternalComponentResources resources)
+                                {
+                                    return 
plasticInstantiator.with(ComponentResources.class, resources)
+                                            
.with(InternalComponentResources.class, resources).newInstance();
+                                }
+
+                                public ComponentModel getModel()
+                                {
+                                    return model;
+                                }
+
+                                @Override
+                                public String toString()
+                                {
+                                    return String.format("[Instantiator[%s]", 
className);
+                                }
+                            };
+                        }
                     }
                 });
     }


Reply via email to