Hi Russell,
This doesn't look like a core.async specific problem, but rather the
more general problem that protocols and records are not reload safe.
What I believe is happening is the TimeoutQueueEntry type is being
recompiled when you do reload all but old instances with the older
compilation remain in core.async's DelayQueue.
In order to fix this you would need to recreate the internal DelayQueue
that core.async uses to store the timeouts. Luckily, this will happen
for you automatically if you use tools.namespace and adopt a workflow as
explained by Stuart Sierra in this blog post:
http://thinkrelevance.com/blog/2013/06/04/clojure-workflow-reloaded
Keep in mind that this remove any timeouts you may be awaiting on but I
think that is probably the desired effect since you are trying to get a
clean state of the system.
HTH,
Ben
On 9/27/13 11:49 AM, Russell Christopher wrote:
Anyone encountered after a few reloads at the repl core.async stops
working.?
Thanks
(ns repl.core
(:require [clojure.core.async :refer :all])) ;;0.1.0-SNAPSHOT
(defn producer[c]
(Thread/sleep 1000)
(go (>! c true))
(println "sleeping")
(Thread/sleep 10000))
(defn consumer [c]
(let [res (alts!! [c (timeout 2000)])]
(if (= c (second res))
(println "true")
(println "timeout"))))
(defn main []
(let [c (chan)]
(future (producer c))
(consumer c)))
nREPL server started on port 50616 on host 127.0.0.1
REPL-y 0.2.1
Clojure 1.5.0
Docs: (doc function-name-here)
(find-doc "part-of-name-here")
Source: (source function-name-here)
Javadoc: (javadoc java-object-or-class-here)
Exit: Control+D or (exit) or (quit)
user=> (require '[repl.core :as r] :reload-all)
nil
user=> (r/main)
sleeping
true
nil
user=> (require '[repl.core :as r] :reload-all)
nil
user=> (r/main)
sleeping
true
nil
user=> Exception in thread "clojure.core.async.timers/timeout-daemon"
java.lang.ClassCastException: clojure.core.async.i
mpl.timers.TimeoutQueueEntry cannot be cast to
clojure.core.async.impl.timers.TimeoutQueueEntry
at
clojure.core.async.impl.timers$timeout_worker.invoke(timers.clj:61)
at clojure.lang.AFn.run(AFn.java:24)
at java.lang.Thread.run(Unknown Source)
user=> (require '[repl.core :as r] :reload-all)
nil
user=> (r/main)
sleeping
true
nil
user=> (require '[repl.core :as r] :reload-all)
nil
user=> (r/main)
ClassCastException clojure.core.async.impl.timers.TimeoutQueueEntry
cannot be cast to clojure.core.async.impl.timers.Tim
eoutQueueEntry clojure.core.async.impl.timers.TimeoutQueueEntry
(timers.clj:33)
user=> sleeping
--
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient
with your first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send
an email to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.
--
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.