From: Rob Pike Date: Thu, 1 Mar 2012 00:24:13 +0000 (+1100) Subject: io: Pipes and ReadAt are safe to use concurrently. X-Git-Tag: weekly.2012-03-04~72 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=5a5279e128e29edcbeec8fc3e36d1ec110ecb558;p=gostls13.git io: Pipes and ReadAt are safe to use concurrently. Updates #1599. R=golang-dev, bradfitz, rsc, r CC=golang-dev https://golang.org/cl/5708056 --- diff --git a/src/pkg/io/io.go b/src/pkg/io/io.go index 3e2321ce71..7074834d61 100644 --- a/src/pkg/io/io.go +++ b/src/pkg/io/io.go @@ -160,6 +160,9 @@ type WriterTo interface { // If ReadAt is reading from an input source with a seek offset, // ReadAt should not affect nor be affected by the underlying // seek offset. +// +// Clients of ReadAt can execute parallel ReadAt calls on the +// same input source. type ReaderAt interface { ReadAt(p []byte, off int64) (n int, err error) } diff --git a/src/pkg/io/pipe.go b/src/pkg/io/pipe.go index cf05e0c1ad..69f90510f7 100644 --- a/src/pkg/io/pipe.go +++ b/src/pkg/io/pipe.go @@ -175,6 +175,10 @@ func (w *PipeWriter) CloseWithError(err error) error { // with code expecting an io.Writer. // Reads on one end are matched with writes on the other, // copying data directly between the two; there is no internal buffering. +// It is safe to call Read and Write in parallel with each other or with +// Close. Close will complete once pending I/O is done. Parallel calls to +// Read, and parallel calls to Write, are also safe: +// the invidual calls will be gated sequentially. func Pipe() (*PipeReader, *PipeWriter) { p := new(pipe) p.rwait.L = &p.l