multiprocessing.eclass: work around Cygwin FIFO shortcoming
authorMichael Haubenwallner <michael.haubenwallner@ssi-schaefer.com>
Wed, 27 Apr 2016 15:21:52 +0000 (15:21 +0000)
committerMichael Haubenwallner <haubi@gentoo.org>
Mon, 16 Jan 2017 10:00:38 +0000 (11:00 +0100)
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

eclass/multiprocessing.eclass

index 70ca475a8c723ff378378116ffbb37457161edc2..67f7e2d65b42f8910405e828e2940f90353f7f7a 100644 (file)
@@ -139,11 +139,16 @@ 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="${T}/multijob.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.