Hi Andreas, And welcome back! :-)
Andreas Rottmann <m...@r0tty.org> skribis: > Andreas Rottmann <m...@r0tty.org> writes: > >> [...] I isolated the cause; the following snippet hangs on Guile 2.2 >> and 3.0, while it worked as expected on 2.0: >> >> ;; ------------------ >> (import (rnrs)) >> >> (let* ((p (pipe)) >> (in (car p)) >> (out (transcoded-port (cdr p) (make-transcoder (utf-8-codec))))) >> (put-datum out "foo") >> (flush-output-port out) >> (display "Should have written to pipe by now, attempting reading a byte\n") >> (display "Got") >> (display (get-u8 in)) >> (newline)) >> ;; ------------------- >> >> It seems the underlying port is no longer flushed to the OS, so the >> `get-u8` now hangs waiting for input, starting with Guile 2.2. >> > I'd like to add that this is indeed not passing data to the OS, as > verified by strace. Also, I have now figured out the commit introducing > the regression, namely 8399e7af5 ("Generic port facility provides > buffering uniformly"); the commit before (e8eeeeb1d) still runs the > above code to completion. Actually I think the code above behaves as expected. ‘pipe’ returns buffered ports by default. When flushing the transcoded port, ‘transcoded_port_write’ is called, but then bytes written to the pipe are buffered. The fix is to add: (setvbuf (cdr p) 'none) Does that make sense? Thanks, Ludo’.