When you call the `timeout` fn you are modifying the state of core.async's global queue and map. The global state for core.async's timer is defonced[1] and so you need to destroy the entire ns before reloading it. This is what tools.namespace will do instead of a simple reload where the defonce value would not be touched.

-Ben


1. https://github.com/clojure/core.async/blob/master/src/main/clojure/clojure/core/async/impl/timers.clj#L17-L21

On 9/27/13 12:18 PM, Russell Christopher wrote:
Hi Ben,

But the example doesn't have any state in def's, hence I thought it did conform to Stuart's workflow. In my (more) real app I am trying to follow his workflow protocol and it was reloading fine but now is not maybe i need to read the link again,

Thanks


On Fri, Sep 27, 2013 at 2:06 PM, Ben Mabey <b...@benmabey.com <mailto:b...@benmabey.com>> wrote:

    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
        <mailto: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
        <mailto:clojure%2bunsubscr...@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
        <mailto:clojure%2bunsubscr...@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
    <mailto: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
    <mailto:clojure%2bunsubscr...@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
    <mailto:clojure%2bunsubscr...@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.

--
--
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.

Reply via email to