1
0
mirror of https://github.com/golang/go synced 2024-11-20 03:24:41 -07:00
go/src/io
Joe Tsai 371eda4558 io: simplify pipe implementation
In the distant past, Pipe was implemented with channels and a
long running pipe.run goroutine (see CL 994043).
This approach of having all communication serialized through the
run method was error prone giving Pipe a history of deadlocks
and race conditions.

After the introduction of sync.Cond, the implementation was rewritten
(see CL 4252057) to use condition variables and avoid the
long running pipe.run goroutine. While this implementation is superior
to the previous one, this implementation is strange in that the
p.data field is always set immediately prior to signaling the other
goroutine with Cond.Signal, effectively making the combination of the
two a channel-like operation. Inferior to a channel, however, this still
requires explicit locking around the p.data field.

The data+rwait can be effectively be replaced by a "chan []byte" to
inform a reader that there is data available.
The data+wwait can be effectively be replaced by a "chan int" to
inform a writer of how many bytes were read.

This implementation is a simplified from net.Pipe in CL 37402.

Change-Id: Ia5b26320b0525934fd87a3b69a091c787167f5aa
Reviewed-on: https://go-review.googlesource.com/65330
Run-TryBot: Joe Tsai <thebrokentoaster@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Bryan Mills <bcmills@google.com>
2017-10-11 20:00:54 +00:00
..
ioutil io/ioutil: don't cap buffer size in ReadFile 2017-08-31 19:32:18 +00:00
example_test.go io: add example for Pipe 2017-08-22 19:42:20 +00:00
io_test.go io: Add benchmarks for CopyN 2017-09-20 15:00:31 +00:00
io.go io: Improve performance of CopyN 2017-09-20 13:41:50 +00:00
multi_test.go io: correctly compute call depth in test 2017-04-18 19:56:54 +00:00
multi.go
pipe_test.go io: simplify pipe implementation 2017-10-11 20:00:54 +00:00
pipe.go io: simplify pipe implementation 2017-10-11 20:00:54 +00:00