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 2008/08/08 23:25:08 UTC
svn commit: r684101 - in /tapestry/tapestry5/trunk:
tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java
tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PropertyAccessImpl.java
Author: hlship
Date: Fri Aug 8 14:25:08 2008
New Revision: 684101
URL: http://svn.apache.org/viewvc?rev=684101&view=rev
Log:
TAPESTRY-2561: Rapidly refreshing a page, even the same page, can cause a deadlock related to class loading
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PropertyAccessImpl.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=684101&r1=684100&r2=684101&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 Aug 8 14:25:08 2008
@@ -90,10 +90,10 @@
// TAPESTRY-2561: Prevent other threads from creating new classes in either
// the component class loader or in the context class loader (which is used for
// IoC proxies and the like). This is draconian, but the deadlock issue remains.
- synchronized (InternalConstants.GLOBAL_CLASS_CREATION_MUTEX)
- {
- return super.findClass(className);
- }
+ // synchronized (InternalConstants.GLOBAL_CLASS_CREATION_MUTEX)
+ // {
+ return super.findClass(className);
+ // }
}
// Returning null forces delegation to the parent class loader.
@@ -179,17 +179,20 @@
try
{
- CtClass ctClass = pool.get(classname);
+ synchronized (InternalConstants.GLOBAL_CLASS_CREATION_MUTEX)
+ {
+ CtClass ctClass = pool.get(classname);
- // Force the creation of the super-class before the target class.
+ // Force the creation of the super-class before the target class.
- forceSuperclassTransform(ctClass);
+ forceSuperclassTransform(ctClass);
- // Do the transformations here
+ // Do the transformations here
- transformer.transformComponentClass(ctClass, loader);
+ transformer.transformComponentClass(ctClass, loader);
- writeClassToFileSystemForHardCoreDebuggingPurposesOnly(ctClass);
+ writeClassToFileSystemForHardCoreDebuggingPurposesOnly(ctClass);
+ }
diag = "END";
}
Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PropertyAccessImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PropertyAccessImpl.java?rev=684101&r1=684100&r2=684101&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PropertyAccessImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PropertyAccessImpl.java Fri Aug 8 14:25:08 2008
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007 The Apache Software Foundation
+// Copyright 2006, 2007, 2008 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -14,6 +14,7 @@
package org.apache.tapestry5.ioc.internal.services;
+import org.apache.tapestry5.ioc.internal.InternalConstants;
import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
import org.apache.tapestry5.ioc.services.ClassPropertyAdapter;
import org.apache.tapestry5.ioc.services.PropertyAccess;
@@ -74,22 +75,25 @@
* serializes access to the Java Beans Introspector, which is not thread safe. In addition, handles the case where
* the class in question is an interface, accumulating properties inherited from super-classes.
*/
- private synchronized ClassPropertyAdapter buildAdapter(Class forClass)
+ private ClassPropertyAdapter buildAdapter(Class forClass)
{
// In some race conditions, we may hit this method for the same class multiple times.
// We just let it happen, replacing the old ClassPropertyAdapter with a new one.
try
{
- BeanInfo info = Introspector.getBeanInfo(forClass);
+ synchronized (InternalConstants.GLOBAL_CLASS_CREATION_MUTEX)
+ {
+ BeanInfo info = Introspector.getBeanInfo(forClass);
- List<PropertyDescriptor> descriptors = CollectionFactory.newList();
+ List<PropertyDescriptor> descriptors = CollectionFactory.newList();
- addAll(descriptors, info.getPropertyDescriptors());
+ addAll(descriptors, info.getPropertyDescriptors());
- if (forClass.isInterface()) addPropertiesFromExtendedInterfaces(forClass, descriptors);
+ if (forClass.isInterface()) addPropertiesFromExtendedInterfaces(forClass, descriptors);
- return new ClassPropertyAdapterImpl(forClass, descriptors);
+ return new ClassPropertyAdapterImpl(forClass, descriptors);
+ }
}
catch (Throwable ex)
{