X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fpcl%2Flow.lisp;h=34537ac7d6ab1fde3402236e8f18bd5bd8529664;hb=df679ed627975948b1cee190f4d79c397588c43e;hp=5007007bbc8459281a667c55fe8bb9158818f7d8;hpb=a736ac10b709b2d40305f0a6e3764afd246a8ef5;p=sbcl.git diff --git a/src/pcl/low.lisp b/src/pcl/low.lisp index 5007007..34537ac 100644 --- a/src/pcl/low.lisp +++ b/src/pcl/low.lisp @@ -97,7 +97,7 @@ (import 'sb-kernel:funcallable-instance-p) -(defun set-funcallable-instance-fun (fin new-value) +(defun set-funcallable-instance-function (fin new-value) (declare (type function new-value)) (aver (funcallable-instance-p fin)) (setf (funcallable-instance-fun fin) new-value)) @@ -360,3 +360,33 @@ (defun structure-slotd-init-form (slotd) (dsd-default slotd)) + +;;; WITH-PCL-LOCK is used around some forms that were previously +;;; protected by WITHOUT-INTERRUPTS, but in a threaded SBCL we don't +;;; have a useful WITHOUT-INTERRUPTS. In an unthreaded SBCL I'm not +;;; sure what the desired effect is anyway: should we be protecting +;;; against the possibility of recursive calls into these functions +;;; or are we using WITHOUT-INTERRUPTS as WITHOUT-SCHEDULING? +;;; +;;; Users: FORCE-CACHE-FLUSHES, MAKE-INSTANCES-OBSOLETE. Note that +;;; it's not all certain this is sufficent for threadsafety: do we +;;; just have to protect against simultaneous calls to these mutators, +;;; or actually to stop normal slot access etc at the same time as one +;;; of them runs + +#+sb-thread +(progn +(defstruct spinlock (value 0)) +(defvar *pcl-lock* (make-spinlock)) + +(defmacro with-pcl-lock (&body body) + `(progn + (sb-thread::get-spinlock *pcl-lock* 1 (sb-thread::current-thread-id)) + (unwind-protect + (progn ,@body) + (setf (spinlock-value *pcl-lock*) 0)))) +);progn + +#-sb-thread +(defmacro with-pcl-lock (&body body) + `(progn ,@body))