creativescala / doodle

Compositional vector graphics in Scala / Scala.JS
https://creativescala.org/doodle/
Apache License 2.0
329 stars 76 forks source link

Get java.util.concurrent.CancellationException with org.creativescala::doodle:0.24.0 #176

Open dacr opened 1 month ago

dacr commented 1 month ago

The following script executed using scala-cli 1.4.0 :

//> using scala "3.4.2"
//> using dep "org.creativescala::doodle:0.24.0"

import doodle.image.*
import doodle.core.*
import doodle.syntax.*
import doodle.image.syntax.*
import doodle.syntax.all.*
import doodle.image.syntax.all.*
import doodle.java2d.*
import cats.effect.unsafe.implicits.global

val circle = Image.circle(500).noFill.strokeWidth(2)

val count=50
val circles = {
  1.to(count)
    .map(_.toDouble)
    .map(f => circle.transform(Transform.translate(500d,0d)).scale(f / count, f / count))
    .reduce((i1, i2) => i1.on(i2))
}

circles.draw()

works well with doodle:0.23.0 but crashes with doodle:0.24.0. (I can briefly see the window during less than 1 second)

✘-INT ~/notes/scripts/doodle [master|✚ 6…24]
16:24 $ scl vectorgraphics-doodle-circles.sc
Compiling project (Scala 3.4.2, JVM (21))
Compiled project (Scala 3.4.2, JVM (21))
[hint] ./vectorgraphics-doodle-circles.sc:13:16
[hint] "doodle is outdated, update to 0.24.0"
[hint]      doodle 0.23.0 -> org.creativescala::doodle:0.24.0
[hint] //> using dep "org.creativescala::doodle:0.23.0"
[hint]                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^C✘-INT ~/notes/scripts/doodle [master|✚ 5…24]
16:24 $ scl vectorgraphics-doodle-circles.sc
Exception in thread "main" java.util.concurrent.CancellationException
    at java.base/java.util.concurrent.CompletableFuture.cancel(CompletableFuture.java:2510)
    at blocking @ doodle.java2d.effect.Canvas.$init$$$anonfun$1(Canvas.scala:67)
    at fromCompletableFuture @ doodle.java2d.effect.Canvas.$init$$$anonfun$1(Canvas.scala:67)
    at apply @ doodle.java2d.effect.Canvas.close(Canvas.scala:118)
    at >> @ doodle.java2d.effect.Canvas.<init>(Canvas.scala:93)
    at void @ doodle.java2d.effect.Canvas.<init>(Canvas.scala:70)
    at as @ fs2.Stream.merge$$anonfun$1$$anonfun$1$$anonfun$1(Stream.scala:2036)
    at unsafeRunSync @ doodle.syntax.RendererSyntax.runIO(RendererSyntax.scala:26)
    at void @ doodle.java2d.effect.Canvas.<init>(Canvas.scala:70)
    at unsafeRunSync @ doodle.syntax.RendererSyntax.runIO(RendererSyntax.scala:26)
✘-1 ~/notes/scripts/doodle [master|✚ 6…24]
noelwelsh commented 1 month ago

Thanks. I'll look into it.

noelwelsh commented 1 month ago

Alright, I think I've fixed it. I'm not going to close this report immediately, as there might still be issues. I'll make a release soon to allow further testing.

noelwelsh commented 1 month ago

v0.25.0 will be out as soon as CI has finished.

dacr commented 1 month ago

:) Fixed for the two examples I have just tried.

dacr commented 1 month ago

There is probably other issues (although not sure at 100%), for example with this animated script is frozen :

// ---------------------
//> using scala "3.5.1"
//> using dep "org.creativescala::doodle:0.25.0"
// ---------------------

import cats.effect.IO
import doodle.core.*
import doodle.syntax.*
import doodle.syntax.all.*
import doodle.interact.*
import doodle.interact.syntax.*
import doodle.interact.syntax.all.*
import doodle.java2d.*
import doodle.java2d.effect.*
import fs2.Stream
import cats.effect.unsafe.implicits.global
import scala.concurrent.duration.{FiniteDuration, MILLISECONDS}

import cats.instances.all._
import cats.syntax.all._

val frame: Frame = Frame(
  size = Size.fixedSize(600, 600),
  title = "Photos",
  center = Center.atOrigin,
  background = Some(Color.midnightBlue),
  redraw = Redraw.clearToBackground
)

val ball =
  -100.0
    .upTo(100.0)
    .map(x =>
      Picture
        .circle(30)
        .fillColor(Color.chartreuse)
        .strokeWidth(3.0)
        .at(x, 0.0)
    )
    .forSteps(100)
    .repeatForever

ball
  .animate(frame)

scala.io.StdIn.readLine("Enter to exit...") // required when run as a script

It also get the same result using a REPL session : image

dacr commented 1 month ago

There is probably other issues (although not sure at 100%), for example with this animated script is frozen :

// ---------------------
//> using scala "3.5.1"
//> using dep "org.creativescala::doodle:0.25.0"
// ---------------------

import cats.effect.IO
import doodle.core.*
import doodle.syntax.*
import doodle.syntax.all.*
import doodle.interact.*
import doodle.interact.syntax.*
import doodle.interact.syntax.all.*
import doodle.java2d.*
import doodle.java2d.effect.*
import fs2.Stream
import cats.effect.unsafe.implicits.global
import scala.concurrent.duration.{FiniteDuration, MILLISECONDS}

import cats.instances.all._
import cats.syntax.all._

val frame: Frame = Frame(
  size = Size.fixedSize(600, 600),
  title = "Photos",
  center = Center.atOrigin,
  background = Some(Color.midnightBlue),
  redraw = Redraw.clearToBackground
)

val ball =
  -100.0
    .upTo(100.0)
    .map(x =>
      Picture
        .circle(30)
        .fillColor(Color.chartreuse)
        .strokeWidth(3.0)
        .at(x, 0.0)
    )
    .forSteps(100)
    .repeatForever

ball
  .animate(frame)

scala.io.StdIn.readLine("Enter to exit...") // required when run as a script

It also gives the same result using a REPL session : image

The thread dump :

2024-09-26 19:34:18
Full thread dump OpenJDK 64-Bit Server VM (22+36-nixos mixed mode, sharing):

Threads class SMR info:
_java_thread_list=0x0000762520022140, length=35, elements={
0x00007625f0018570, 0x00007625f0144a30, 0x00007625f0146110, 0x00007625f0147da0,
0x00007625f0149470, 0x00007625f014aaa0, 0x00007625f014c6d0, 0x00007625f014de70,
0x00007625f015c960, 0x00007625f01601f0, 0x00007625f06a5740, 0x00007625f06a6a10,
0x00007625f06a7f40, 0x00007625f06a91f0, 0x00007625f06aa4b0, 0x00007625f06ab770,
0x00007625f06aca40, 0x00007625f06add10, 0x00007625f06af070, 0x00007625f06b0210,
0x00007625f06b1290, 0x00007625f06b2450, 0x00007625f06b3ae0, 0x00007625f06b51a0,
0x00007625f06b67b0, 0x00007625f06b79d0, 0x00007624f8069590, 0x00007624f800e440,
0x00007624f806c580, 0x00007624f806d820, 0x0000762450376650, 0x00007624fc02a560,
0x000076248008f9b0, 0x000076248c084490, 0x000076250406aa10
}

"main" #1 [225987] prio=5 os_prio=0 cpu=416.67ms elapsed=28.77s tid=0x00007625f0018570 nid=225987 waiting on condition  [0x00007625f73fd000]
   java.lang.Thread.State: TIMED_WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@22/Native Method)
    - parking to wait for  <0x000000060ec01168> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.parkNanos(java.base@22/LockSupport.java:269)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(java.base@22/AbstractQueuedSynchronizer.java:1758)
    at java.util.concurrent.ArrayBlockingQueue.poll(java.base@22/ArrayBlockingQueue.java:435)
    at cats.effect.IOPlatform.$anonfun$1(IOPlatform.scala:80)
    at cats.effect.IOPlatform$$Lambda/0x000076256f1cf9c0.apply(Unknown Source)
    at scala.concurrent.BlockContext$DefaultBlockContext$.blockOn(BlockContext.scala:62)
    at scala.concurrent.package$.blocking(package.scala:124)
    at cats.effect.IOPlatform.unsafeRunTimed(IOPlatform.scala:80)
    at cats.effect.IOPlatform.unsafeRunSync(IOPlatform.scala:42)
    at doodle.interact.syntax.AnimationRendererSyntax.runIO(AnimationRendererSyntax.scala:27)
    at doodle.interact.syntax.AnimationRendererSyntax.runIO$(AnimationRendererSyntax.scala:24)
    at doodle.interact.syntax.package$animationRenderer$.runIO(package.scala:29)
    at doodle.interact.syntax.AbstractAnimationRendererSyntax$AnimateToStreamOps.animateFrames(AbstractAnimationRendererSyntax.scala:129)
    at doodle.interact.animation.Transducer.animate(Transducer.scala:371)
    at doodle.interact.animation.Transducer.animate$(Transducer.scala:64)
    at doodle.interact.animation.Transducer$$anon$7.animate(Transducer.scala:337)
    at vectorgraphics$minusdoodle$minusexample$minusanimate$minus1$_.<init>(vectorgraphics-doodle-example-animate-1.sc:54)
    at vectorgraphics$minusdoodle$minusexample$minusanimate$minus1_sc$.script$lzyINIT1(vectorgraphics-doodle-example-animate-1.sc:72)
    at vectorgraphics$minusdoodle$minusexample$minusanimate$minus1_sc$.script(vectorgraphics-doodle-example-animate-1.sc:72)
    at vectorgraphics$minusdoodle$minusexample$minusanimate$minus1_sc$.main(vectorgraphics-doodle-example-animate-1.sc:76)
    at vectorgraphics$minusdoodle$minusexample$minusanimate$minus1_sc.main(vectorgraphics-doodle-example-animate-1.sc)

"Reference Handler" #9 [225995] daemon prio=10 os_prio=0 cpu=0.87ms elapsed=28.75s tid=0x00007625f0144a30 nid=225995 waiting on condition  [0x00007625cd7fa000]
   java.lang.Thread.State: RUNNABLE
    at java.lang.ref.Reference.waitForReferencePendingList(java.base@22/Native Method)
    at java.lang.ref.Reference.processPendingReferences(java.base@22/Reference.java:246)
    at java.lang.ref.Reference$ReferenceHandler.run(java.base@22/Reference.java:208)

"Finalizer" #10 [225996] daemon prio=8 os_prio=0 cpu=0.10ms elapsed=28.75s tid=0x00007625f0146110 nid=225996 in Object.wait()  [0x00007625cd6fa000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait0(java.base@22/Native Method)
    - waiting on <0x000000060ec00078> (a java.lang.ref.NativeReferenceQueue$Lock)
    at java.lang.Object.wait(java.base@22/Object.java:375)
    at java.lang.Object.wait(java.base@22/Object.java:348)
    at java.lang.ref.NativeReferenceQueue.await(java.base@22/NativeReferenceQueue.java:48)
    at java.lang.ref.ReferenceQueue.remove0(java.base@22/ReferenceQueue.java:158)
    at java.lang.ref.NativeReferenceQueue.remove(java.base@22/NativeReferenceQueue.java:89)
    - locked <0x000000060ec00078> (a java.lang.ref.NativeReferenceQueue$Lock)
    at java.lang.ref.Finalizer$FinalizerThread.run(java.base@22/Finalizer.java:173)

"Signal Dispatcher" #11 [225997] daemon prio=9 os_prio=0 cpu=0.11ms elapsed=28.75s tid=0x00007625f0147da0 nid=225997 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Service Thread" #12 [225998] daemon prio=9 os_prio=0 cpu=0.20ms elapsed=28.75s tid=0x00007625f0149470 nid=225998 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Monitor Deflation Thread" #13 [225999] daemon prio=9 os_prio=0 cpu=4.61ms elapsed=28.75s tid=0x00007625f014aaa0 nid=225999 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" #14 [226000] daemon prio=9 os_prio=0 cpu=1040.42ms elapsed=28.75s tid=0x00007625f014c6d0 nid=226000 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   No compile task

"C1 CompilerThread0" #22 [226001] daemon prio=9 os_prio=0 cpu=163.22ms elapsed=28.75s tid=0x00007625f014de70 nid=226001 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   No compile task

"Notification Thread" #26 [226002] daemon prio=9 os_prio=0 cpu=0.05ms elapsed=28.75s tid=0x00007625f015c960 nid=226002 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Common-Cleaner" #27 [226003] daemon prio=8 os_prio=0 cpu=1.07ms elapsed=28.75s tid=0x00007625f01601f0 nid=226003 waiting on condition  [0x00007625ccf25000]
   java.lang.Thread.State: TIMED_WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@22/Native Method)
    - parking to wait for  <0x000000060ec028c8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.parkNanos(java.base@22/LockSupport.java:269)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@22/AbstractQueuedSynchronizer.java:1847)
    at java.lang.ref.ReferenceQueue.await(java.base@22/ReferenceQueue.java:71)
    at java.lang.ref.ReferenceQueue.remove0(java.base@22/ReferenceQueue.java:143)
    at java.lang.ref.ReferenceQueue.remove(java.base@22/ReferenceQueue.java:218)
    at jdk.internal.ref.CleanerImpl.run(java.base@22/CleanerImpl.java:140)
    at java.lang.Thread.runWith(java.base@22/Thread.java:1583)
    at java.lang.Thread.run(java.base@22/Thread.java:1570)
    at jdk.internal.misc.InnocuousThread.run(java.base@22/InnocuousThread.java:186)

"io-compute-6" #28 [226009] daemon prio=5 os_prio=0 cpu=28.08ms elapsed=28.54s tid=0x00007625f06a5740 nid=226009 waiting on condition  [0x00007625cc925000]
   java.lang.Thread.State: WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@22/Native Method)
    - parking to wait for  <0x000000060ec031a8> (a cats.effect.unsafe.WorkStealingThreadPool)
    at java.util.concurrent.locks.LockSupport.park(java.base@22/LockSupport.java:221)
    at cats.effect.unsafe.WorkerThread.parkLoop$1(WorkerThread.scala:372)
    at cats.effect.unsafe.WorkerThread.park$1(WorkerThread.scala:334)
    at cats.effect.unsafe.WorkerThread.run(WorkerThread.scala:660)

"io-compute-2" #29 [226010] daemon prio=5 os_prio=0 cpu=29.01ms elapsed=28.54s tid=0x00007625f06a6a10 nid=226010 waiting on condition  [0x00007625cc825000]
   java.lang.Thread.State: WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@22/Native Method)
    - parking to wait for  <0x000000060ec031a8> (a cats.effect.unsafe.WorkStealingThreadPool)
    at java.util.concurrent.locks.LockSupport.park(java.base@22/LockSupport.java:221)
    at cats.effect.unsafe.WorkerThread.parkLoop$1(WorkerThread.scala:372)
    at cats.effect.unsafe.WorkerThread.park$1(WorkerThread.scala:334)
    at cats.effect.unsafe.WorkerThread.run(WorkerThread.scala:660)

"io-compute-12" #30 [226011] daemon prio=5 os_prio=0 cpu=137.95ms elapsed=28.54s tid=0x00007625f06a7f40 nid=226011 waiting on condition  [0x00007625cc725000]
   java.lang.Thread.State: WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@22/Native Method)
    - parking to wait for  <0x000000060ec031a8> (a cats.effect.unsafe.WorkStealingThreadPool)
    at java.util.concurrent.locks.LockSupport.park(java.base@22/LockSupport.java:221)
    at cats.effect.unsafe.WorkerThread.parkLoop$1(WorkerThread.scala:372)
    at cats.effect.unsafe.WorkerThread.park$1(WorkerThread.scala:334)
    at cats.effect.unsafe.WorkerThread.run(WorkerThread.scala:660)

"io-compute-10" #31 [226012] daemon prio=5 os_prio=0 cpu=30.43ms elapsed=28.54s tid=0x00007625f06a91f0 nid=226012 waiting on condition  [0x00007625cc625000]
   java.lang.Thread.State: WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@22/Native Method)
    - parking to wait for  <0x000000060ec031a8> (a cats.effect.unsafe.WorkStealingThreadPool)
    at java.util.concurrent.locks.LockSupport.park(java.base@22/LockSupport.java:221)
    at cats.effect.unsafe.WorkerThread.parkLoop$1(WorkerThread.scala:372)
    at cats.effect.unsafe.WorkerThread.park$1(WorkerThread.scala:334)
    at cats.effect.unsafe.WorkerThread.run(WorkerThread.scala:660)

"io-compute-13" #32 [226013] daemon prio=5 os_prio=0 cpu=17.62ms elapsed=28.54s tid=0x00007625f06aa4b0 nid=226013 waiting on condition  [0x00007625cc525000]
   java.lang.Thread.State: WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@22/Native Method)
    - parking to wait for  <0x000000060ec031a8> (a cats.effect.unsafe.WorkStealingThreadPool)
    at java.util.concurrent.locks.LockSupport.park(java.base@22/LockSupport.java:221)
    at cats.effect.unsafe.WorkerThread.parkLoop$1(WorkerThread.scala:372)
    at cats.effect.unsafe.WorkerThread.park$1(WorkerThread.scala:334)
    at cats.effect.unsafe.WorkerThread.run(WorkerThread.scala:660)

"io-compute-1" #33 [226014] daemon prio=5 os_prio=0 cpu=20.12ms elapsed=28.54s tid=0x00007625f06ab770 nid=226014 waiting on condition  [0x00007625cc425000]
   java.lang.Thread.State: WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@22/Native Method)
    - parking to wait for  <0x000000060ec031a8> (a cats.effect.unsafe.WorkStealingThreadPool)
    at java.util.concurrent.locks.LockSupport.park(java.base@22/LockSupport.java:221)
    at cats.effect.unsafe.WorkerThread.parkLoop$1(WorkerThread.scala:372)
    at cats.effect.unsafe.WorkerThread.park$1(WorkerThread.scala:334)
    at cats.effect.unsafe.WorkerThread.run(WorkerThread.scala:660)

"io-compute-3" #34 [226015] daemon prio=5 os_prio=0 cpu=20.35ms elapsed=28.54s tid=0x00007625f06aca40 nid=226015 waiting on condition  [0x00007625cc325000]
   java.lang.Thread.State: WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@22/Native Method)
    - parking to wait for  <0x000000060ec031a8> (a cats.effect.unsafe.WorkStealingThreadPool)
    at java.util.concurrent.locks.LockSupport.park(java.base@22/LockSupport.java:221)
    at cats.effect.unsafe.WorkerThread.parkLoop$1(WorkerThread.scala:372)
    at cats.effect.unsafe.WorkerThread.park$1(WorkerThread.scala:334)
    at cats.effect.unsafe.WorkerThread.run(WorkerThread.scala:660)

"io-compute-15" #35 [226016] daemon prio=5 os_prio=0 cpu=23.80ms elapsed=28.54s tid=0x00007625f06add10 nid=226016 waiting on condition  [0x00007625cc225000]
   java.lang.Thread.State: WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@22/Native Method)
    - parking to wait for  <0x000000060ec031a8> (a cats.effect.unsafe.WorkStealingThreadPool)
    at java.util.concurrent.locks.LockSupport.park(java.base@22/LockSupport.java:221)
    at cats.effect.unsafe.WorkerThread.parkLoop$1(WorkerThread.scala:372)
    at cats.effect.unsafe.WorkerThread.park$1(WorkerThread.scala:334)
    at cats.effect.unsafe.WorkerThread.run(WorkerThread.scala:660)

"io-compute-0" #36 [226028] daemon prio=5 os_prio=0 cpu=20.02ms elapsed=28.54s tid=0x00007625f06af070 nid=226028 waiting on condition  [0x00007625c75f4000]
   java.lang.Thread.State: WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@22/Native Method)
    - parking to wait for  <0x000000060ec031a8> (a cats.effect.unsafe.WorkStealingThreadPool)
    at java.util.concurrent.locks.LockSupport.park(java.base@22/LockSupport.java:221)
    at cats.effect.unsafe.WorkerThread.parkLoop$1(WorkerThread.scala:372)
    at cats.effect.unsafe.WorkerThread.park$1(WorkerThread.scala:334)
    at cats.effect.unsafe.WorkerThread.run(WorkerThread.scala:660)

"io-compute-4" #37 [226029] daemon prio=5 os_prio=0 cpu=31.28ms elapsed=28.54s tid=0x00007625f06b0210 nid=226029 waiting on condition  [0x00007625c74f4000]
   java.lang.Thread.State: WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@22/Native Method)
    - parking to wait for  <0x000000060ec031a8> (a cats.effect.unsafe.WorkStealingThreadPool)
    at java.util.concurrent.locks.LockSupport.park(java.base@22/LockSupport.java:221)
    at cats.effect.unsafe.WorkerThread.parkLoop$1(WorkerThread.scala:372)
    at cats.effect.unsafe.WorkerThread.park$1(WorkerThread.scala:334)
    at cats.effect.unsafe.WorkerThread.run(WorkerThread.scala:660)

"io-compute-5" #38 [226030] daemon prio=5 os_prio=0 cpu=20.82ms elapsed=28.54s tid=0x00007625f06b1290 nid=226030 waiting on condition  [0x00007625c73f4000]
   java.lang.Thread.State: WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@22/Native Method)
    - parking to wait for  <0x000000060ec031a8> (a cats.effect.unsafe.WorkStealingThreadPool)
    at java.util.concurrent.locks.LockSupport.park(java.base@22/LockSupport.java:221)
    at cats.effect.unsafe.WorkerThread.parkLoop$1(WorkerThread.scala:372)
    at cats.effect.unsafe.WorkerThread.park$1(WorkerThread.scala:334)
    at cats.effect.unsafe.WorkerThread.run(WorkerThread.scala:660)

"io-compute-blocker-11" #39 [226031] daemon prio=5 os_prio=0 cpu=6.77ms elapsed=28.54s tid=0x00007625f06b2450 nid=226031 in Object.wait()  [0x00007625c72f3000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait0(java.base@22/Native Method)
    - waiting on <0x000000060ec02c48> (a java.lang.Object)
    at java.lang.Object.wait(java.base@22/Object.java:375)
    at java.lang.Object.wait(java.base@22/Object.java:348)
    at doodle.java2d.effect.BlockingCircularQueue.take(BlockingCircularQueue.scala:68)
    - locked <0x000000060ec02c48> (a java.lang.Object)
    at doodle.java2d.effect.Canvas.pump$$anonfun$1(Canvas.scala:76)
    at doodle.java2d.effect.Canvas$$Lambda/0x000076256f2511e0.apply(Unknown Source)
    at cats.effect.IOFiberPlatform.liftedTree1$1(IOFiberPlatform.scala:66)
    at cats.effect.IOFiberPlatform.$anonfun$1(IOFiberPlatform.scala:72)
    at cats.effect.IOFiberPlatform.$anonfun$adapted$1(IOFiberPlatform.scala:110)
    at cats.effect.IOFiberPlatform$$Lambda/0x000076256f36cf20.apply(Unknown Source)
    at cats.effect.IOFiber.runLoop(IOFiber.scala:1004)
    at cats.effect.IOFiber.execR(IOFiber.scala:1362)
    at cats.effect.IOFiber.run(IOFiber.scala:112)
    at cats.effect.unsafe.WorkerThread.run(WorkerThread.scala:743)

"io-compute-blocker-12" #40 [226032] daemon prio=5 os_prio=0 cpu=19.80ms elapsed=28.54s tid=0x00007625f06b3ae0 nid=226032 in Object.wait()  [0x00007625c71f3000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait0(java.base@22/Native Method)
    - waiting on <no object reference available>
    at java.lang.Object.wait(java.base@22/Object.java:375)
    at java.lang.Object.wait(java.base@22/Object.java:348)
    at doodle.java2d.effect.BlockingCircularQueue.take(BlockingCircularQueue.scala:68)
    - locked <0x000000060ec00d40> (a java.lang.Object)
    at doodle.java2d.effect.Canvas.pump$$anonfun$1(Canvas.scala:76)
    at doodle.java2d.effect.Canvas$$Lambda/0x000076256f2511e0.apply(Unknown Source)
    at cats.effect.IOFiberPlatform.liftedTree1$1(IOFiberPlatform.scala:66)
    at cats.effect.IOFiberPlatform.$anonfun$1(IOFiberPlatform.scala:72)
    at cats.effect.IOFiberPlatform.$anonfun$adapted$1(IOFiberPlatform.scala:110)
    at cats.effect.IOFiberPlatform$$Lambda/0x000076256f36cf20.apply(Unknown Source)
    at cats.effect.IOFiber.runLoop(IOFiber.scala:1004)
    at cats.effect.IOFiber.execR(IOFiber.scala:1362)
    at cats.effect.IOFiber.run(IOFiber.scala:112)
    at cats.effect.unsafe.WorkerThread.run(WorkerThread.scala:743)

"io-compute-11" #41 [226033] daemon prio=5 os_prio=0 cpu=50.18ms elapsed=28.54s tid=0x00007625f06b51a0 nid=226033 waiting on condition  [0x00007625c70f4000]
   java.lang.Thread.State: WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@22/Native Method)
    - parking to wait for  <0x000000060ec031a8> (a cats.effect.unsafe.WorkStealingThreadPool)
    at java.util.concurrent.locks.LockSupport.park(java.base@22/LockSupport.java:221)
    at cats.effect.unsafe.WorkerThread.parkLoop$1(WorkerThread.scala:372)
    at cats.effect.unsafe.WorkerThread.park$1(WorkerThread.scala:334)
    at cats.effect.unsafe.WorkerThread.run(WorkerThread.scala:660)

"io-compute-8" #42 [226034] daemon prio=5 os_prio=0 cpu=35.32ms elapsed=28.54s tid=0x00007625f06b67b0 nid=226034 waiting on condition  [0x00007625c6ff4000]
   java.lang.Thread.State: WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@22/Native Method)
    - parking to wait for  <0x000000060ec031a8> (a cats.effect.unsafe.WorkStealingThreadPool)
    at java.util.concurrent.locks.LockSupport.park(java.base@22/LockSupport.java:221)
    at cats.effect.unsafe.WorkerThread.parkLoop$1(WorkerThread.scala:372)
    at cats.effect.unsafe.WorkerThread.park$1(WorkerThread.scala:334)
    at cats.effect.unsafe.WorkerThread.run(WorkerThread.scala:660)

"io-compute-14" #43 [226035] daemon prio=5 os_prio=0 cpu=27.82ms elapsed=28.54s tid=0x00007625f06b79d0 nid=226035 waiting on condition  [0x00007625c6ef4000]
   java.lang.Thread.State: WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@22/Native Method)
    - parking to wait for  <0x000000060ec031a8> (a cats.effect.unsafe.WorkStealingThreadPool)
    at java.util.concurrent.locks.LockSupport.park(java.base@22/LockSupport.java:221)
    at cats.effect.unsafe.WorkerThread.parkLoop$1(WorkerThread.scala:372)
    at cats.effect.unsafe.WorkerThread.park$1(WorkerThread.scala:334)
    at cats.effect.unsafe.WorkerThread.run(WorkerThread.scala:660)

"Java2D Disposer" #57 [226037] daemon prio=10 os_prio=0 cpu=0.60ms elapsed=28.30s tid=0x00007624f8069590 nid=226037 waiting on condition  [0x00007625c6b8c000]
   java.lang.Thread.State: WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@22/Native Method)
    - parking to wait for  <0x000000060ec03b88> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(java.base@22/LockSupport.java:371)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(java.base@22/AbstractQueuedSynchronizer.java:519)
    at java.util.concurrent.ForkJoinPool.unmanagedBlock(java.base@22/ForkJoinPool.java:4013)
    at java.util.concurrent.ForkJoinPool.managedBlock(java.base@22/ForkJoinPool.java:3961)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@22/AbstractQueuedSynchronizer.java:1707)
    at java.lang.ref.ReferenceQueue.await(java.base@22/ReferenceQueue.java:67)
    at java.lang.ref.ReferenceQueue.remove0(java.base@22/ReferenceQueue.java:158)
    at java.lang.ref.ReferenceQueue.remove(java.base@22/ReferenceQueue.java:234)
    at sun.java2d.Disposer.run(java.desktop@22/Disposer.java:145)
    at java.lang.Thread.runWith(java.base@22/Thread.java:1583)
    at java.lang.Thread.run(java.base@22/Thread.java:1570)

"AWT-XAWT" #58 [226038] daemon prio=6 os_prio=0 cpu=87.51ms elapsed=28.30s tid=0x00007624f800e440 nid=226038 runnable  [0x00007625c6a8c000]
   java.lang.Thread.State: RUNNABLE
    at sun.awt.X11.XToolkit.waitForEvents(java.desktop@22/Native Method)
    at sun.awt.X11.XToolkit.run(java.desktop@22/XToolkit.java:687)
    at sun.awt.X11.XToolkit.run(java.desktop@22/XToolkit.java:651)
    at java.lang.Thread.runWith(java.base@22/Thread.java:1583)
    at java.lang.Thread.run(java.base@22/Thread.java:1570)

"AWT-Shutdown" #60 [226039] prio=5 os_prio=0 cpu=0.08ms elapsed=28.30s tid=0x00007624f806c580 nid=226039 in Object.wait()  [0x00007625c698c000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait0(java.base@22/Native Method)
    - waiting on <0x000000060ec01fb8> (a java.lang.Object)
    at java.lang.Object.wait(java.base@22/Object.java:375)
    at java.lang.Object.wait(java.base@22/Object.java:348)
    at sun.awt.AWTAutoShutdown.run(java.desktop@22/AWTAutoShutdown.java:291)
    - locked <0x000000060ec01fb8> (a java.lang.Object)
    at java.lang.Thread.runWith(java.base@22/Thread.java:1583)
    at java.lang.Thread.run(java.base@22/Thread.java:1570)

"AWT-EventQueue-0" #59 [226040] prio=6 os_prio=0 cpu=433.99ms elapsed=28.30s tid=0x00007624f806d820 nid=226040 waiting on condition  [0x00007625c688b000]
   java.lang.Thread.State: WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@22/Native Method)
    - parking to wait for  <0x000000060ec03ce0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(java.base@22/LockSupport.java:371)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(java.base@22/AbstractQueuedSynchronizer.java:519)
    at java.util.concurrent.ForkJoinPool.unmanagedBlock(java.base@22/ForkJoinPool.java:4013)
    at java.util.concurrent.ForkJoinPool.managedBlock(java.base@22/ForkJoinPool.java:3961)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@22/AbstractQueuedSynchronizer.java:1707)
    at java.awt.EventQueue.getNextEvent(java.desktop@22/EventQueue.java:565)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(java.desktop@22/EventDispatchThread.java:190)
    at java.awt.EventDispatchThread.pumpEventsForFilter(java.desktop@22/EventDispatchThread.java:124)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(java.desktop@22/EventDispatchThread.java:113)
    at java.awt.EventDispatchThread.pumpEvents(java.desktop@22/EventDispatchThread.java:109)
    at java.awt.EventDispatchThread.pumpEvents(java.desktop@22/EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.run(java.desktop@22/EventDispatchThread.java:90)

"TimerQueue" #63 [226058] daemon prio=5 os_prio=0 cpu=244.30ms elapsed=28.17s tid=0x0000762450376650 nid=226058 waiting on condition  [0x00007625c5bfe000]
   java.lang.Thread.State: TIMED_WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@22/Native Method)
    - parking to wait for  <0x000000060ec05310> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.parkNanos(java.base@22/LockSupport.java:269)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(java.base@22/AbstractQueuedSynchronizer.java:1758)
    at java.util.concurrent.DelayQueue.take(java.base@22/DelayQueue.java:254)
    at javax.swing.TimerQueue.run(java.desktop@22/TimerQueue.java:165)
    at java.lang.Thread.runWith(java.base@22/Thread.java:1583)
    at java.lang.Thread.run(java.base@22/Thread.java:1570)

"io-compute-9" #64 [226060] daemon prio=5 os_prio=0 cpu=18.89ms elapsed=28.07s tid=0x00007624fc02a560 nid=226060 waiting on condition  [0x00007625c51fe000]
   java.lang.Thread.State: WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@22/Native Method)
    - parking to wait for  <0x000000060ec031a8> (a cats.effect.unsafe.WorkStealingThreadPool)
    at java.util.concurrent.locks.LockSupport.park(java.base@22/LockSupport.java:221)
    at cats.effect.unsafe.WorkerThread.parkLoop$1(WorkerThread.scala:372)
    at cats.effect.unsafe.WorkerThread.park$1(WorkerThread.scala:334)
    at cats.effect.unsafe.WorkerThread.run(WorkerThread.scala:660)

"io-compute-7" #65 [226061] daemon prio=5 os_prio=0 cpu=17.63ms elapsed=28.06s tid=0x000076248008f9b0 nid=226061 waiting on condition  [0x00007625c47fe000]
   java.lang.Thread.State: WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@22/Native Method)
    - parking to wait for  <0x000000060ec031a8> (a cats.effect.unsafe.WorkStealingThreadPool)
    at java.util.concurrent.locks.LockSupport.park(java.base@22/LockSupport.java:221)
    at cats.effect.unsafe.WorkerThread.parkLoop$1(WorkerThread.scala:372)
    at cats.effect.unsafe.WorkerThread.park$1(WorkerThread.scala:334)
    at cats.effect.unsafe.WorkerThread.run(WorkerThread.scala:660)

"io-compute-blocker-18" #66 [226062] daemon prio=5 os_prio=0 cpu=0.71ms elapsed=28.06s tid=0x000076248c084490 nid=226062 waiting on condition  [0x00007625c46fd000]
   java.lang.Thread.State: TIMED_WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@22/Native Method)
    - parking to wait for  <0x000000060eebb6c8> (a java.util.concurrent.LinkedTransferQueue)
    at java.util.concurrent.locks.LockSupport.parkNanos(java.base@22/LockSupport.java:410)
    at java.util.concurrent.LinkedTransferQueue$DualNode.await(java.base@22/LinkedTransferQueue.java:452)
    at java.util.concurrent.LinkedTransferQueue.xfer(java.base@22/LinkedTransferQueue.java:613)
    at java.util.concurrent.LinkedTransferQueue.poll(java.base@22/LinkedTransferQueue.java:1268)
    at cats.effect.unsafe.WorkerThread.run(WorkerThread.scala:455)

"io-compute-blocker-19" #67 [226063] daemon prio=5 os_prio=0 cpu=0.36ms elapsed=28.05s tid=0x000076250406aa10 nid=226063 waiting on condition  [0x00007625c45fd000]
   java.lang.Thread.State: TIMED_WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@22/Native Method)
    - parking to wait for  <0x000000060eebabe8> (a java.util.concurrent.LinkedTransferQueue)
    at java.util.concurrent.locks.LockSupport.parkNanos(java.base@22/LockSupport.java:410)
    at java.util.concurrent.LinkedTransferQueue$DualNode.await(java.base@22/LinkedTransferQueue.java:452)
    at java.util.concurrent.LinkedTransferQueue.xfer(java.base@22/LinkedTransferQueue.java:613)
    at java.util.concurrent.LinkedTransferQueue.poll(java.base@22/LinkedTransferQueue.java:1268)
    at cats.effect.unsafe.WorkerThread.run(WorkerThread.scala:455)

"VM Thread" os_prio=0 cpu=6.12ms elapsed=28.76s tid=0x00007625f0136390 nid=225994 runnable  

"GC Thread#0" os_prio=0 cpu=4.31ms elapsed=28.77s tid=0x00007625f00452d0 nid=225988 runnable  

"GC Thread#1" os_prio=0 cpu=6.98ms elapsed=28.54s tid=0x000076255c009310 nid=226017 runnable  

"GC Thread#2" os_prio=0 cpu=6.91ms elapsed=28.54s tid=0x000076255c009e90 nid=226018 runnable  

"GC Thread#3" os_prio=0 cpu=6.85ms elapsed=28.54s tid=0x000076255c00aa10 nid=226019 runnable  

"GC Thread#4" os_prio=0 cpu=4.37ms elapsed=28.54s tid=0x000076255c00b590 nid=226020 runnable  

"GC Thread#5" os_prio=0 cpu=6.85ms elapsed=28.54s tid=0x000076255c00c110 nid=226021 runnable  

"GC Thread#6" os_prio=0 cpu=4.44ms elapsed=28.54s tid=0x000076255c00ccc0 nid=226022 runnable  

"GC Thread#7" os_prio=0 cpu=4.74ms elapsed=28.54s tid=0x000076255c00d870 nid=226023 runnable  

"GC Thread#8" os_prio=0 cpu=2.28ms elapsed=28.54s tid=0x000076255c00e440 nid=226024 runnable  

"GC Thread#9" os_prio=0 cpu=6.85ms elapsed=28.54s tid=0x000076255c00f030 nid=226025 runnable  

"GC Thread#10" os_prio=0 cpu=4.31ms elapsed=28.54s tid=0x000076255c00fc20 nid=226026 runnable  

"GC Thread#11" os_prio=0 cpu=4.82ms elapsed=28.54s tid=0x000076255c010810 nid=226027 runnable  

"G1 Main Marker" os_prio=0 cpu=0.26ms elapsed=28.77s tid=0x00007625f0056230 nid=225989 runnable  

"G1 Conc#0" os_prio=0 cpu=2.64ms elapsed=28.77s tid=0x00007625f0057260 nid=225990 runnable  

"G1 Conc#1" os_prio=0 cpu=1.32ms elapsed=28.26s tid=0x00007625c0000ce0 nid=226052 runnable  

"G1 Conc#2" os_prio=0 cpu=1.22ms elapsed=28.26s tid=0x00007625c00018a0 nid=226053 runnable  

"G1 Refine#0" os_prio=0 cpu=0.08ms elapsed=28.76s tid=0x00007625f0100b10 nid=225991 runnable  

"G1 Service" os_prio=0 cpu=3.41ms elapsed=28.76s tid=0x00007625f0101b60 nid=225992 runnable  

"VM Periodic Task Thread" os_prio=0 cpu=26.17ms elapsed=28.76s tid=0x00007625f011baa0 nid=225993 waiting on condition  

JNI global refs: 91, weak refs: 6

Heap
 garbage-first heap   total reserved 8146944K, committed 49152K, used 25968K [0x000000060ec00000, 0x0000000800000000)
  region size 4096K, 6 young (24576K), 1 survivors (4096K)
 Metaspace       used 31307K, committed 31808K, reserved 1114112K
  class space    used 3323K, committed 3520K, reserved 1048576K