+
+(with-test (:name :interrupt-io-unnamed-pipe)
+ (let (result)
+ (labels
+ ((reader (fd)
+ (let ((stream (sb-sys:make-fd-stream fd
+ :element-type :default
+ :serve-events nil)))
+ (time
+ (let ((ok (handler-case
+ (catch 'stop
+ (progn
+ (read-char stream)
+ (sleep 0.1)
+ (sleep 0.1)
+ (sleep 0.1)))
+ (error (c)
+ c))))
+ (setf result ok)
+ (progn
+ (format *trace-output* "~&=> ~A~%" ok)
+ (force-output *trace-output*))))
+ (sleep 2)
+ (ignore-errors (close stream))))
+
+ (writer ()
+ (multiple-value-bind (read write)
+ (sb-unix:unix-pipe)
+ (let* ((reader (sb-thread:make-thread (lambda () (reader read))))
+ (stream (sb-sys:make-fd-stream write
+ :output t
+ :element-type :default
+ :serve-events nil))
+ (ok :ok))
+ (sleep 1)
+ (sb-thread:interrupt-thread reader (lambda ()
+ (print :throwing)
+ (force-output)
+ (throw 'stop ok)))
+ (sleep 1)
+ (setf ok :not-ok)
+ (write-char #\x stream)
+ (close stream)
+ (sb-thread:join-thread reader)))))
+ (writer))
+ (assert (eq result :ok))))
+
+(with-test (:name :thread-alloca)
+ (sb-ext:run-program "sh"
+ '("run-compiler.sh" "-sbcl-pic" "-sbcl-shared"
+ "alloca.c" "-o" "alloca.so")
+ :search t)
+ (load-shared-object (truename "alloca.so"))
+
+ (alien-funcall (extern-alien "alloca_test" (function void)))
+ (sb-thread:join-thread
+ (sb-thread:make-thread
+ (lambda ()
+ (alien-funcall (extern-alien "alloca_test" (function void)))))))
+
+(with-test (:name :fp-mode-inheritance-threads)
+ (flet ((test ()
+ (let ((thread-fp-mode)
+ (fp-mode (dpb 0 sb-vm::float-sticky-bits (sb-vm:floating-point-modes))))
+ (sb-thread:join-thread
+ (sb-thread:make-thread
+ (lambda ()
+ (setf thread-fp-mode
+ (dpb 0 sb-vm::float-sticky-bits (sb-vm:floating-point-modes))))))
+ (assert (= fp-mode thread-fp-mode)))))
+ (test)
+ (sb-int:with-float-traps-masked (:divide-by-zero)
+ (test))
+ (setf (sb-vm:floating-point-modes)
+ (dpb sb-vm:float-divide-by-zero-trap-bit
+ sb-vm::float-traps-byte
+ (sb-vm:floating-point-modes)))
+ (test)))