Author: psmith Date: Sat Mar 17 20:07:13 2007 New Revision: 106
Modified: branches/home/psmith/restructure/src/io/async-fd.lisp branches/home/psmith/restructure/src/io/nio-server.lisp Log: Corrected return from connect and utilised write eagain in async-fd
Modified: branches/home/psmith/restructure/src/io/async-fd.lisp ============================================================================== --- branches/home/psmith/restructure/src/io/async-fd.lisp (original) +++ branches/home/psmith/restructure/src/io/async-fd.lisp Sat Mar 17 20:07:13 2007 @@ -129,7 +129,9 @@ ((error-number :initarg :error)))
(defun write-more (async-fd) - "Write data from ASYNC-FD's write bytebuffer" + "Write data from ASYNC-FD's foreign-write-buffer to the network \ + Leaves foreign-write-buffer in state ready to be written to \ + Sets write-ready appropriatly" #+nio-debug (format-log t "async-fd:write-more - called with ~A~%" async-fd) (with-slots (write-fd foreign-write-buffer close-pending) async-fd #+nio-debug (format t "async-fd:write-more - foreign-write-buffer b4 flip ~A~%" foreign-write-buffer) @@ -143,21 +145,24 @@ (when (not (eql now-written -1)) (inc-position foreign-write-buffer now-written) (incf total-written now-written))) -#+nio-debug (format t "async-fd:write-more - after write :foreign-write-buffer ~A :now-written ~A :total-written ~A ~%" foreign-write-buffer now-written total-written)) - (if (eql now-written -1) +#+nio-debug (format t "async-fd:write-more - after write :foreign-write-buffer ~A :now-written ~A :total-written ~A ~%" foreign-write-buffer now-written total-written) + ) + + (when (eql now-written -1) ;;Deal with failure (let ((err (get-errno))) - (format t "write-more - write returned -1 :errno ~A~%" err) - (unless (eql err 11) ;; eagain - failed to write whole buffer need to wait for next notify - (perror) - (let ((err-cond (make-instance 'write-error :error err))) - (close-fd (write-fd async-fd)); - deal with in nio-server? - (error err-cond)))) - ;;update buffers - (if (eql (remaining foreign-write-buffer) 0) - (clear foreign-write-buffer) - (error 'not-implemented-yet)))) - +#+nio-debug (format t "write-more - write returned -1 :errno ~A~%" err) + (if (eql err 11) ;; eagain - failed to write whole buffer need to wait for next notify + (setf (write-ready async-fd) nil) + (progn + (perror) + (let ((err-cond (make-instance 'write-error :error err))) + (close-fd (write-fd async-fd)); - deal with in nio-server? + (error err-cond)))))) + ;;update buffers + (if (eql (remaining foreign-write-buffer) 0) + (clear foreign-write-buffer) + (compact foreign-write-buffer))) #+nio-debug (format t "write buffer after write :~A~%" foreign-write-buffer) (when (eql (buffer-position foreign-write-buffer) 0) (when close-pending (close-async-fd async-fd)))))
Modified: branches/home/psmith/restructure/src/io/nio-server.lisp ============================================================================== --- branches/home/psmith/restructure/src/io/nio-server.lisp (original) +++ branches/home/psmith/restructure/src/io/nio-server.lisp Sat Mar 17 20:07:13 2007 @@ -50,10 +50,14 @@ (when (> (buffer-position (foreign-read-buffer async-fd)) 0) (process-read async-fd)) ;process-writes - (process-write async-fd) - (when (and (write-ready async-fd) - (> (buffer-position (foreign-write-buffer async-fd)) 0)) - (write-more async-fd)) + (loop + (when (and (write-ready async-fd) (> (buffer-position (foreign-write-buffer async-fd)) 0)) + (write-more async-fd)) + (when (write-ready async-fd) + (assert (eql (buffer-position (foreign-write-buffer async-fd)) 0)) + (process-write async-fd)) + (unless (and (write-ready async-fd) (> (buffer-position (foreign-write-buffer async-fd)) 0)) (return))) + ;process normal close (when (close-pending async-fd) (write-more async-fd) @@ -192,7 +196,8 @@ (return-from connect sm)) (progn (format t "Connect failed!!~A ~%" (get-errno)) - (close-fd sock))))) + (close-fd sock) + nil))))
(defun add-connection(node) (nio-utils:add +connected-sockets-queue+ node)) \ No newline at end of file