Hi, Ludovic Courtès <l...@gnu.org> skribis:
> Previously, each 'inferior-eval-with-store' would lead the inferior to > connect to the named socket the parent is listening to. With this > change, the connection is established once for all and reused > afterwards. > > * guix/inferior.scm (<inferior>)[bridge-file-name]: Remove. > (open-bidirectional-pipe): New procedure. > (inferior-pipe): Use it instead of 'open-pipe*' and return two values. > (port->inferior): Adjust call to 'inferior'. > (open-inferior): Adjust to 'inferior-pipe' changes. > (close-inferior): Remove 'inferior-bridge-file-name' handling. > (open-store-bridge!): Switch back to 'call-with-temporary-directory'. > Define '%bridge-socket' in the inferior, connected to the caller. > (proxy): Change first argument to be an inferior. Add 'reponse-port' > and call to 'drain-input'. Pass 'reponse-port' to 'select' and use it > as a loop termination clause. > (inferior-eval-with-store): Remove 'socket' and 'connect' calls from the > inferior code, and use '%bridge-socket' instead. [...] > +(define (open-bidirectional-pipe command . args) > + "Open a bidirectional pipe to COMMAND invoked with ARGS and return it, as a > +regular file port (socket). > + > +This is equivalent to (open-pipe* OPEN_BOTH ...) except that the result is a > +regular file port that can be passed to 'select' ('open-pipe*' returns a > +custom binary port)." > + (match (socketpair AF_UNIX SOCK_STREAM 0) > + ((parent . child) > + (match (primitive-fork) I noticed that there’s at least one case where this is used from a multi-threaded program, and as we know, fork + threads don’t go well together: --8<---------------cut here---------------start------------->8--- $ make as-derivation […] @ build-succeeded /gnu/store/n5jfi8pn1aq1ykmnq75xhr8ba2m7161l-profile.drv - warning: call to primitive-fork while multiple threads are running; further behavior unspecified. See "Processes" in the manual, for more information. warning: call to primitive-fork while multiple threads are running; further behavior unspecified. See "Processes" in the manual, for more information. warning: call to primitive-fork while multiple threads are running; further behavior unspecified. See "Processes" in the manual, for more information. --8<---------------cut here---------------end--------------->8--- The threads are created in ‘build-aux/cuirass/evaluate.scm’. In practice it’s OK because the code above calls ‘exec’ right away; still, it’s annoying. Ludo’.