;;;; 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))))