D'oh. Sorry about that. Probably should have just posted to the forums anyway.
-Spencer >________________________________ > From: Luke Daley <luke.da...@gradleware.com> >To: dev@gradle.codehaus.org >Sent: Thursday, April 5, 2012 9:28 AM >Subject: Re: [gradle-dev] CPP: dealing with arbitrary arguments. > > >Please use a new thread instead of hijacking an existing. > > >On 05/04/2012, at 2:13 PM, Spencer Allain wrote: > >Should this ever be allowed? >> >>task blowsUp << { doFirst { println 'ConcurrentModificationException' } } >> >>I basically never use the short-cut form, but in building up some internal >>training materials I attempted to do the above essentially to see what would >>happen, and wasn't quite expecting the below exception. >> >>The exception logically makes sense as the actions list is indeed being modified while being iterated over, but it seems that the only way that should be possible is by nesting doFirst and/or doLast closures. I rather would have expected gradle to spit out a message something to the effect that nested doFirst/doLast closure blocks are disallowed. >> >>The other possible option would be to change the internal list structure >>explicitly to use a CopyOnWriteArrayList so that changes after iteration has >>started would simply not be seen. That would mask issues though, so failing >>early seems like a much better option, just ideally with a nicer message to >>the user. >> >> >>Below is the actual exception that occurs using 1.0-milestone-9 >> >>java.util.ConcurrentModificationException >> at >>java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372) >> at java.util.AbstractList$Itr.next(AbstractList.java:343) >> at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:56) >> at >>org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46) >> at >>org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:34) >> at >>org.gradle.api.internal.changedetection.CacheLockHandlingTaskExecuter$1.run(CacheLockHandlingTaskExecuter.java:34) >> at >>org.gradle.cache.internal.DefaultCacheAccess$2.create(DefaultCacheAccess.java:200) >> at >>org.gradle.cache.internal.DefaultCacheAccess.longRunningOperation(DefaultCacheAccess.java:172) >> at org.gradle.cache.internal.DefaultCacheAccess.longRunningOperation(DefaultCacheAccess.java:198) >> at >>org.gradle.cache.internal.DefaultPersistentDirectoryStore.longRunningOperation(DefaultPersistentDirectoryStore.java:111) >> at >>org.gradle.api.internal.changedetection.DefaultTaskArtifactStateCacheAccess.longRunningOperation(DefaultTaskArtifactStateCacheAccess.java:83) >> at >>org.gradle.api.internal.changedetection.CacheLockHandlingTaskExecuter.execute(CacheLockHandlingTaskExecuter.java:32) >> at >>org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:55) >> at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:57) >> at >>org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:41) >> at >>org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:51) >> at >>org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:52) >> at >>org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:42) >> at >>org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:247) >> at org.gradle.execution.DefaultTaskGraphExecuter.executeTask(DefaultTaskGraphExecuter.java:192) >> at >>org.gradle.execution.DefaultTaskGraphExecuter.doExecute(DefaultTaskGraphExecuter.java:177) >> at >>org.gradle.execution.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:83) >> at >>org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:36) >> at >>org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:61) >> at >>org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExecuter.java:23) >> at >>org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.java:67) >> at org.gradle.api.internal.changedetection.TaskCacheLockHandlingBuildExecuter$1.run(TaskCacheLockHandlingBuildExecuter.java:31) >> at >>org.gradle.cache.internal.DefaultCacheAccess$1.create(DefaultCacheAccess.java:111) >> at >>org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:126) >> at >>org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:109) >> at >>org.gradle.cache.internal.DefaultPersistentDirectoryStore.useCache(DefaultPersistentDirectoryStore.java:103) >> at >>org.gradle.api.internal.changedetection.DefaultTaskArtifactStateCacheAccess.useCache(DefaultTaskArtifactStateCacheAccess.java:79) >> at org.gradle.api.internal.changedetection.TaskCacheLockHandlingBuildExecuter.execute(TaskCacheLockHandlingBuildExecuter.java:29) >> at >>org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:61) >> at >>org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExecuter.java:23) >> at >>org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.java:67) >> at >>org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32) >> at >>org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:61) >> at >>org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:54) >> at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:155) >> at >>org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:110) >> at >>org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:78) >> at >>org.gradle.launcher.cli.RunBuildAction.execute(RunBuildAction.java:42) >> at >>org.gradle.launcher.cli.RunBuildAction.execute(RunBuildAction.java:28) >> at >>org.gradle.launcher.exec.ExceptionReportingAction.execute(ExceptionReportingAction.java:32) >> at >>org.gradle.launcher.exec.ExceptionReportingAction.execute(ExceptionReportingAction.java:21) >> at org.gradle.launcher.cli.CommandLineActionFactory$WithLoggingAction.execute(CommandLineActionFactory.java:302) >> at >>org.gradle.launcher.cli.CommandLineActionFactory$WithLoggingAction.execute(CommandLineActionFactory.java:286) >> at org.gradle.launcher.Main.doAction(Main.java:48) >> at org.gradle.launcher.exec.EntryPoint$1.execute(EntryPoint.java:53) >> at org.gradle.launcher.exec.EntryPoint$1.execute(EntryPoint.java:51) >> at org.gradle.launcher.exec.Execution.execute(Execution.java:28) >> at org.gradle.launcher.exec.EntryPoint.run(EntryPoint.java:39) >> at org.gradle.launcher.Main.main(Main.java:39) >> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >> at >>sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) >> at >>sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) >> at java.lang.reflect.Method.invoke(Method.java:597) >> at >>org.gradle.launcher.ProcessBootstrap.runNoExit(ProcessBootstrap.java:51) >> at org.gradle.launcher.ProcessBootstrap.run(ProcessBootstrap.java:33) >> at org.gradle.launcher.GradleMain.main(GradleMain.java:24) >> >>-Spencer >> > >-- >Luke Daley >Principal Engineer, Gradleware >http://gradleware.com > > >