Crash with -Djava.lang.Continuation.trace

Johannes Kuhn info at j-kuhn.de
Mon Jun 29 22:10:45 UTC 2020


I just tried out the Loom EA build on windows, and found 
-Djava.lang.Continuation.trace, which I did enable to better understand 
the inner workings.

Unfortunately, this lead to a crash of the VM with the following code:

     public class LoomBug {

         BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(1);

         public static void main(String[] args) throws 
InterruptedException {
             var hello = new LoomBug();
             var c = 
Thread.builder().virtual().name("consumer").task(hello::consumer).start();
             var p = 
Thread.builder().virtual().name("producer").task(hello::producer).start();
             p.join();
             c.join();
         }

         public void producer() {
             try {
                 for (int i = 0; i < 10; i++) {
                     System.out.println("Producing " + i);
                     queue.put(i);
                     System.out.println("Produced " + i);
                 }
                 queue.put(-1);
             } catch (InterruptedException e) {
                 Thread.currentThread().interrupt();
             }
         }

         public void consumer() {
             while (true) {
                 try {
                     int val = queue.take();
                     if (val < 0) {
                         break;
                     }
                     System.out.println("Consuming " + val);
                 } catch (InterruptedException e) {
                     Thread.currentThread().interrupt();
                     break;
                 }
             }
         }
     }

And this output:

Exception in thread "ForkJoinPool-1-worker-5" 
java.lang.IllegalStateException: Not in scope VirtualThreads
     at java.base/java.lang.Continuation.yield(Continuation.java:428)
     at java.base/java.lang.VirtualThread.tryPark(VirtualThread.java:470)
     at java.base/java.lang.VirtualThread.park(VirtualThread.java:418)
     at java.base/java.lang.System$2.parkVirtualThread(System.java:2322)

++++++++++++++++++++++++++++++
     at 
java.base/jdk.internal.misc.VirtualThreads.park(VirtualThreads.java:56)
     at 
java.base/java.util.concurrent.locks.LockSupport.park(LockSupport.java:220)
     at 
java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:714)
     at 
java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:937)
     at 
java.base/java.util.concurrent.locks.ReentrantLock$Sync.lock(ReentrantLock.java:153)
     at 
java.base/java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:322)
     at java.base/java.io.PrintStream.writeln(PrintStream.java:828)
     at java.base/java.io.PrintStream.println(PrintStream.java:1163)
     at java.base/java.lang.Continuation.run(Continuation.java:305)
     at 
java.base/java.lang.VirtualThread.runContinuation(VirtualThread.java:211)
     at 
java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1429)
     at 
java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
     at 
java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1018)

++++++++++++++++++++++++++++++
     at 
java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1667)
     at 
java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1600)
     at 
java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:189)
ENTERING 4fc4b48f [19]
java.lang.VirtualThread$1 at 47fb4b70 scope: VirtualThreads yielding on 
scope VirtualThreads. child: null
java.lang.VirtualThread$1 at 4fc4b48f scope: VirtualThreads yielding on 
scope VirtualThreads. child: null
#
[thread 18516 also had an error]
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffea7468191, 
pid=6244, tid=9080
#
# JRE version: OpenJDK Runtime Environment (16.0+2) (build 16-loom+2-14)
# Java VM: OpenJDK 64-Bit Server VM (16-loom+2-14, mixed mode, sharing, 
tiered, compressed oops, g1 gc, windows-amd64)
# Problematic frame:
# V  [jvm.dll+0x218191]
#
# No core dump will be written. Minidumps are not enabled by default on 
client versions of Windows
#
# An error report file with more information is saved as:
# C:\Users\Johannes\eclipse-workspace\loom-test\hs_err_pid6244.log
#
# If you would like to submit a bug report, please visit:
#   https://bugreport.java.com/bugreport/crash.jsp
#

The ++++++++++++++++++++++++++++++ lines are on stdout, the rest on stderr.

I think writing to System.err involves locks, which are not safe to use 
during transition between virtual threads and carrier.
Let me know if you need additional information.

- Johannes



More information about the loom-dev mailing list