From 0567527be4162f7b0008bcdb1f59e3ebad7a6d67 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sat, 16 Feb 2019 17:39:58 -0700 Subject: [PATCH] io: fix `unsafe-poller` When asking a poller to register wakup events, handle an "event is ready" response by canceling the sleep. Closes #2482 --- racket/src/io/unsafe/schedule.rkt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/racket/src/io/unsafe/schedule.rkt b/racket/src/io/unsafe/schedule.rkt index df62b529c3..1657b85f87 100644 --- a/racket/src/io/unsafe/schedule.rkt +++ b/racket/src/io/unsafe/schedule.rkt @@ -22,7 +22,13 @@ [vals (values vals #f)] [(eq? evt self) ;; Register wakeups: - (proc self poll-ctx) + (define-values (vals evt) (proc self poll-ctx)) + (when vals + ;; The rule here is that we cancel any sleep so + ;; that the event will be polled again; we do not + ;; select the event now. That rule accomodates + ;; the old Racket scheduler. + (sandman-poll-ctx-merge-timeout poll-ctx (current-inexact-milliseconds))) (values #f self)] [else (values #f evt)])]))))