[Openmcl-cvs-notifications] r13972 - /trunk/source/level-1/linux-files.lisp

gb at clozure.com gb at clozure.com
Sat Jul 17 05:19:58 CDT 2010


Author: gb
Date: Sat Jul 17 05:19:58 2010
New Revision: 13972

Log:
Lisp side of WAIT-FOR-SIGNAL.

Modified:
    trunk/source/level-1/linux-files.lisp

Modified: trunk/source/level-1/linux-files.lisp
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/source/level-1/linux-files.lisp (original)
+++ trunk/source/level-1/linux-files.lisp Sat Jul 17 05:19:58 2010
@@ -170,6 +170,42 @@
   "Atomically increment the count of a given semaphore."
   (%signal-semaphore-ptr (semaphore-value s)))
 =

+(defun %timed-wait-for-signal (signo seconds millis)
+  (let* ((status (ff-call
+                  (%kernel-import target::kernel-import-wait-for-signal)
+                  :int signo
+                  :unsigned seconds
+                  :unsigned millis
+                  :int)))
+    (values (eql status 0) status)))
+
+(defun wait-for-signal (s duration)
+  (or (%timed-wait-for-signal s 0 0)
+      (with-process-whostate ("signal wait")
+        (let* ((now (get-internal-real-time))
+               (stop (+ now (floor (* duration internal-time-units-per-sec=
ond)))))
+          (multiple-value-bind (secs millis) (milliseconds duration)
+            (loop
+              (multiple-value-bind (success err)
+                  (progn
+                    (%timed-wait-for-signal s secs millis))
+                (when success
+                  (return t))
+                (if (or (eql err #$ETIMEDOUT)
+                        (>=3D (setq now (get-internal-real-time)) stop))
+                  (return nil)
+                  (unless (eql err #$EINTR)
+                    (error "Error waiting for signal ~d: ~a." s (%strerror=
 err))))
+                (when (or (not (eql err #$EINTR))
+                          (>=3D (setq now (get-internal-real-time)) stop))
+                  (return nil))
+                (unless (zerop duration)
+                  (let* ((diff (- stop now)))
+                    (multiple-value-bind (remaining-seconds remaining-itus)
+                        (floor diff internal-time-units-per-second)
+                      (setq secs remaining-seconds
+                            millis (floor remaining-itus (/ internal-time-=
units-per-second 1000)))))))))))))
+  =

 (defun %os-getcwd (buf noctets)
   ;; Return N < 0, if error
   ;;        N < noctets: success, string is of length N (octets).



More information about the Openmcl-cvs-notifications mailing list