diff --git a/collects/tests/racket/port.rktl b/collects/tests/racket/port.rktl index 94e37bbe43..0dbf29f7db 100644 --- a/collects/tests/racket/port.rktl +++ b/collects/tests/racket/port.rktl @@ -394,14 +394,17 @@ (- end start)))) (lambda (special) always-evt))) (test (void) display "hello" /dev/null-out) +(set! should-be-breakable? #f) (test 5 write-bytes-avail #"hello" /dev/null-out) +(set! should-be-breakable? #t) (test #t write-special 'hello /dev/null-out) (test 5 sync (write-bytes-avail-evt #"hello" /dev/null-out)) +(set! should-be-breakable? #f) (test 5 write-bytes-avail/enable-break #"hello" /dev/null-out) (test #t write-special-avail* 'hello /dev/null-out) (parameterize-break #f - (test 5 write-bytes-avail/enable-break #"hello" /dev/null-out) (set! should-be-breakable? #f) + (test 5 write-bytes-avail/enable-break #"hello" /dev/null-out) (test #t write-special-avail* 'hello /dev/null-out) (test 5 write-bytes-avail #"hello" /dev/null-out)) @@ -639,6 +642,34 @@ #f (try (lambda (x) (read-bytes-avail!/enable-break (make-bytes 10) x))))) +;; Check nonblock? and break? interaction (again): +(let () + (define status '()) + (define p (make-output-port + 'p + always-evt + (lambda (bstr start end nonblock? break?) + (set! status (list nonblock? break? (break-enabled))) + (- end start)) + void + (lambda (v nonblock? break?) + (set! status (list 'special nonblock? break? (break-enabled))) + #t))) + (write-bytes #"hi" p) + (test '(#f #t #f) values status) + (parameterize-break + #f + (write-bytes #"hi" p)) + (test '(#f #f #f) values status) + (write-bytes-avail #"hi" p) + (test '(#t #f #f) values status) + (write-bytes-avail* #"hi" p) + (test '(#t #f #f) values status) + (write-special 'any p) + (test '(special #f #t #f) values status) + (write-special-avail* 'any p) + (test '(special #t #f #f) values status)) + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Check that an uncooperative output port doesn't keep breaks ;; disabled too long: diff --git a/src/racket/src/portfun.c b/src/racket/src/portfun.c index 247de7926b..f961947372 100644 --- a/src/racket/src/portfun.c +++ b/src/racket/src/portfun.c @@ -1375,7 +1375,9 @@ user_write_bytes(Scheme_Output_Port *port, const char *str, intptr_t offset, int int n, re_enable_break; Scheme_Cont_Frame_Data cframe; - if (enable_break) + if (rarely_block) + re_enable_break = 0; + else if (enable_break) re_enable_break = 1; else re_enable_break = scheme_can_break(scheme_current_thread); @@ -1512,7 +1514,10 @@ user_write_special (Scheme_Output_Port *port, Scheme_Object *v, int nonblock) int re_enable_break; Scheme_Cont_Frame_Data cframe; - re_enable_break = scheme_can_break(scheme_current_thread); + if (nonblock) + re_enable_break = 0; + else + re_enable_break = scheme_can_break(scheme_current_thread); a[0] = v; a[1] = (nonblock ? scheme_true : scheme_false);