binding in go block causes thread binding error: "Pop without matching push"
Description
Environment
Clojure 1.8.0, core.async 0.2.374
Attachments
3
async-170-3.patch
09 Jan, 2020
async-170-2.patch
09 Jan, 2020
0001-ASYNC-170-update-binding-frame-on-loop-exit.patch
20 Sep, 2016
Activity
Alex Miller
January 10, 2020 at 6:47 PM
Released in 0.7.559
Alex Miller
January 9, 2020 at 10:28 PM
Patch applied
Kevin Downey
January 9, 2020 at 9:47 PM
The patch async-170-3.patch should apply cleanly to master and the tests should pass.
The issue was the arguments to ioc/state-machine had changed (crossing-env was introduced). I vaguely remember that being something that was done to to help with locals clearing, but how and why it works I don't recall, but blindly copying from the call to ioc/state-machine in the go macro to the park-runner macro seems to have fixed it.
Alex Miller
January 9, 2020 at 8:27 PM
@Kevin Downey I refreshed to master in async-170-2.patch but I get a compile error in the tests on `mvn clean test`, see below. Not immediately apparent to me why though.
[INFO] --- clojure-maven-plugin:1.7.1:test (clojure-test) @ core.async ---
Exception in thread "main" java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Symbol, compiling:(clojure/core/async/ioc_macros_test.clj:571:37)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6730)
at clojure.lang.Compiler.analyze(Compiler.java:6524)
at clojure.lang.Compiler.access$300(Compiler.java:38)
at clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:6129)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6723)
at clojure.lang.Compiler.analyze(Compiler.java:6524)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6711)
at clojure.lang.Compiler.analyze(Compiler.java:6524)
at clojure.lang.Compiler.analyze(Compiler.java:6485)
at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5861)
at clojure.lang.Compiler$TryExpr$Parser.parse(Compiler.java:2261)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6723)
at clojure.lang.Compiler.analyze(Compiler.java:6524)
at clojure.lang.Compiler.analyze(Compiler.java:6485)
at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5861)
at clojure.lang.Compiler$FnMethod.parse(Compiler.java:5296)
at clojure.lang.Compiler$FnExpr.parse(Compiler.java:3925)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6721)
at clojure.lang.Compiler.analyze(Compiler.java:6524)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6711)
at clojure.lang.Compiler.analyze(Compiler.java:6524)
at clojure.lang.Compiler.analyze(Compiler.java:6485)
at clojure.lang.Compiler$NewExpr$Parser.parse(Compiler.java:2614)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6723)
at clojure.lang.Compiler.analyze(Compiler.java:6524)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6711)
at clojure.lang.Compiler.analyze(Compiler.java:6524)
at clojure.lang.Compiler.access$300(Compiler.java:38)
at clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:6129)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6723)
at clojure.lang.Compiler.analyze(Compiler.java:6524)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6711)
at clojure.lang.Compiler.analyze(Compiler.java:6524)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6711)
at clojure.lang.Compiler.analyze(Compiler.java:6524)
at clojure.lang.Compiler.analyze(Compiler.java:6485)
at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5861)
at clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:6179)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6723)
at clojure.lang.Compiler.analyze(Compiler.java:6524)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6711)
at clojure.lang.Compiler.analyze(Compiler.java:6524)
at clojure.lang.Compiler.analyze(Compiler.java:6485)
at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5861)
at clojure.lang.Compiler$FnMethod.parse(Compiler.java:5296)
at clojure.lang.Compiler$FnExpr.parse(Compiler.java:3925)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6721)
at clojure.lang.Compiler.analyze(Compiler.java:6524)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6711)
at clojure.lang.Compiler.analyze(Compiler.java:6524)
at clojure.lang.Compiler.analyze(Compiler.java:6485)
at clojure.lang.Compiler$MapExpr.parse(Compiler.java:3050)
at clojure.lang.Compiler.analyze(Compiler.java:6532)
at clojure.lang.Compiler.analyze(Compiler.java:6485)
at clojure.lang.Compiler$DefExpr$Parser.parse(Compiler.java:576)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6723)
at clojure.lang.Compiler.analyze(Compiler.java:6524)
at clojure.lang.Compiler.analyze(Compiler.java:6485)
at clojure.lang.Compiler.eval(Compiler.java:6786)
at clojure.lang.Compiler.load(Compiler.java:7227)
at clojure.lang.RT.loadResourceScript(RT.java:371)
at clojure.lang.RT.loadResourceScript(RT.java:362)
at clojure.lang.RT.load(RT.java:446)
at clojure.lang.RT.load(RT.java:412)
at clojure.core$load$fn__5448.invoke(core.clj:5866)
at clojure.core$load.doInvoke(core.clj:5865)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.core$load_one.invoke(core.clj:5671)
at clojure.core$load_lib$fn__5397.invoke(core.clj:5711)
at clojure.core$load_lib.doInvoke(core.clj:5710)
at clojure.lang.RestFn.applyTo(RestFn.java:142)
at clojure.core$apply.invoke(core.clj:632)
at clojure.core$load_libs.doInvoke(core.clj:5749)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.core$apply.invoke(core.clj:632)
at clojure.core$require.doInvoke(core.clj:5832)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at com.theoryinpractise.clojure.testrunner$eval41$iter__42__46$fn__47$fn__48.invoke(run-test5844155138159159255.clj:22)
at com.theoryinpractise.clojure.testrunner$eval41$iter__42__46$fn__47.invoke(run-test5844155138159159255.clj:21)
at clojure.lang.LazySeq.sval(LazySeq.java:40)
at clojure.lang.LazySeq.seq(LazySeq.java:49)
at clojure.lang.RT.seq(RT.java:507)
at clojure.core$seq__4128.invoke(core.clj:137)
at clojure.core$dorun.invoke(core.clj:3009)
at com.theoryinpractise.clojure.testrunner$eval41.invoke(run-test5844155138159159255.clj:21)
at clojure.lang.Compiler.eval(Compiler.java:6782)
at clojure.lang.Compiler.load(Compiler.java:7227)
at clojure.lang.Compiler.loadFile(Compiler.java:7165)
at clojure.main$load_script.invoke(main.clj:275)
at clojure.main$script_opt.invoke(main.clj:337)
at clojure.main$main.doInvoke(main.clj:421)
at clojure.lang.RestFn.invoke(RestFn.java:421)
at clojure.lang.Var.invoke(Var.java:383)
at clojure.lang.AFn.applyToHelper(AFn.java:156)
at clojure.lang.Var.applyTo(Var.java:700)
at clojure.main.main(main.java:37)
Caused by: java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Symbol
at clojure.lang.RT.seqFrom(RT.java:528)
at clojure.lang.RT.seq(RT.java:509)
at clojure.lang.RT.vals(RT.java:592)
at clojure.core$vals.invoke(core.clj:1494)
at clojure.core.async.impl.ioc_macros$nested_go_QMARK_.invoke(ioc_macros.clj:1055)
at clojure.core.async.impl.ioc_macros$state_machine.invoke(ioc_macros.clj:1103)
at clojure.core.async.ioc_macros_test$park_runner.doInvoke(ioc_macros_test.clj:557)
at clojure.lang.RestFn.invoke(RestFn.java:442)
at clojure.lang.Var.invoke(Var.java:388)
at clojure.lang.AFn.applyToHelper(AFn.java:160)
at clojure.lang.Var.applyTo(Var.java:700)
at clojure.lang.Compiler.macroexpand1(Compiler.java:6631)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6709)
... 95 more
Alex Miller
August 9, 2017 at 8:57 PM
@UNKNOWN_USER I've added you to the appropriate groups to allow you to edit tickets.
Fixed
Details
Details
Assignee
Unassigned
UnassignedReporter
import
importApproval
Triaged
Patch
Code and Test
Priority

Created May 26, 2016 at 7:22 PM
Updated January 10, 2020 at 6:47 PM
Resolved January 9, 2020 at 10:28 PM
Reproduced in https://github.com/whilo/async-binding.
(def ^:dynamic *foo* nil) (defn -main [& args] (go (binding [*foo* nil] (<! (go 42)) (println "done."))) (Thread/sleep 30000)) $ lein uberjar $ java -jar ... done. Exception in thread "async-dispatch-3" java.lang.IllegalStateException: Pop without matching push at clojure.lang.Var.popThreadBindings(Var.java:331) at clojure.core$pop_thread_bindings.invokeStatic(core.clj:1839) at clojure.core$pop_thread_bindings.invoke(core.clj:1839) at async_binding.core$_main$fn__6354$state_machine__4495__auto____6355$fn__6357.invoke(core.clj:8) at async_binding.core$_main$fn__6354$state_machine__4495__auto____6355.invoke(core.clj:8) at clojure.core.async.impl.ioc_macros$run_state_machine.invokeStatic(ioc_macros.clj:1011) at clojure.core.async.impl.ioc_macros$run_state_machine.invoke(ioc_macros.clj:1010) at clojure.core.async.impl.ioc_macros$run_state_machine_wrapped.invokeStatic(ioc_macros.clj:1015) at clojure.core.async.impl.ioc_macros$run_state_machine_wrapped.invoke(ioc_macros.clj:1013) at clojure.core.async.impl.ioc_macros$take_BANG_$fn__4511.invoke(ioc_macros.clj:1024) at clojure.core.async.impl.channels.ManyToManyChannel$fn__313$fn__314.invoke(channels.clj:95) at clojure.lang.AFn.run(AFn.java:22) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745)