From psmith at common-lisp.net Sat Sep 30 20:08:52 2006 From: psmith at common-lisp.net (psmith at common-lisp.net) Date: Sat, 30 Sep 2006 16:08:52 -0400 (EDT) Subject: [nio-cvs] r2 - Message-ID: <20060930200852.456A81A087@common-lisp.net> Author: psmith Date: Sat Sep 30 16:08:51 2006 New Revision: 2 Modified: async-fd.lisp Log: Applied mem leak patch Modified: async-fd.lisp ============================================================================== --- async-fd.lisp (original) +++ async-fd.lisp Sat Sep 30 16:08:51 2006 @@ -181,12 +181,13 @@ (defun close-async-fd (async-fd) "Close ASYNC-FD's fd after everything has been written from write-queue." - (with-slots (write-queue read-fd write-fd) async-fd + (with-slots (write-queue read-fd write-fd foreign-read-buffer) async-fd (cond ;; if write-queue is emtpy, close now ((null write-queue) (close-fd read-fd) + (foreign-free foreign-read-buffer) (unless (= read-fd write-fd) (close-fd write-fd))) ;; data in write-queue, mark as closing @@ -213,11 +214,16 @@ (unless (= written size) (return))))) - ;; remove entries that have been fully written - (setf write-queue (remove-if #'(lambda (x) - (with-slots (size written) x - (= size written))) - write-queue)) + ;; remove (and dealloc buffers) of entries that have been fully written + (let ((unfinished-entries NIL)) + (setf write-queue + (nreverse + (dolist (entry write-queue unfinished-entries) + (with-slots (size written) entry + (if (= size written) + (with-slots (buffer) entry + (foreign-free buffer)) + (push entry unfinished-entries))))))) ;; if queue empty and close pending, close fd (if (and (null write-queue) (slot-value async-fd 'close-pending))