One liner repro:
clj -Sdeps '{:deps {techascent/tech.resource {:mvn/version "5.09"}}}' -M -e "(require (quote [tech.v3.resource.stack :as s])) (alter-var-root (var s/*resource-debug-double-free*) (constantly true)) (s/track (Object.) (fn []))"
Output:
true
Execution error (ClassCastException) at tech.v3.resource.stack/track (stack.clj:46).
class java.util.ArrayList cannot be cast to class java.util.concurrent.Future (java.util.ArrayList and java.util.concurrent.Future are in module java.base of loader 'bootstrap')
Potential fix:
--- a/src/tech/v3/resource/stack.clj
+++ b/src/tech/v3/resource/stack.clj
@@ -43,7 +43,7 @@
itself. Else the dispose function is tracked."
([item dispose-fn]
(when (and *resource-debug-double-free*
- (some #(identical? item %) @*resource-context*))
+ (some #(identical? item (first %)) *resource-context*))
(throw (ex-info "Duplicate track detected; this will result in a double free"
{:item item})))
(when-not *bound-resource-context?*
When change noted above is applied
clj -Sdeps '{:deps {techascent/tech.resource {:local/root "/path/to/local/tech.resource"}}}' -M -e "(require (quote [tech.v3.resource.stack :as s])) (alter-var-root (var s/*resource-debug-double-free*) (constantly true)) (let [o (Object.)] (s/track o (fn [])) (println \"first track OK\") (s/track o (fn [])))"
Output:
true
Apr 17, 2026 10:10:08 PM clojure.tools.logging$eval449$fn__452 invoke
WARNING: Stack resource tracking used but no resource context bound.
This is probably a memory leak.
first track OK
Execution error (ExceptionInfo) at tech.v3.resource.stack/track (stack.clj:47).
Duplicate track detected; this will result in a double free
Is this flag meant to still be supported?
One liner repro:
clj -Sdeps '{:deps {techascent/tech.resource {:mvn/version "5.09"}}}' -M -e "(require (quote [tech.v3.resource.stack :as s])) (alter-var-root (var s/*resource-debug-double-free*) (constantly true)) (s/track (Object.) (fn []))"Output:
Potential fix:
When change noted above is applied
clj -Sdeps '{:deps {techascent/tech.resource {:local/root "/path/to/local/tech.resource"}}}' -M -e "(require (quote [tech.v3.resource.stack :as s])) (alter-var-root (var s/*resource-debug-double-free*) (constantly true)) (let [o (Object.)] (s/track o (fn [])) (println \"first track OK\") (s/track o (fn [])))"Output:
Is this flag meant to still be supported?