This may also be related to my bug: https://bugs.eclipse.org/bugs/show_bug.cgi?id=309741 which is seen in a Spring environment.
On Fri, Feb 18, 2011 at 6:55 PM, Andy Clement <andrew.clem...@gmail.com> wrote: > Hi Thorsten, > > Looks like a bug. Can you raise a bugzilla? My opening position > would be that the AspectJ weaver is a single threaded thing. But I > know ReflectionWorlds are used in instances other than just regular > weaving (for example, in a spring setup) - are you in Spring by any > chance when you see this issue? > > cheers > Andy > > On 18 February 2011 01:45, Gast, Thorsten <thorsten.g...@wirecard.com> wrote: >> Hi, >> >> I am currently struggling with an IndexOutOfBoundsException deep in aspectj. >> >> at java.util.ArrayList.add(ArrayList.java:352) >> at >> org.aspectj.weaver.ReferenceType.addDependentType(ReferenceType.java:115) >> at org.aspectj.weaver.ReferenceType.<init>(ReferenceType.java:95) >> at >> org.aspectj.weaver.TypeFactory.createParameterizedType(TypeFactory.java:43) >> >> After taking a deeper look into the code, I found out that the usage of >> TypeFactory.createParameterizedType() and in particular the instantiation of >> ReferenceType (line 43 of TypeFactory) is not thread safe. In a short >> program (see below) I could reproduce this issue, when passing the same >> instance of ResolvedType. >> >> Is this a bug, or should this not happen when aspectj is used in a proper >> way? >> >> Regards >> >> Thorsten >> >> >> --- sample program start --- >> import java.util.concurrent.CountDownLatch; >> >> import org.aspectj.weaver.ReferenceType; >> import org.aspectj.weaver.ResolvedType; >> import org.aspectj.weaver.TypeFactory; >> import org.aspectj.weaver.World; >> import org.aspectj.weaver.reflect.Java15ReflectionBasedReferenceTypeDelegate; >> import org.aspectj.weaver.reflect.ReflectionWorld; >> >> public class Aspectj { >> >> public static void main(String[] args) { >> new Aspectj(); >> } >> >> static World inAWorld = new >> ReflectionWorld(Aspectj.class.getClassLoader()); >> >> static ReferenceType aBaseType; >> static { >> aBaseType = new ReferenceType("test", inAWorld); >> Java15ReflectionBasedReferenceTypeDelegate delegate = new >> Java15ReflectionBasedReferenceTypeDelegate(); >> delegate.initialize(aBaseType, String.class, >> Aspectj.class.getClassLoader(), inAWorld); >> aBaseType.setDelegate(delegate); >> } >> >> public Aspectj() { >> int N = 25; >> CountDownLatch startSignal = new CountDownLatch(1); >> CountDownLatch doneSignal = new CountDownLatch(N); >> >> for (int i = 0; i < N; ++i) >> new Thread(new Worker(startSignal, doneSignal)).start(); >> >> startSignal.countDown(); >> try { >> doneSignal.await(); >> } catch (InterruptedException e){ >> e.printStackTrace(); >> } >> } >> >> class Worker implements Runnable { >> private final CountDownLatch startSignal; >> private final CountDownLatch doneSignal; >> >> Worker(CountDownLatch startSignal, CountDownLatch doneSignal) { >> this.startSignal = startSignal; >> this.doneSignal = doneSignal; >> } >> >> public void run() { >> try { >> startSignal.await(); >> doWork(); >> doneSignal.countDown(); >> } catch (InterruptedException ex) { >> ex.printStackTrace(); >> } >> } >> >> void doWork() { >> for (int i = 0; i < 10; i++) { >> // using TypeFactory >> TypeFactory.createParameterizedType(aBaseType, new >> ResolvedType[0], inAWorld); >> >> // or creating ReferenceTypes directly >> //new ReferenceType(aBaseType, new ResolvedType[0], inAWorld); >> } >> } >> } >> >> } >> --- sample program end --- >> >> _______________________________________________ >> aspectj-users mailing list >> aspectj-users@eclipse.org >> https://dev.eclipse.org/mailman/listinfo/aspectj-users >> > _______________________________________________ > aspectj-users mailing list > aspectj-users@eclipse.org > https://dev.eclipse.org/mailman/listinfo/aspectj-users > _______________________________________________ aspectj-users mailing list aspectj-users@eclipse.org https://dev.eclipse.org/mailman/listinfo/aspectj-users