On Thu, Nov 26, 2009 at 02:50:09PM -0800, David Brown wrote:

>I'm writing some fairly complex code involving lazy sequences.  I
>appear to be getting a space leak from what looks like something that
>is still holding a reference to the head of the sequence.

Ok, I found the leak.  I guess I'd call it a compiler problem.  I
haven't been able to narrow it down any further than the code below
(any simpler, and it doesn't cause the problem).

Basically, the with-open causes the generation of a closure which
captures the value of 'coll', which it hangs onto throughout the
lifetime of the call to 'write-mapping' which is what walks through
the entire collection.

For now, I'll do without the with-open, since in this particular case,
errors are going to be fairly fatal anyway.

Should I file a ticket about this?

I'm running 1.1.0-alpha-SNAPSHOT, 20091113040146, from
build.clojure.org.

David Brown

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(ns leak1)
(import '[java.io FileOutputStream BufferedOutputStream DataOutputStream])

(defn make-name [& _])
(defn make-tmp-name [& _])
(defn store-properties [& _])
(defn write-mapping [& _])
(defn get-codec [& _])
(defn raise[& _])
(def error nil)

;;; The generated code creates a 'fn' class for the body of the
;;; with-open.  This class binds several of the names, including
;;; 'coll', which it keeps through the lifetime of the function.
(defn- store-index-file
   [index idx props coll]
   (let [path (make-name index idx)
         tmp-path (make-tmp-name path)
         fos (FileOutputStream. tmp-path)
         bos (BufferedOutputStream. fos)]
     (with-open [dos (DataOutputStream. bos)]
       (store-properties dos (assoc props :version "1.0"))
       (write-mapping dos (get-codec index) coll)
       (.flush bos)
       ;; Calls fsync to make sure data gets written to disk.
       (.force (.getChannel fos) true))
     (when-not (.renameTo tmp-path path)
       (raise error
              (str "Unable to rename pool index file:" tmp-path " to " path)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

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

Reply via email to