0.8.15.15: Removing non-ANSI FTYPE proclaims and TYPE declarares from PCL
[sbcl.git] / src / pcl / low.lisp
index 5007007..ea468f4 100644 (file)
@@ -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))
 (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))