• Kirill Smelkov's avatar
    io: fix PipeWriter.Close to wake up Writes · d296c323
    Kirill Smelkov authored
    Since commit cc62bed0 (CL 994043) the pipe deadlock when doing
    Read+Close or Write+Close on same end was fixed, alas with test for
    Read+Close case only.
    
    Then commit 6d6f3381 (CL 4252057) made a thinko: in the writer path
    p.werr is checked for != nil and then err is set but there is no break
    from waiting loop unlike break is there in similar condition for reader.
    Together with having only Read+Close case tested that made it to leave
    reintroduced Write+Close deadlock unnoticed.
    
    Fix it.
    
    Implicitly this also fixes net.Pipe to conform to semantic of net.Conn
    interface where Close is documented to unblock any blocked Read or Write
    operations.
    
    No test added to net/ since net.Pipe tests are "Assuming that the
    underlying io.Pipe implementation is solid and we're just testing the
    net wrapping". The test added in this patch should be enough to cover
    the breakage.
    
    Fixes #18401
    Updates #18170
    
    Change-Id: I9e9460b3fd7d220bbe60b726accf86f352aed8d4
    Reviewed-on: https://go-review.googlesource.com/34637
    Run-TryBot: Russ Cox <rsc@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
    d296c323
Name
Last commit
Last update
..
archive Loading commit data...
bufio Loading commit data...
builtin Loading commit data...
bytes Loading commit data...
cmd Loading commit data...
compress Loading commit data...
container Loading commit data...
context Loading commit data...
crypto Loading commit data...
database/sql Loading commit data...
debug Loading commit data...
encoding Loading commit data...
errors Loading commit data...
expvar Loading commit data...
flag Loading commit data...
fmt Loading commit data...
go Loading commit data...
hash Loading commit data...
html Loading commit data...
image Loading commit data...
index/suffixarray Loading commit data...
internal Loading commit data...
io Loading commit data...
log Loading commit data...
math Loading commit data...
mime Loading commit data...
net Loading commit data...
os Loading commit data...
path Loading commit data...
plugin Loading commit data...
reflect Loading commit data...
regexp Loading commit data...
runtime Loading commit data...
sort Loading commit data...
strconv Loading commit data...
strings Loading commit data...
sync Loading commit data...
syscall Loading commit data...
testing Loading commit data...
text Loading commit data...
time Loading commit data...
unicode Loading commit data...
unsafe Loading commit data...
vendor/golang_org/x Loading commit data...
Make.dist Loading commit data...
all.bash Loading commit data...
all.bat Loading commit data...
all.rc Loading commit data...
androidtest.bash Loading commit data...
bootstrap.bash Loading commit data...
buildall.bash Loading commit data...
clean.bash Loading commit data...
clean.bat Loading commit data...
clean.rc Loading commit data...
cmp.bash Loading commit data...
iostest.bash Loading commit data...
make.bash Loading commit data...
make.bat Loading commit data...
make.rc Loading commit data...
naclmake.bash Loading commit data...
nacltest.bash Loading commit data...
race.bash Loading commit data...
race.bat Loading commit data...
run.bash Loading commit data...
run.bat Loading commit data...
run.rc Loading commit data...