aparapi
aparapi copied to clipboard
[Bounty $20] Break in loop causes kernel to hang
This issue only comes up when run as a main, it doesnt appear to show up when running inside a unit test. The code below provokes the exception every time however if i replace the break statement with a return statement it works fine.
Offending code:
System.out.println("Preparing...");
final int toCheck[] = new int[10000];
for(int i = 0; i < toCheck.length; i++)
toCheck[i] = i;
final boolean result[] = new boolean[10000];
Kernel kernel = new Kernel() {
@Override
public void run() {
int i = getGlobalId();
if ((toCheck[i] == 2) || (toCheck[i] == 3)) {
result[i] = true;
return;
}
if ((toCheck[i] % 2 == 0) || (toCheck[i] % 3 == 0)) {
result[i] = false;
return;
}
int maxDivisor = (int) Math.sqrt(toCheck[i]);
int dividendIndex = 1;
int dividend = 5;
while (dividend < maxDivisor) {
if (toCheck[i] % dividend == 0) {
result[i] = false;
return;
}
dividend = dividend + 2;
if (dividend > maxDivisor) {
// result[i] = true;
// return;
break;
}
if (toCheck[i] % dividend == 0) {
result[i] = false;
return;
}
dividendIndex++;
dividend = 6 * dividendIndex - 1;
}
result[i] = true;
}
};
Range range = Range.create(result.length);
System.out.println("Running...");
kernel.execute(range);
for( int i = 0; i< result.length; i++) {
if(result[i])
System.out.println(toCheck[i]);
}
System.out.println("done.");
kernel.dispose();
exception thrown:
[WARNING] thread Thread[ForkJoinPool-1-worker-2,1,com.syncleus.grail.Main] was interrupted but is still alive after waiting at least 999msecs
[WARNING] thread Thread[ForkJoinPool-1-worker-2,1,com.syncleus.grail.Main] will linger despite being asked to die via interruption
[WARNING] thread Thread[ForkJoinPool-1-worker-4,1,com.syncleus.grail.Main] will linger despite being asked to die via interruption
[WARNING] thread Thread[ForkJoinPool-1-worker-7,1,com.syncleus.grail.Main] will linger despite being asked to die via interruption
[WARNING] thread Thread[ForkJoinPool-1-worker-0,1,com.syncleus.grail.Main] will linger despite being asked to die via interruption
[WARNING] thread Thread[ForkJoinPool-1-worker-11,1,com.syncleus.grail.Main] will linger despite being asked to die via interruption
[WARNING] NOTE: 5 thread(s) did not finish despite being asked to via interruption. This is not a problem with exec:java, it is a problem with the running code. Although not serious, it should be remedied.
[WARNING] Couldn't destroy threadgroup org.codehaus.mojo.exec.ExecJavaMojo$IsolatedThreadGroup[name=com.syncleus.grail.Main,maxpri=10]
java.lang.IllegalThreadStateException
at java.lang.ThreadGroup.destroy(ThreadGroup.java:778)
at org.codehaus.mojo.exec.ExecJavaMojo.execute(ExecJavaMojo.java:321)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:207)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:863)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:199)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)