commit:     5a53e732efa0ee7e2a3f8afe90d729212ff187fb
Author:     Michael Haubenwallner <haubi <AT> gentoo <DOT> org>
AuthorDate: Tue May 24 10:54:38 2016 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Sat Jan 14 00:13:42 2017 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=5a53e732

__multijob_init: work around Cygwin FIFO shortcoming

Cygwin does not support multiple read-handles for one FIFO (yet).
As we really need just one readonly- and one writeonly-handle, we can
reorder to open one single readwrite- and one writeonly-handle.

X-Gentoo-Bug: 583962
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=583962

 bin/helper-functions.sh | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/bin/helper-functions.sh b/bin/helper-functions.sh
index c096aed..9b6e201 100644
--- a/bin/helper-functions.sh
+++ b/bin/helper-functions.sh
@@ -20,12 +20,17 @@ makeopts_jobs() {
 __multijob_init() {
        # Setup a pipe for children to write their pids to when they finish.
        # We have to allocate two fd's because POSIX has undefined behavior
-       # when you open a FIFO for simultaneous read/write. #487056
+       # when using one single fd for both read and write. #487056
+       # However, opening an fd for read or write only will block until the
+       # opposite end is opened as well. Thus we open the first fd for both
+       # read and write to not block ourselve, but use it for reading only.
+       # The second fd really is opened for write only, as Cygwin supports
+       # just one single read fd per FIFO. #583962
        local pipe=$(mktemp -t multijob.XXXXXX)
        rm -f "${pipe}"
        mkfifo -m 600 "${pipe}"
-       __redirect_alloc_fd mj_write_fd "${pipe}"
        __redirect_alloc_fd mj_read_fd "${pipe}"
+       __redirect_alloc_fd mj_write_fd "${pipe}" '>'
        rm -f "${pipe}"
 
        # See how many children we can fork based on the user's settings.

Reply via email to