X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Ffinal.lisp;h=fc807f47aa3e644a54cf50cb97887d6b62347501;hb=95591ed483dbb8c0846c129953acac1554f28809;hp=c2ef070664eacc010ded303b484315c2b3219cd4;hpb=afb56ab2865fdb72102a9bb6b2c846b7b5a6ad7e;p=sbcl.git diff --git a/src/code/final.lisp b/src/code/final.lisp index c2ef070..fc807f4 100644 --- a/src/code/final.lisp +++ b/src/code/final.lisp @@ -11,15 +11,14 @@ (in-package "SB!IMPL") -(defvar *finalizer-store* nil) +(defglobal **finalizer-store** nil) -(defvar *finalizer-store-lock* +(defglobal **finalizer-store-lock** (sb!thread:make-mutex :name "Finalizer store lock.")) (defmacro with-finalizer-store-lock (&body body) - `(sb!thread::call-with-system-mutex (lambda () ,@body) - *finalizer-store-lock* - t)) + `(sb!thread::with-system-mutex (**finalizer-store-lock** :without-gcing t) + ,@body)) (defun finalize (object function &key dont-save) #!+sb-doc @@ -71,13 +70,13 @@ Examples: (error "Cannot finalize NIL.")) (with-finalizer-store-lock (push (list (make-weak-pointer object) function dont-save) - *finalizer-store*)) + **finalizer-store**)) object) (defun deinit-finalizers () ;; remove :dont-save finalizers (with-finalizer-store-lock - (setf *finalizer-store* (delete-if #'third *finalizer-store*))) + (setf **finalizer-store** (delete-if #'third **finalizer-store**))) nil) (defun cancel-finalization (object) @@ -87,8 +86,8 @@ Examples: ;; run. (when object (with-finalizer-store-lock - (setf *finalizer-store* - (delete object *finalizer-store* + (setf **finalizer-store** + (delete object **finalizer-store** :key (lambda (list) (weak-pointer-value (car list)))))) object)) @@ -96,12 +95,12 @@ Examples: (defun run-pending-finalizers () (let (pending) (with-finalizer-store-lock - (setf *finalizer-store* + (setf **finalizer-store** (delete-if (lambda (list) (when (null (weak-pointer-value (car list))) (push (second list) pending) t)) - *finalizer-store*))) + **finalizer-store**))) ;; We want to run the finalizer bodies outside the lock in case ;; finalization of X causes finalization to be added for Y. (dolist (fun pending)