Don't freak out on interrupts during (select)!
authorChristopher Allan Webber <cwebber@dustycloud.org>
Mon, 23 Nov 2015 02:13:07 +0000 (20:13 -0600)
committerChristopher Allan Webber <cwebber@dustycloud.org>
Mon, 23 Nov 2015 02:13:07 +0000 (20:13 -0600)
make-coop-server-handler makes use of interrupts, so we need this code
so as to not barf while connecting to 8sync while it's doing a (select)

eightsync/agenda.scm

index 2b46324bfe7a30f2c94af2281c28906374d585f6..b26d93b6bdebe328981474e88a3d40f1dd901fef 100644 (file)
@@ -554,10 +554,17 @@ return the wrong thing via (8sync) and trip themselves up."
     ;; TODO: support usecond wait time too
     (match (get-wait-time)
       ((sec . usec)
-       (select (hash-keys (agenda-read-port-map agenda))
-               (hash-keys (agenda-write-port-map agenda))
-               (hash-keys (agenda-except-port-map agenda))
-               sec usec))))
+       (catch 'system-error
+         (lambda ()
+           (select (hash-keys (agenda-read-port-map agenda))
+                   (hash-keys (agenda-write-port-map agenda))
+                   (hash-keys (agenda-except-port-map agenda))
+                   sec usec))
+         (lambda (key . rest-args)
+           (match (pk 'rest-args rest-args)
+             ((_ _ _ (EINTR))
+              '(() () ()))
+             (_ (error "Unhandled error in select!" key rest-args))))))))
   (define (get-procs-to-run)
     (define (ports->procs ports port-map)
       (lambda (initial-procs)