From 44d4d740a529f5e7823e15bb8a2f279d1c62bf6a Mon Sep 17 00:00:00 2001 From: Stelian Ionescu Date: Tue, 15 Jul 2008 18:32:02 +0200 Subject: [PATCH] Add more granular buffer locking. Signed-off-by: Stelian Ionescu --- io.streams/zeta/buffer.lisp | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/io.streams/zeta/buffer.lisp b/io.streams/zeta/buffer.lisp index 67b4258..c7b087b 100644 --- a/io.streams/zeta/buffer.lisp +++ b/io.streams/zeta/buffer.lisp @@ -63,10 +63,20 @@ (defmethod device-read ((device buffer) buffer start end &optional timeout) (when (= start end) (return-from device-read 0)) - (if (buffer-synchronized-p device) - (bt:with-lock-held ((iobuf-lock (input-buffer-of device))) - (read-octets/buffered device buffer start end timeout)) - (read-octets/buffered device buffer start end timeout))) + (cond + ((buffer-synchronized-p device) + (flet ((%read-octets () + (bt:with-lock-held ((iobuf-lock (input-buffer-of device))) + (read-octets/buffered device buffer start end 0)))) + (let ((nbytes (%read-octets))) + (cond + ((and (not (eql timeout 0)) + (eql nbytes 0)) + (wait-for-input (input-handle-of device) timeout) + (%read-octets)) + (t nbytes))))) + (t + (read-octets/buffered device buffer start end timeout)))) (defun read-octets/buffered (device vector start end timeout) (declare (type buffer device) @@ -119,10 +129,20 @@ (defmethod device-write ((device buffer) buffer start end &optional timeout) (when (= start end) (return-from device-write 0)) - (if (buffer-synchronized-p device) - (bt:with-lock-held ((iobuf-lock (output-buffer-of device))) - (write-octets/buffered device buffer start end timeout)) - (write-octets/buffered device buffer start end timeout))) + (cond + ((buffer-synchronized-p device) + (flet ((%write-octets () + (bt:with-lock-held ((iobuf-lock (output-buffer-of device))) + (write-octets/buffered device buffer start end 0)))) + (let ((nbytes (%write-octets))) + (cond + ((and (not (eql timeout 0)) + (eql nbytes 0)) + (wait-for-output (output-handle-of device) timeout) + (%write-octets)) + (t nbytes))))) + (t + (write-octets/buffered device buffer start end timeout)))) (defun write-octets/buffered (device vector start end timeout) (declare (type buffer device) -- 2.11.4.GIT