pixbuf leakage

"Walter C. Pelissero" <[email protected]> Fri, 25 Apr 2008 17:40:00 +0200
Newsgroups gmane.lisp.clg.devel
Message-ID <[email protected]>
The following code will leak memory but I couldn't quite find the hole.
The larger the loaded pixbuf/image the faster.

(gffi:defbinding (pixbuf-loader-write "gdk_pixbuf_loader_write") () boolean
  (loader gdk:pixbuf-loader)
  (buffer (vector (unsigned-byte 8)))
  ((length buffer) integer)
  (nil glib:gerror-signal :out))

(gffi:defbinding (pixbuf-loader-close "gdk_pixbuf_loader_close") () boolean
  (loader gdk:pixbuf-loader)
  (nil glib:gerror-signal :out))

(gffi:defbinding (pixbuf-loader-get-pixbuf "gdk_pixbuf_loader_get_pixbuf") () (glib:referenced gdk:pixbuf)
  (loader gdk:pixbuf-loader))

(gffi:defbinding (pixbuf-loader-set-size "gdk_pixbuf_loader_set_size") () nil
  (loader gdk:pixbuf-loader)
  (width integer)
  (height integer))

(defparameter *image* (make-instance 'image :width-request 128 :height-request 64))

(defun loader-test ()
  (let ((file "/home/wcp/pictures/scanned/archive/swan.jpg"))
    #+cmu (ext:gc :full t)
    #+sbcl (sb-ext:gc :full t)
    (let ((loader (make-instance 'gdk:pixbuf-loader)))
      (signal-connect loader 'size-prepared
		      #'(lambda (image-width image-height)
			  (declare (ignore image-width image-height))
			  (pixbuf-loader-set-size loader 128 64)
			  nil))
      (signal-connect loader 'area-prepared
		      #'(lambda ()
			  (setf (image-pixbuf *image*)
				(pixbuf-loader-get-pixbuf loader))
			  nil))
      (unwind-protect
	   (with-open-file (stream file :element-type '(unsigned-byte 8))
	     (let ((buffer (make-sequence '(vector (unsigned-byte 8)) (* 4 1024))))
	       (flet ((forward-buffer (&optional n)
			(pixbuf-loader-write loader (if n
							(subseq buffer 0 n)
							buffer))))
		 (loop
		    for n = (read-sequence buffer stream)
		    while (= n (length buffer))
		    do (forward-buffer)
		    finally (unless (zerop n)
			      (forward-buffer n))))))
	(ignore-errors
	  (pixbuf-loader-close loader))))))

(defun leak-memory ()
  (loop
     for i from 0
     do
       (format t "~A~%" i)
       (loader-test)))

Does anyone have suggestions?

-- 
walter pelissero
http://www.pelissero.de

-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Don't miss this year's exciting event. There's still time to save $100. 
Use priority code J8TL2D2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone