1.0.9.45: cleaner & thread-safe pv-table interning
[sbcl.git] / src / code / unix.lisp
index 4c2bc79..a5e583f 100644 (file)
@@ -295,19 +295,19 @@ SYSCALL-FORM. Repeat evaluation of SYSCALL-FORM if it is interrupted."
 (defun unix-write (fd buf offset len)
   (declare (type unix-fd fd)
            (type (unsigned-byte 32) offset len))
-  (int-syscall ("write" int (* char) int)
-               fd
-               (with-alien ((ptr (* char) (etypecase buf
-                                            ((simple-array * (*))
-                                             ;; This SAP-taking is
-                                             ;; safe as BUF remains
-                                             ;; either in a register
-                                             ;; or on stack.
-                                             (vector-sap buf))
-                                            (system-area-pointer
-                                             buf))))
-                 (addr (deref ptr offset)))
-               len))
+  (flet ((%write (sap)
+           (declare (system-area-pointer sap))
+           (int-syscall ("write" int (* char) int)
+                        fd
+                        (with-alien ((ptr (* char) sap))
+                          (addr (deref ptr offset)))
+                        len)))
+    (etypecase buf
+      ((simple-array * (*))
+       (with-pinned-objects (buf)
+         (%write (vector-sap buf))))
+      (system-area-pointer
+       (%write buf)))))
 
 ;;; Set up a unix-piping mechanism consisting of an input pipe and an
 ;;; output pipe. Return two values: if no error occurred the first
@@ -660,7 +660,7 @@ SYSCALL-FORM. Repeat evaluation of SYSCALL-FORM if it is interrupted."
   (struct wrapped_stat
     (st-dev #!-(or mips largefile) unsigned-int
             #!+mips unsigned-long
-            #!+largefile dev-t)
+            #!+(and largefile (not mips)) dev-t)
     (st-ino ino-t)
     (st-mode mode-t)
     (st-nlink nlink-t)
@@ -668,7 +668,7 @@ SYSCALL-FORM. Repeat evaluation of SYSCALL-FORM if it is interrupted."
     (st-gid gid-t)
     (st-rdev #!-(or mips largefile) unsigned-int
              #!+mips unsigned-long
-             #!+largefile dev-t)
+             #!+(and largefile (not mips)) dev-t)
     (st-size #!-(or darwin mips largefile) unsigned-int
              #!+(or darwin mips largefile) off-t)
     #!+(and darwin)