r8075: add def-cached-instance
authorKevin M. Rosenberg <kevin@rosenberg.net>
Wed, 29 Oct 2003 07:23:51 +0000 (07:23 +0000)
committerKevin M. Rosenberg <kevin@rosenberg.net>
Wed, 29 Oct 2003 07:23:51 +0000 (07:23 +0000)
macros.lisp
package.lisp

index 5b7286590fa0e18647629f14171e3ffdb3c99a5c..46894ba5e6fc82e3fc728c8cf2ea5688617e8e85 100644 (file)
                                    ,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))))))
index dd95e3c75e6bf36d4742db348ac93baaaff66faf..eeaf204cdb9f282dfff107e9a0d79de1b1e4bca2 100644 (file)
    #:mv-bind
    #:deflex
    #:def-cached-vector
+   #:def-cached-instance
    
    ;; files.lisp
    #:print-file-contents