diff --git a/racket/src/io/network/address.rkt b/racket/src/io/network/address.rkt index 3aa881d5ed..cbba88e2a8 100644 --- a/racket/src/io/network/address.rkt +++ b/racket/src/io/network/address.rkt @@ -34,7 +34,7 @@ (lambda (lookup-box) (define lookup (unbox lookup-box)) (when lookup - (rktio_addrinfo_lookup_stop lookup))) + (rktio_addrinfo_lookup_stop rktio lookup))) ;; in atomic mode (lambda (lookup-box) (define lookup (unbox lookup-box)) diff --git a/racket/src/io/sandman/ltps.rkt b/racket/src/io/sandman/ltps.rkt index 67f2eef2c1..a90d1c513a 100644 --- a/racket/src/io/sandman/ltps.rkt +++ b/racket/src/io/sandman/ltps.rkt @@ -8,7 +8,7 @@ shared-ltps-place-init! fd-semaphore-update! - fd-semaphore-poll-ready) + fd-semaphore-poll-ready?) (define (make-ltps) (define ltps (rktio_ltps_open rktio)) @@ -63,18 +63,18 @@ s])])])) ;; in atomic mode -(define (fd-semaphore-poll-ready) +(define (fd-semaphore-poll-ready?) (unless (eq? shared-ltps rktio_NULL) (rktio_ltps_poll rktio shared-ltps) - (let loop () + (let loop ([did? #f]) (define h (rktio_ltps_get_signaled_handle rktio shared-ltps)) (cond [(rktio-error? h) ;; Could log an error that isn't RKTIO_ERROR_LTPS_NOT_FOUND - (void)] + did?] [else (define ib (address->immobile-cell (rktio_ltps_handle_get_data rktio h))) (semaphore-post-all (immobile-cell-ref ib)) (free-immobile-cell ib) (rktio_free h) - (loop)])))) + (loop #t)])))) diff --git a/racket/src/io/sandman/main.rkt b/racket/src/io/sandman/main.rkt index 83f6d73f31..8d9bd41c08 100644 --- a/racket/src/io/sandman/main.rkt +++ b/racket/src/io/sandman/main.rkt @@ -97,7 +97,8 @@ [(eqv? v RKTIO_OS_SIGNAL_TERM) 'terminate] [else 'break])) (check-signals))) - (fd-semaphore-poll-ready) + (when (fd-semaphore-poll-ready?) + (wakeup #f)) ((sandman-do-poll timeout-sandman) mode wakeup)) ;; get-wakeup diff --git a/racket/src/thread/sandman.rkt b/racket/src/thread/sandman.rkt index c2a439bc83..1755036e7d 100644 --- a/racket/src/thread/sandman.rkt +++ b/racket/src/thread/sandman.rkt @@ -61,6 +61,9 @@ ((sandman-do-remove-thread! the-sandman) th h)) ;; in atomic mode +;; The `thread-wakeup` callback can be called with #f +;; to indicate that a thread was potentially woken up +;; some other way, such as by a semaphore post (define (sandman-poll mode thread-wakeup) ((sandman-do-poll the-sandman) mode thread-wakeup)) diff --git a/racket/src/thread/schedule.rkt b/racket/src/thread/schedule.rkt index b749918807..46a4e06971 100644 --- a/racket/src/thread/schedule.rkt +++ b/racket/src/thread/schedule.rkt @@ -174,7 +174,8 @@ (define did? #f) (sandman-poll mode (lambda (t) - (thread-reschedule! t) + (when t + (thread-reschedule! t)) (set! did? #t))) (when did? (thread-did-work!))