Skip to content

Commit

Permalink
Configurable stream buffer size
Browse files Browse the repository at this point in the history
  • Loading branch information
phmarek committed Apr 11, 2020
1 parent e34b390 commit 5d1b5e1
Showing 1 changed file with 28 additions and 14 deletions.
42 changes: 28 additions & 14 deletions src/code/fd-stream.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -66,19 +66,27 @@
:dont-save t)
buffer)))

(defun get-buffer ()
(or (and *available-buffers* (atomic-pop *available-buffers*))
(alloc-buffer)))

(defun get-buffer (stream)
(let ((buffer-size (fd-stream-desired-buffer-size stream))
(cache (if buffer-size
*available-buffers*
(fd-stream-buffer-list stream))))
(or (and (atomic-pop cache))
(alloc-buffer :size (or buffer-size +bytes-per-buffer+)))))


(declaim (inline reset-buffer))
(defun reset-buffer (buffer)
(setf (buffer-head buffer) 0
(buffer-tail buffer) 0)
buffer)

(defun release-buffer (buffer)
(defun release-buffer (stream buffer)
(reset-buffer buffer)
(atomic-push buffer *available-buffers*))
(if (fd-stream-desired-buffer-size stream)
(atomic-push buffer (fd-stream-buffer-list stream))
(atomic-push buffer *available-buffers*)))


;;;; the FD-STREAM structure
Expand Down Expand Up @@ -135,6 +143,9 @@
;; T if serve-event is allowed when this stream blocks
(serve-events nil :type boolean)

;; Only used for non-standard buffer sizes
(desired-buffer-size nil :type (or null fixnum))
(buffer-list nil :type list)
;; the input buffer
(instead (make-array 0 :element-type 'character :adjustable t :fill-pointer t) :type (array character (*)))
(ibuf nil :type (or buffer null))
Expand Down Expand Up @@ -169,13 +180,13 @@
(defun release-fd-stream-buffers (fd-stream)
(awhen (fd-stream-ibuf fd-stream)
(setf (fd-stream-ibuf fd-stream) nil)
(release-buffer it))
(release-buffer fd-stream it))
(awhen (fd-stream-obuf fd-stream)
(setf (fd-stream-obuf fd-stream) nil)
(release-buffer it))
(release-buffer fd-stream it))
(dolist (buf (fd-stream-output-queue fd-stream))
(when (buffer-p buf)
(release-buffer buf)))
(release-buffer fd-stream buf)))
(setf (fd-stream-output-queue fd-stream) nil))

;;;; FORM-TRACKING-STREAM
Expand Down Expand Up @@ -330,7 +341,7 @@
(aver (fd-stream-serve-events stream))
(let ((queue (fd-stream-output-queue stream))
(later (list (or (fd-stream-obuf stream) (bug "Missing obuf."))))
(new (get-buffer)))
(new (get-buffer stream)))
;; Important: before putting the buffer on queue, give the stream
;; a new one. If we get an interrupt and unwind losing the buffer
;; is relatively OK, but having the same buffer in two places
Expand Down Expand Up @@ -368,7 +379,7 @@
(cond ((eql count length)
;; Complete write, see if we can do another right
;; away, or remove the handler if we're done.
(release-buffer buffer)
(release-buffer stream buffer)
(cond ((fd-stream-output-queue stream)
(setf not-first-p t)
(go :pop-buffer))
Expand Down Expand Up @@ -1755,19 +1766,19 @@
(if output-p
(if obuf
(reset-buffer obuf)
(setf (fd-stream-obuf fd-stream) (get-buffer)))
(setf (fd-stream-obuf fd-stream) (get-buffer fd-stream)))
(when obuf
(setf (fd-stream-obuf fd-stream) nil)
(release-buffer obuf))))
(release-buffer fd-stream obuf))))

(let ((ibuf (fd-stream-ibuf fd-stream)))
(if input-p
(if ibuf
(reset-buffer ibuf)
(setf (fd-stream-ibuf fd-stream) (get-buffer)))
(setf (fd-stream-ibuf fd-stream) (get-buffer fd-stream)))
(when ibuf
(setf (fd-stream-ibuf fd-stream) nil)
(release-buffer ibuf))))
(release-buffer fd-stream ibuf))))

;; FIXME: Why only for output? Why unconditionally?
(when output-p
Expand Down Expand Up @@ -2241,6 +2252,7 @@
timeout
file
original
desired-buffer-size
delete-original
pathname
input-buffer-p
Expand Down Expand Up @@ -2273,6 +2285,7 @@
:delete-original delete-original
:pathname pathname
:buffering buffering
:desired-buffer-size desired-buffer-size
:dual-channel-p dual-channel-p
:element-mode element-mode
:serve-events serve-events
Expand Down Expand Up @@ -2373,6 +2386,7 @@
(overlapped t)
&aux ; Squelch assignment warning.
(filename filename)
desired-buffer-size ; see also franz.com extensions-to-open3
(direction direction)
(if-does-not-exist if-does-not-exist)
(if-exists if-exists))
Expand Down

0 comments on commit 5d1b5e1

Please sign in to comment.