Wait for the reader fifo opening to block

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
This commit is contained in:
Tonis Tiigi 2016-07-14 10:13:54 -07:00
parent 56fb100140
commit 0b2023130e
2 changed files with 5 additions and 1 deletions

View file

@ -225,8 +225,9 @@ func (ctr *container) discardFifos() {
f := ctr.fifo(i)
c := make(chan struct{})
go func() {
r := openReaderFromFifo(f)
close(c) // this channel is used to not close the writer too early, before readonly open has been called.
io.Copy(ioutil.Discard, openReaderFromFifo(f))
io.Copy(ioutil.Discard, r)
}()
<-c
closeReaderFifo(f) // avoid blocking permanently on open if there is no writer side

View file

@ -79,7 +79,9 @@ func (r emptyReader) Read(b []byte) (int, error) {
func openReaderFromFifo(fn string) io.Reader {
r, w := io.Pipe()
c := make(chan struct{})
go func() {
close(c)
stdoutf, err := os.OpenFile(fn, syscall.O_RDONLY, 0)
if err != nil {
r.CloseWithError(err)
@ -90,6 +92,7 @@ func openReaderFromFifo(fn string) io.Reader {
w.Close()
stdoutf.Close()
}()
<-c // wait for the goroutine to get scheduled and syscall to block
return r
}