Skip to content

Commit

Permalink
Allow to override stream buffer size with a special variable as well.
Browse files Browse the repository at this point in the history
  • Loading branch information
phmarek committed Apr 11, 2020
1 parent 5d1b5e1 commit ddb3caa
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 35 deletions.
2 changes: 2 additions & 0 deletions contrib/sb-simple-streams/package.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
(:import-from #:sb-kernel #:ansi-stream #:charpos #:line-length)
(:import-from #:sb-gray #:fundamental-stream)
(:import-from #:sb-impl
#:*bytes-per-buffer*
#:in-stream-from-designator #:out-stream-from-designator)
;; FIXME: Using deffoo! or equivalent might be nicer.
(:implement #:common-lisp #:sb-kernel #:sb-int)
Expand Down Expand Up @@ -54,6 +55,7 @@
#:WITH-STREAM-CLASS #:SM #:FUNCALL-STM-HANDLER
#:FUNCALL-STM-HANDLER-2 #:ADD-STREAM-INSTANCE-FLAGS
#:REMOVE-STREAM-INSTANCE-FLAGS
#:*BYTES-PER-BUFFER*
;; User-level functions (mostly reexported from COMMON-LISP)
#:PARSE-FILESPEC #:DEFINE-FILESPEC #:DEFAULT-OPEN-CLASS #:OPEN
#:CLOSE #:READ-BYTE #:READ-CHAR #:READ-CHAR-NO-HANG #:UNREAD-CHAR
Expand Down
76 changes: 41 additions & 35 deletions src/code/fd-stream.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -54,39 +54,8 @@
(defconstant +bytes-per-buffer+ (* 4 1024)
"Default number of bytes per buffer.")

(defun alloc-buffer (&optional (size +bytes-per-buffer+))
;; Don't want to allocate & unwind before the finalizer is in place.
(without-interrupts
(let* ((sap (allocate-system-memory size))
(buffer (%make-buffer sap size)))
(when (zerop (sap-int sap))
(error "Could not allocate ~D bytes for buffer." size))
(finalize buffer (lambda ()
(deallocate-system-memory sap size))
:dont-save t)
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 (stream buffer)
(reset-buffer buffer)
(if (fd-stream-desired-buffer-size stream)
(atomic-push buffer (fd-stream-buffer-list stream))
(atomic-push buffer *available-buffers*)))
(defparameter *bytes-per-buffer* nil
"Overrides +BYTES-PER-BUFFER+ for newly created streams.")


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

;; Only used for non-standard buffer sizes
;; both only used for non-standard buffer sizes
(desired-buffer-size nil :type (or null fixnum))
(buffer-list nil :type list)
;; the input buffer
Expand Down Expand Up @@ -189,6 +158,40 @@
(release-buffer fd-stream buf)))
(setf (fd-stream-output-queue fd-stream) nil))

(defun alloc-buffer (&optional (size +bytes-per-buffer+))
;; Don't want to allocate & unwind before the finalizer is in place.
(without-interrupts
(let* ((sap (allocate-system-memory size))
(buffer (%make-buffer sap size)))
(when (zerop (sap-int sap))
(error "Could not allocate ~D bytes for buffer." size))
(finalize buffer (lambda ()
(deallocate-system-memory sap size))
:dont-save t)
buffer)))

(defun get-buffer (stream)
(let ((buffer-size (fd-stream-desired-buffer-size stream)))
(or (if buffer-size
(and (fd-stream-buffer-list stream)
(atomic-pop (fd-stream-buffer-list stream)))
(and *available-buffers*
(atomic-pop *available-buffers*)))
(alloc-buffer (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 (stream buffer)
(reset-buffer buffer)
(if (fd-stream-desired-buffer-size stream)
(atomic-push buffer (fd-stream-buffer-list stream))
(atomic-push buffer *available-buffers*)))


;;;; FORM-TRACKING-STREAM

;; The compiler uses this to record for each input subform the start and
Expand Down Expand Up @@ -2285,7 +2288,9 @@
:delete-original delete-original
:pathname pathname
:buffering buffering
:desired-buffer-size desired-buffer-size
:desired-buffer-size (or desired-buffer-size
*bytes-per-buffer*
+bytes-per-buffer+)
:dual-channel-p dual-channel-p
:element-mode element-mode
:serve-events serve-events
Expand Down Expand Up @@ -2550,6 +2555,7 @@
:dual-channel-p nil
:serve-events nil
:input-buffer-p t
:desired-buffer-size desired-buffer-size
:auto-close t))
(:probe
(let ((stream
Expand Down

0 comments on commit ddb3caa

Please sign in to comment.