X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fpcl%2Flow.lisp;h=ea468f4aaf2ddecdc0a67699e84e73e64a5ad8d7;hb=f705c517d8606a9a72edd11a96725f9c4e4be93d;hp=5007007bbc8459281a667c55fe8bb9158818f7d8;hpb=a736ac10b709b2d40305f0a6e3764afd246a8ef5;p=sbcl.git diff --git a/src/pcl/low.lisp b/src/pcl/low.lisp index 5007007..ea468f4 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)) @@ -219,12 +219,12 @@ (defun intern-fun-name (name) (cond ((symbolp name) name) ((listp name) - (intern (let ((*package* *pcl-package*) - (*print-case* :upcase) - (*print-pretty* nil) - (*print-gensym* t)) - (format nil "~S" name)) - *pcl-package*)))) + (let ((*package* *pcl-package*) + (*print-case* :upcase) + (*print-pretty* nil) + (*print-gensym* t)) + (format-symbol *pcl-package* "~S" name))))) + ;;; FIXME: probably no longer needed after init (defmacro precompile-random-code-segments (&optional system) @@ -351,12 +351,44 @@ (defun structure-slotd-reader-function (slotd) (fdefinition (dsd-accessor-name slotd))) -(defun structure-slotd-writer-function (slotd) - (unless (dsd-read-only slotd) - (fdefinition `(setf ,(dsd-accessor-name slotd))))) +(defun structure-slotd-writer-function (type slotd) + (if (dsd-read-only slotd) + (let ((dd (get-structure-dd type))) + (coerce (slot-setter-lambda-form dd slotd) 'function)) + (fdefinition `(setf ,(dsd-accessor-name slotd))))) (defun structure-slotd-type (slotd) (dsd-type slotd)) (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))