From 40846e3ed9b95af17d281a88a55d89f210e88b30 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Mon, 27 May 2019 10:39:19 -0600 Subject: [PATCH] racket/system: add some missing synchronization These changes are intended to address "input port is closed" errors that have been showing up with Racket CS, possibly because its scheduler exposed missing synchronization. --- racket/collects/racket/private/streams.rkt | 24 ++++++++++++---------- racket/collects/racket/system.rkt | 3 ++- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/racket/collects/racket/private/streams.rkt b/racket/collects/racket/private/streams.rkt index 5f655e9926..166f9594cd 100644 --- a/racket/collects/racket/private/streams.rkt +++ b/racket/collects/racket/private/streams.rkt @@ -25,17 +25,19 @@ (define (streamify-in cin in ready-for-break) (if (and cin (not (file-stream-port? cin))) - (thread (lambda () - (dynamic-wind - void - (lambda () - (with-handlers ([exn:break? void]) - (ready-for-break #t) - (copy-port cin in) - (ready-for-break #f))) - (lambda () (close-output-port in))) - (ready-for-break #t))) - in)) + (parameterize-break #f + (thread (lambda () + (dynamic-wind + void + (lambda () + (with-handlers ([exn:break? void]) + (parameterize-break #t + (ready-for-break #t) + (copy-port cin in) + (ready-for-break #f)))) + (lambda () (close-output-port in))) + (ready-for-break #t)))) + in)) (define (streamify-out cout out) (if (and cout diff --git a/racket/collects/racket/system.rkt b/racket/collects/racket/system.rkt index 9de72fed99..25007edb85 100644 --- a/racket/collects/racket/system.rkt +++ b/racket/collects/racket/system.rkt @@ -195,7 +195,8 @@ (when it ;; stop piping output to subprocess (semaphore-wait it-ready) - (break-thread it)) + (break-thread it) + (thread-wait it)) ;; wait for other pipes to run dry: (when (thread? ot) (thread-wait ot)) (when (thread? et) (thread-wait et))