Files
CLASH/src/main/buffer.cl

47 lines
1.2 KiB
Common Lisp

;;;; CLASH --- The Common Lisp Adaptable Simple HTTP server
;;;; This is copyrighted software. See documentation for terms.
;;;;
;;;; buffer.cl --- Efficient I/O and buffer handling
;;;;
;;;; Checkout Tag: $Name$
;;;; $Id$
(in-package :CLASH)
;;;; %File Description:
;;;;
;;;;
;;;;
(defvar *default-io-buffer-size* 16384
"Default size of newly created I/O buffers. This can be tuned to
server needs.")
(defvar *io-buffers* nil
"List of available I/O Buffers.")
(defun make-new-buffer ()
"Create a new I/O buffer for use by get-io-buffer."
(make-string *default-io-buffer-size*))
(defun get-io-buffer ()
"Get an available I/O buffer. This should be released after use
with `release-io-buffer', to enable it to be recycled. Otherwise it
will just be GC'ed as usual."
(or
(pop-atomically *io-buffers*)
;; No ready-made buffer, so we create a new one
(make-new-buffer)))
(defun release-io-buffer (buffer)
"Return a buffer allocated by `get-io-buffer' to the buffer pool for
re-use."
(push-atomically buffer *io-buffers*)
t)
(defmacro with-io-buffer ((var) &body body)
`(let ((,var (get-io-buffer)))
(declare (type simple-string ,var))
(unwind-protect (progn ,@body)
(release-io-buffer ,var))))