X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fpcl%2Fdefs.lisp;h=882a37faf146991a76b16baa97a400c8f13ca84c;hb=617d4fa1db5a4a11564e7c59bfb684c7eb25633d;hp=3bf72dbe3017273121ef9dcfda4a47711addf1fc;hpb=d8659f1e656234e8f0f47d5295b503dd6cff4aba;p=sbcl.git diff --git a/src/pcl/defs.lisp b/src/pcl/defs.lisp index 3bf72db..882a37f 100644 --- a/src/pcl/defs.lisp +++ b/src/pcl/defs.lisp @@ -571,10 +571,16 @@ (defvar *eql-specializer-table* (make-hash-table :test 'eql)) +(defvar *eql-specializer-table-lock* + (sb-thread::make-spinlock :name "EQL-specializer table lock")) + (defun intern-eql-specializer (object) - (or (gethash object *eql-specializer-table*) - (setf (gethash object *eql-specializer-table*) - (make-instance 'eql-specializer :object object)))) + ;; Need to lock, so that two threads don't get non-EQ specializers + ;; for an EQL object. + (sb-thread::with-spinlock (*eql-specializer-table-lock*) + (or (gethash object *eql-specializer-table*) + (setf (gethash object *eql-specializer-table*) + (make-instance 'eql-specializer :object object))))) (defclass class (dependent-update-mixin definition-source-mixin