Skip to content

Instantly share code, notes, and snippets.

@maxweber
Last active September 24, 2023 16:39
Show Gist options
  • Save maxweber/66faec4a2c10396cb1e5e917c89dd593 to your computer and use it in GitHub Desktop.
Save maxweber/66faec4a2c10396cb1e5e917c89dd593 to your computer and use it in GitHub Desktop.
(comment
;; Starting the REPL with `clojure -J-Djdk.tracePinnedThreads=full -J--enable-preview ...`
(.start (Thread/ofVirtual)
(fn []
(doall
;; LazySeq:
(map
(fn [n]
(Thread/sleep 1)
n)
(range 1)))))
;; Thread[#30579,ForkJoinPool-1-worker-30,5,CarrierThreads]
;; java.base/java.lang.VirtualThread$VThreadContinuation.onPinned(VirtualThread.java:183)
;; java.base/jdk.internal.vm.Continuation.onPinned0(Continuation.java:398)
;; java.base/jdk.internal.vm.Continuation.yield0(Continuation.java:390)
;; java.base/jdk.internal.vm.Continuation.yield(Continuation.java:357)
;; java.base/java.lang.VirtualThread.yieldContinuation(VirtualThread.java:428)
;; java.base/java.lang.VirtualThread.parkNanos(VirtualThread.java:599)
;; java.base/java.lang.VirtualThread.doSleepNanos(VirtualThread.java:777)
;; java.base/java.lang.VirtualThread.sleepNanos(VirtualThread.java:750)
;; java.base/java.lang.Thread.sleep(Thread.java:470)
;; user$eval115091$fn__115092$fn__115093.invoke(NO_SOURCE_FILE:62)
;; clojure.core$map$fn__5935.invoke(core.clj:2770)
;; clojure.lang.LazySeq.sval(LazySeq.java:42) <== monitors:1
;; clojure.lang.LazySeq.seq(LazySeq.java:51) <== monitors:1
;; clojure.lang.RT.seq(RT.java:535)
;; clojure.core$seq_
(.start (Thread/ofVirtual)
(fn []
@(delay (Thread/sleep 1))))
;; Thread[#30592,ForkJoinPool-1-worker-31,5,CarrierThreads]
;; java.base/java.lang.VirtualThread$VThreadContinuation.onPinned(VirtualThread.java:183)
;; java.base/jdk.internal.vm.Continuation.onPinned0(Continuation.java:398)
;; java.base/jdk.internal.vm.Continuation.yield0(Continuation.java:390)
;; java.base/jdk.internal.vm.Continuation.yield(Continuation.java:357)
;; java.base/java.lang.VirtualThread.yieldContinuation(VirtualThread.java:428)
;; java.base/java.lang.VirtualThread.parkNanos(VirtualThread.java:599)
;; java.base/java.lang.VirtualThread.doSleepNanos(VirtualThread.java:777)
;; java.base/java.lang.VirtualThread.sleepNanos(VirtualThread.java:750)
;; java.base/java.lang.Thread.sleep(Thread.java:470)
;; user$eval115420$fn__115421$fn__115422.invoke(NO_SOURCE_FILE:85)
;; clojure.lang.Delay.deref(Delay.java:42) <== monitors:1
;; clojure.core$deref.invokeStatic(core.clj:2337)
;; clojure.core$deref.invoke(core.clj:2323)
;; user$eval115420$fn__115421.invoke(NO_SOURCE_FILE:84)
(.start (Thread/ofVirtual)
(fn []
(first
(enumeration-seq
(reify java.util.Enumeration
(hasMoreElements [this] true)
(nextElement [this]
(Thread/sleep 1)
true))))))
;; Thread[#30603,ForkJoinPool-1-worker-33,5,CarrierThreads]
;; java.base/java.lang.VirtualThread$VThreadContinuation.onPinned(VirtualThread.java:183)
;; java.base/jdk.internal.vm.Continuation.onPinned0(Continuation.java:398)
;; java.base/jdk.internal.vm.Continuation.yield0(Continuation.java:390)
;; java.base/jdk.internal.vm.Continuation.yield(Continuation.java:357)
;; java.base/java.lang.VirtualThread.yieldContinuation(VirtualThread.java:428)
;; java.base/java.lang.VirtualThread.parkNanos(VirtualThread.java:599)
;; java.base/java.lang.VirtualThread.doSleepNanos(VirtualThread.java:777)
;; java.base/java.lang.VirtualThread.sleepNanos(VirtualThread.java:750)
;; java.base/java.lang.Thread.sleep(Thread.java:470)
;; user$eval116290$fn$reify__116292.nextElement(NO_SOURCE_FILE:111)
;; clojure.lang.EnumerationSeq.first(EnumerationSeq.java:52) <== monitors:1
;; clojure.lang.RT.first(RT.java:692)
;; clojure.core$first__5449.invokeStatic(core.clj:55)
;; clojure.core$first__5449.invoke(core.clj:55)
(.start (Thread/ofVirtual)
(fn []
(alter-meta! (atom nil)
(fn [meta]
(Thread/sleep 1)
meta))))
;; Thread[#30611,ForkJoinPool-1-worker-34,5,CarrierThreads]
;; java.base/java.lang.VirtualThread$VThreadContinuation.onPinned(VirtualThread.java:183)
;; java.base/jdk.internal.vm.Continuation.onPinned0(Continuation.java:398)
;; java.base/jdk.internal.vm.Continuation.yield0(Continuation.java:390)
;; java.base/jdk.internal.vm.Continuation.yield(Continuation.java:357)
;; java.base/java.lang.VirtualThread.yieldContinuation(VirtualThread.java:428)
;; java.base/java.lang.VirtualThread.parkNanos(VirtualThread.java:599)
;; java.base/java.lang.VirtualThread.doSleepNanos(VirtualThread.java:777)
;; java.base/java.lang.VirtualThread.sleepNanos(VirtualThread.java:750)
;; java.base/java.lang.Thread.sleep(Thread.java:470)
;; user$eval116601$fn__116602$fn__116603.invoke(NO_SOURCE_FILE:135)
;; clojure.lang.AFn.applyToHelper(AFn.java:154)
;; clojure.lang.AFn.applyTo(AFn.java:144)
;; clojure.lang.AReference.alterMeta(AReference.java:31) <== monitors:1
;; clojure.core$alter_meta_BANG_.invokeStatic(core.clj:2431)
(.start (Thread/ofVirtual)
(fn []
(let [a (agent {}
:validator
(fn [state]
(Thread/sleep 1)
true))]
(send a inc)
(Thread/sleep 1) ;; (await ...) blocks forever here
(restart-agent a
{}))
))
;; Thread[#31859,ForkJoinPool-1-worker-50,5,CarrierThreads]
;; java.base/java.lang.VirtualThread$VThreadContinuation.onPinned(VirtualThread.java:183)
;; java.base/jdk.internal.vm.Continuation.onPinned0(Continuation.java:398)
;; java.base/jdk.internal.vm.Continuation.yield0(Continuation.java:390)
;; java.base/jdk.internal.vm.Continuation.yield(Continuation.java:357)
;; java.base/java.lang.VirtualThread.yieldContinuation(VirtualThread.java:428)
;; java.base/java.lang.VirtualThread.parkNanos(VirtualThread.java:599)
;; java.base/java.lang.VirtualThread.doSleepNanos(VirtualThread.java:777)
;; java.base/java.lang.VirtualThread.sleepNanos(VirtualThread.java:750)
;; java.base/java.lang.Thread.sleep(Thread.java:470)
;; user$eval202942$fn__202943$fn__202944.invoke(NO_SOURCE_FILE:159)
;; clojure.lang.ARef.validate(ARef.java:32)
;; clojure.lang.ARef.validate(ARef.java:46)
;; clojure.lang.Agent.restart(Agent.java:212) <== monitors:1
;; clojure.core$restart_agent.invokeStatic(core.clj:2209)
(.start (Thread/ofVirtual)
(fn []
(def v
1)
(alter-var-root #'v
(fn [x]
(Thread/sleep 1)
x))
))
;; Thread[#31967,ForkJoinPool-1-worker-53,5,CarrierThreads]
;; java.base/java.lang.VirtualThread$VThreadContinuation.onPinned(VirtualThread.java:183)
;; java.base/jdk.internal.vm.Continuation.onPinned0(Continuation.java:398)
;; java.base/jdk.internal.vm.Continuation.yield0(Continuation.java:390)
;; java.base/jdk.internal.vm.Continuation.yield(Continuation.java:357)
;; java.base/java.lang.VirtualThread.yieldContinuation(VirtualThread.java:428)
;; java.base/java.lang.VirtualThread.parkNanos(VirtualThread.java:599)
;; java.base/java.lang.VirtualThread.doSleepNanos(VirtualThread.java:777)
;; java.base/java.lang.VirtualThread.sleepNanos(VirtualThread.java:750)
;; java.base/java.lang.Thread.sleep(Thread.java:470)
;; user$eval207626$fn__207627$fn__207628.invoke(NO_SOURCE_FILE:189)
;; clojure.lang.AFn.applyToHelper(AFn.java:154)
;; clojure.lang.AFn.applyTo(AFn.java:144)
;; clojure.lang.Var.alterRoot(Var.java:308) <== monitors:1
;; clojure.core$alter_var_root.invokeStatic(core.clj:5535)
(.start (Thread/ofVirtual)
(fn []
(first
(clojure.lang.IteratorSeq/create
(reify java.util.Iterator
(forEachRemaining [this action])
(hasNext [this] true)
(next [this]
(Thread/sleep 1)
1)
(remove [this]))))
))
;; Thread[#32758,ForkJoinPool-1-worker-55,5,CarrierThreads]
;; java.base/java.lang.VirtualThread$VThreadContinuation.onPinned(VirtualThread.java:183)
;; java.base/jdk.internal.vm.Continuation.onPinned0(Continuation.java:398)
;; java.base/jdk.internal.vm.Continuation.yield0(Continuation.java:390)
;; java.base/jdk.internal.vm.Continuation.yield(Continuation.java:357)
;; java.base/java.lang.VirtualThread.yieldContinuation(VirtualThread.java:428)
;; java.base/java.lang.VirtualThread.parkNanos(VirtualThread.java:599)
;; java.base/java.lang.VirtualThread.doSleepNanos(VirtualThread.java:777)
;; java.base/java.lang.VirtualThread.sleepNanos(VirtualThread.java:750)
;; java.base/java.lang.Thread.sleep(Thread.java:470)
;; user$eval270562$fn$reify__270564.next(NO_SOURCE_FILE:217)
;; clojure.lang.IteratorSeq.first(IteratorSeq.java:50) <== monitors:1
;; clojure.lang.RT.first(RT.java:692)
;; clojure.core$first__5449.invokeStatic(core.clj:55)
;; clojure.core$first__5449.invoke(core.clj:55)
;; user$eval270562$fn__2
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment