]> source.dussan.org Git - aspectj.git/commitdiff
synchronization to allow multiple threads to start using the world (see Thorstens...
authoraclement <aclement>
Mon, 21 Feb 2011 20:54:45 +0000 (20:54 +0000)
committeraclement <aclement>
Mon, 21 Feb 2011 20:54:45 +0000 (20:54 +0000)
org.aspectj.matcher/src/org/aspectj/weaver/ReferenceType.java
org.aspectj.matcher/src/org/aspectj/weaver/World.java

index eb4bff25540487eb69caad6f31a77e93918b57af..28718d47412987430c5933a00b7a7a008aa8a74d 100644 (file)
@@ -111,7 +111,7 @@ public class ReferenceType extends ResolvedType {
        // this.delegate = genericReferenceType.getDelegate();
        // genericReferenceType.addDependentType(this);
        // }
-       private void addDependentType(ReferenceType dependent) {
+       private synchronized void addDependentType(ReferenceType dependent) {
                this.derivativeTypes.add(dependent);
        }
 
index 779804c2f4824743aa71d88e07ff72832dc7f738..43a63b10dacb3582557e7add974a8651683c2d20 100644 (file)
@@ -272,8 +272,8 @@ public abstract class World implements Dump.INode {
                }
 
                // dispatch back to the type variable reference to resolve its
-               // constituent parts
-               // don't do this for other unresolved types otherwise you'll end up in a
+               // constituent parts don't do this for other unresolved types otherwise
+               // you'll end up in a
                // loop
                if (ty.isTypeVariableReference()) {
                        return ty.resolve(this);
@@ -300,18 +300,18 @@ public abstract class World implements Dump.INode {
                }
 
                // no existing resolved type, create one
-               if (ty.isArray()) {
-                       ResolvedType componentType = resolve(ty.getComponentType(), allowMissing);
-                       // String brackets =
-                       // signature.substring(0,signature.lastIndexOf("[")+1);
-                       ret = new ArrayReferenceType(signature, "[" + componentType.getErasureSignature(), this, componentType);
-               } else {
-                       ret = resolveToReferenceType(ty, allowMissing);
-                       if (!allowMissing && ret.isMissing()) {
-                               ret = handleRequiredMissingTypeDuringResolution(ty);
-                       }
-                       if (completeBinaryTypes) {
-                               completeBinaryType(ret);
+               synchronized (buildingTypeLock) {
+                       if (ty.isArray()) {
+                               ResolvedType componentType = resolve(ty.getComponentType(), allowMissing);
+                               ret = new ArrayReferenceType(signature, "[" + componentType.getErasureSignature(), this, componentType);
+                       } else {
+                               ret = resolveToReferenceType(ty, allowMissing);
+                               if (!allowMissing && ret.isMissing()) {
+                                       ret = handleRequiredMissingTypeDuringResolution(ty);
+                               }
+                               if (completeBinaryTypes) {
+                                       completeBinaryType(ret);
+                               }
                        }
                }
 
@@ -329,6 +329,8 @@ public abstract class World implements Dump.INode {
                }
        }
 
+       private Object buildingTypeLock = new Object();
+
        // Only need one representation of '?' in a world - can be shared
        private BoundedReferenceType wildcard;