r8844: laptop updates
[kmrcl.git] / macros.lisp
index 5b7286590fa0e18647629f14171e3ffdb3c99a5c..9b6150a470dc9597470fe8ad2ba8e303e9c3e853 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))))))
+
+(defmacro with-ignore-errors (&rest forms)
+  `(progn
+     ,@(mapcar
+       (lambda (x) (list 'ignore-errors x))
+       forms)))