diff --git a/module/ice-9/sports.scm b/module/ice-9/sports.scm index 37ea09221..86d9a5b06 100644 --- a/module/ice-9/sports.scm +++ b/module/ice-9/sports.scm @@ -309,13 +309,13 @@ (else (fill-directly pos)))))) (define (put-u8 port byte) - (when (port-random-access? port) - (flush-input port)) (let* ((buf (port-write-buffer port)) (bv (port-buffer-bytevector buf)) (end (port-buffer-end buf))) (unless (<= 0 end (bytevector-length bv)) (error "not an output port" port)) + (when (and (eq? (port-buffer-cur buf) end) (port-random-access? port)) + (flush-input port)) (bytevector-u8-set! bv end byte) (set-port-buffer-end! buf (1+ end)) (when (= (1+ end) (bytevector-length bv)) (flush-output port)))) @@ -324,14 +324,14 @@ (count (- (bytevector-length src) start))) (unless (<= 0 start (+ start count) (bytevector-length src)) (error "invalid start/count" start count)) - (when (port-random-access? port) - (flush-input port)) (let* ((buf (port-write-buffer port)) (bv (port-buffer-bytevector buf)) (size (bytevector-length bv)) (cur (port-buffer-cur buf)) (end (port-buffer-end buf)) (buffered (- end cur))) + (when (and (eq? cur end) (port-random-access? port)) + (flush-input port)) (cond ((<= size count) ;; The write won't fit in the buffer at all; write directly.