Author: desruisseaux Date: Thu Feb 9 06:10:25 2017 New Revision: 1782293 URL: http://svn.apache.org/viewvc?rev=1782293&view=rev Log: Fix a dead-lock between ContextualParameters and WeakHashSet (SIS-349).
Modified: sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/ContextualParameters.java Modified: sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/ContextualParameters.java URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/ContextualParameters.java?rev=1782293&r1=1782292&r2=1782293&view=diff ============================================================================== --- sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/ContextualParameters.java [UTF-8] (original) +++ sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/ContextualParameters.java [UTF-8] Thu Feb 9 06:10:25 2017 @@ -127,7 +127,7 @@ import static org.apache.sis.util.Argume * * @author Martin Desruisseaux (Geomatys) * @since 0.6 - * @version 0.7 + * @version 0.8 * @module * * @see org.apache.sis.referencing.operation.projection.NormalizedProjection @@ -501,24 +501,33 @@ public class ContextualParameters extend * * @see org.apache.sis.referencing.operation.projection.NormalizedProjection#createMapProjection(MathTransformFactory) */ - public synchronized MathTransform completeTransform(final MathTransformFactory factory, final MathTransform kernel) + public MathTransform completeTransform(final MathTransformFactory factory, final MathTransform kernel) throws FactoryException { - if (!isFrozen) { - freeze(); + final MathTransform n, d; + synchronized (this) { + if (!isFrozen) { + freeze(); + } + /* + * Creates the ConcatenatedTransform, letting the factory returns the cached instance + * if the caller already invoked this method previously (which usually do not happen). + */ + n = factory.createAffineTransform(normalize); + d = factory.createAffineTransform(denormalize); + Matrix m; + if ((m = MathTransforms.getMatrix(n)) != null) normalize = m; + if ((m = MathTransforms.getMatrix(d)) != null) denormalize = m; } - /* - * Creates the ConcatenatedTransform, letting the factory returns the cached instance - * if the caller already invoked this method previously (which usually do not happen). - */ - final MathTransform n = factory.createAffineTransform(normalize); - final MathTransform d = factory.createAffineTransform(denormalize); - Matrix m; - if ((m = MathTransforms.getMatrix(n)) != null) normalize = m; - if ((m = MathTransforms.getMatrix(d)) != null) denormalize = m; if (kernel == null) { // Undocumented feature useful for MolodenskyTransform constructor. return null; } + /* + * Following call must be outside the synchronized block for avoiding dead-lock. This is because the + * factory typically contains a WeakHashSet, which invoke in turn the 'equals' methods in this class + * (indirectly, through 'kernel' comparison). We need to be outside the synchronized block for having + * the locks taken in same order (WeakHashSet lock before the ContextualParameters lock). + */ return factory.createConcatenatedTransform(factory.createConcatenatedTransform(n, kernel), d); }