From fd0c674d66ce786a2c34495c7c9c12c11844b418 Mon Sep 17 00:00:00 2001 From: Harvey Harrison Date: Wed, 6 Aug 2014 07:36:42 -0700 Subject: j3dcore: cannot lock an object using its own reference When updating the orientTransforms array reference, you cannot lock the update using the same ref, as the next thread in will lock the new object and concurrently run with the original updater. Pointed out by findbugs. Signed-off-by: Harvey Harrison --- .../javax/media/j3d/OrientedShape3DRetained.java | 33 ++++++++++------------ 1 file changed, 15 insertions(+), 18 deletions(-) (limited to 'src/classes/share/javax') diff --git a/src/classes/share/javax/media/j3d/OrientedShape3DRetained.java b/src/classes/share/javax/media/j3d/OrientedShape3DRetained.java index 5bdf87c..4fe4026 100644 --- a/src/classes/share/javax/media/j3d/OrientedShape3DRetained.java +++ b/src/classes/share/javax/media/j3d/OrientedShape3DRetained.java @@ -83,7 +83,8 @@ class OrientedShape3DRetained extends Shape3DRetained { boolean orientedTransformDirty = true; - Transform3D[] orientedTransforms = new Transform3D[1]; + private final Object transformLock = new Object(); + private Transform3D[] orientedTransforms = new Transform3D[1]; static final double EPSILON = 1.0e-6; @@ -308,25 +309,21 @@ class OrientedShape3DRetained extends Shape3DRetained { } - Transform3D getOrientedTransform(int viewIndex) { - synchronized(orientedTransforms) { - if (viewIndex >= orientedTransforms.length) { - Transform3D xform = new Transform3D(); - Transform3D[] newList = new Transform3D[viewIndex+1]; - for (int i = 0; i < orientedTransforms.length; i++) { - newList[i] = orientedTransforms[i]; - } - newList[viewIndex] = xform; - orientedTransforms = newList; - } - else { - if (orientedTransforms[viewIndex] == null) { - orientedTransforms[viewIndex] = new Transform3D(); + Transform3D getOrientedTransform(int viewIndex) { + synchronized (transformLock) { + // check if the transforms list needs to be expanded + if (viewIndex >= orientedTransforms.length) { + Transform3D[] newList = new Transform3D[viewIndex + 1]; + System.arraycopy(orientedTransforms, 0, newList, 0, orientedTransforms.length); + orientedTransforms = newList; + } + + if (orientedTransforms[viewIndex] == null) + orientedTransforms[viewIndex] = new Transform3D(); + + return orientedTransforms[viewIndex]; } - } } - return orientedTransforms[viewIndex]; - } // called on the parent object // Should be synchronized so that the user thread does not modify the -- cgit v1.2.3