agenda: Handle wrong-type-arg in select.
[8sync.git] / 8sync / agenda.scm
index 1d2515607b7d932598b3f3e7c9742f74fbfcbd21..7a76ebf5837359951d964726380aac86fe1c3df7 100644 (file)
@@ -1,5 +1,5 @@
 ;;; 8sync --- Asynchronous programming for Guile
-;;; Copyright (C) 2015, 2016 Christopher Allan Webber <cwebber@dustycloud.org>
+;;; Copyright © 2015, 2016, 2017 Christopher Allan Webber <cwebber@dustycloud.org>
 ;;;
 ;;; This file is part of 8sync.
 ;;;
@@ -411,7 +411,8 @@ forge ahead in our current function!"
     ;; convert into sec / usec pair
     (receive (secs usecs)
         (floor/ next-time-in-usecs 1000000)
-      (cons secs (floor usecs))))
+      (cons (inexact->exact secs)
+            (inexact->exact (floor usecs)))))
   (define (convert-integer)
     (cons (+ in-secs cur-secs) cur-usecs))
   (if (integer? in-secs)
@@ -466,13 +467,19 @@ Also handles sleeping when all we have to do is wait on the schedule."
     ;; TODO: support usecond wait time too
     (match (get-wait-time)
       ((sec . usec)
-       (catch 'system-error
+       (catch #t           ; expect: wrong-type-arg (open port), system-error
          (lambda ()
            (select (hash-keys (agenda-read-port-map agenda))
                    (hash-keys (agenda-write-port-map agenda))
                    '()
                    sec usec))
          (lambda (key . rest-args)
+           (unless (and (memq key '(system-error wrong-type-arg))
+                        (match rest-args
+                          (((or "select" "get-u8" "get-bytevector-n" "lookahead-u8"
+                                "put-u8" "put-bytevector") arg ...) #t)
+                          (_ #f)))
+             (apply throw key rest-args))
            (match rest-args
              ((_ _ _ (EINTR))
               '(() () ()))
@@ -561,8 +568,6 @@ on suspendable ports."
   "Start up the AGENDA"
   (install-suspendable-ports!)
   (parameterize ((%current-agenda-prompt (agenda-prompt-tag agenda))
-                 ;; @@: Couldn't we just parameterize this at the start of
-                 ;;   the agenda...?
                  (current-read-waiter wait-for-readable)
                  (current-write-waiter wait-for-writable))
     (while (not (stop-condition agenda))