X-Git-Url: http://git.kpe.io/?p=kmrcl.git;a=blobdiff_plain;f=macros.lisp;h=46894ba5e6fc82e3fc728c8cf2ea5688617e8e85;hp=5b7286590fa0e18647629f14171e3ffdb3c99a5c;hb=2f65fd6d93691f3943182138efd2013c3fdb67c7;hpb=e1c2b781af8e10e078ab95920ce0208eb9f5e6bf diff --git a/macros.lisp b/macros.lisp index 5b72865..46894ba 100644 --- a/macros.lisp +++ b/macros.lisp @@ -215,3 +215,21 @@ ,element-type) ,table-name) (cons buffer buffers)))))))) +(defmacro def-cached-instance (name) + (let* ((new-name (concat-symbol "new-" name "-instance")) + (release-name (concat-symbol "release-" name "-instance")) + (cache-name (concat-symbol "*cached-" name "-instance-table*")) + (lock-name (concat-symbol "*cached-" name "-instance-lock*"))) + `(eval-when (:compile-toplevel :load-toplevel :execute) + (defvar ,cache-name nil) + (defvar ,lock-name (kmrcl::make-lock ',name)) + + (defun ,new-name () + (kmrcl::with-lock-held (,lock-name) + (if ,cache-name + (pop ,cache-name) + (make-instance ',name)))) + + (defun ,release-name (instance) + (kmrcl::with-lock-held (,lock-name) + (push instance ,cache-name))))))