X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Ftypep.lisp;h=43acfdfdb561b0d6a83105885897ecf2b9f4e4de;hb=a160917364f85b38dc0826a5e3dcef87e3c4c62c;hp=bcc2934d65ce9c94f629d46b054fca4970278ed8;hpb=edf8d3701ba59bd9f0c1bd027f3179b98250cfd0;p=sbcl.git diff --git a/src/code/typep.lisp b/src/code/typep.lisp index bcc2934..43acfdf 100644 --- a/src/code/typep.lisp +++ b/src/code/typep.lisp @@ -178,6 +178,14 @@ ;;; Test whether OBJ-LAYOUT is from an instance of CLASSOID. (defun classoid-typep (obj-layout classoid object) (declare (optimize speed)) + ;; FIXME & KLUDGE: We could like to grab the *WORLD-LOCK* here (to ensure that + ;; class graph doesn't change while we're doing the typep test), but in + ;; pratice that causes trouble -- deadlocking against the compiler + ;; if compiler output (or macro, or compiler-macro expansion) causes + ;; another thread to do stuff. Not locking is a shoddy bandaid as it is remains + ;; easy to trigger the same problem using a different code path -- but in practice + ;; locking here makes Slime unusable with :SPAWN in post *WORLD-LOCK* world. So... + ;; -- NS 2008-12-16 (multiple-value-bind (obj-layout layout) (do ((layout (classoid-layout classoid) (classoid-layout classoid)) (i 0 (+ i 1)) @@ -188,7 +196,7 @@ (aver (< i 2)) (when (layout-invalid obj-layout) (setq obj-layout (update-object-layout-or-invalid object layout))) - (ensure-classoid-valid classoid layout)) + (%ensure-classoid-valid classoid layout)) (let ((obj-inherits (layout-inherits obj-layout))) (or (eq obj-layout layout) (dotimes (i (length obj-inherits) nil)