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);
+ }
+ };
+ }
}
});
}