(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))
(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)))))
+
\f
;;; FIXME: probably no longer needed after init
(defmacro precompile-random-code-segments (&optional system)
(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))