Poll for repl startup.

Still some prompt I/O wackiness with evaling long-running forms.
This commit is contained in:
Phil Hagelberg 2010-05-27 11:48:18 -10:00
parent f7cf22c010
commit 18d5290f93

View file

@ -27,22 +27,28 @@
(clojure.main/repl ~@init-form)) (clojure.main/repl ~@init-form))
(.close server#))))) (.close server#)))))
(defn connect-to-repl [port] (defn copy-out [reader]
(Thread/sleep 3000) ;; TODO: poll (Thread/sleep 100)
(let [socket (Socket. "localhost" port) (.write *out* (.read reader))
reader (InputStreamReader. (.getInputStream socket)) (while (.ready reader)
writer (OutputStreamWriter. (.getOutputStream socket)) (.write *out* (.read reader)))
copy-out #(do (while (.ready reader) (flush))
(Thread/sleep 100)
(.write *out* (.read reader))) (defn- connect-to-repl [reader writer]
(flush))] (copy-out reader)
(loop [] (.write writer (str (pr-str (read)) "\n"))
(dotimes [_ 2] (copy-out)) (.flush writer)
(.write writer (str (pr-str (read)) "\n")) (recur reader writer))
(.flush writer)
(recur)))) (defn- poll-for-socket [port]
(Thread/sleep 100)
(try (let [socket (Socket. "localhost" port)]
(connect-to-repl (InputStreamReader. (.getInputStream socket))
(OutputStreamWriter. (.getOutputStream socket))))
(catch java.net.ConnectException _))
(recur port))
(defn repl [project] (defn repl [project]
(let [port (+ 1024 (rand-int 32000))] (let [port (+ 1024 (rand-int 32000))]
(.start (Thread. #(eval-in-project project (repl-form project port)))) (.start (Thread. #(eval-in-project project (repl-form project port))))
(connect-to-repl port))) (poll-for-socket port)))