Hello, Mark H Weaver <m...@netris.org> skribis:
> l...@gnu.org (Ludovic Courtès) writes: [...] >> + if (SCM_UNBUFFEREDP (port) && (avail < max_buffer_size)) >> + { >> + /* PORT is unbuffered. Read as much as possible from PORT. */ >> + size_t read; >> + >> + bv = scm_c_make_bytevector (max_buffer_size); >> + scm_port_buffer_take (buf, (scm_t_uint8 *) SCM_BYTEVECTOR_CONTENTS >> (bv), >> + avail, cur, avail); >> + >> + read = scm_i_read_bytes (port, bv, avail, >> + SCM_BYTEVECTOR_LENGTH (bv) - avail); > > Here's the R6RS specification for 'get-bytevector-some': > > "Reads from BINARY-INPUT-PORT, blocking as necessary, until bytes are > available from BINARY-INPUT-PORT or until an end of file is reached. > If bytes become available, 'get-bytevector-some' returns a freshly > allocated bytevector containing the initial available bytes (at least > one), and it updates BINARY-INPUT-PORT to point just past these > bytes. If no input bytes are seen before an end of file is reached, > the end-of-file object is returned." > > By my reading of this, we should block only if necessary to ensure that > we return at least one byte (or EOF). In other words, if we can return > at least one byte (or EOF), then we must not block, which means that we > must not initiate another 'read'. Indeed. So perhaps the condition above should be changed to: if (SCM_UNBUFFEREDP (port) && (avail == 0)) ? > Out of curiosity, is there a reason why you're using an unbuffered port > in your use case? It’s to implement redirect à la socat: https://git.savannah.gnu.org/cgit/guix.git/commit/?id=17af5d51de7c40756a4a39d336f81681de2ba447 Thanks, Ludo’.