47 lines
1.2 KiB
Common Lisp
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))))
|