1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
5 // Pipe adapter to connect code expecting an io.Reader
6 // with code expecting an io.Writer.
15 // ErrClosedPipe is the error used for read or write operations on a closed pipe.
16 var ErrClosedPipe
= errors
.New("io: read/write on closed pipe")
18 type pipeResult
struct {
23 // A pipe is the shared pipe structure underlying PipeReader and PipeWriter.
25 rl sync
.Mutex
// gates readers one at a time
26 wl sync
.Mutex
// gates writers one at a time
27 l sync
.Mutex
// protects remaining fields
28 data
[]byte // data remaining in pending write
29 rwait sync
.Cond
// waiting reader
30 wwait sync
.Cond
// waiting writer
31 rerr error
// if reader closed, error to give writes
32 werr error
// if writer closed, error to give reads
35 func (p
*pipe
) read(b
[]byte) (n
int, err error
) {
36 // One reader at a time.
44 return 0, ErrClosedPipe
65 func (p
*pipe
) write(b
[]byte) (n
int, err error
) {
66 // pipe uses nil to mean not available
71 // One writer at a time.
96 n
= len(b
) - len(p
.data
)
97 p
.data
= nil // in case of rerr or werr
101 func (p
*pipe
) rclose(err error
) {
112 func (p
*pipe
) wclose(err error
) {
123 // A PipeReader is the read half of a pipe.
124 type PipeReader
struct {
128 // Read implements the standard Read interface:
129 // it reads data from the pipe, blocking until a writer
130 // arrives or the write end is closed.
131 // If the write end is closed with an error, that error is
132 // returned as err; otherwise err is EOF.
133 func (r
*PipeReader
) Read(data
[]byte) (n
int, err error
) {
134 return r
.p
.read(data
)
137 // Close closes the reader; subsequent writes to the
138 // write half of the pipe will return the error ErrClosedPipe.
139 func (r
*PipeReader
) Close() error
{
140 return r
.CloseWithError(nil)
143 // CloseWithError closes the reader; subsequent writes
144 // to the write half of the pipe will return the error err.
145 func (r
*PipeReader
) CloseWithError(err error
) error
{
150 // A PipeWriter is the write half of a pipe.
151 type PipeWriter
struct {
155 // Write implements the standard Write interface:
156 // it writes data to the pipe, blocking until readers
157 // have consumed all the data or the read end is closed.
158 // If the read end is closed with an error, that err is
159 // returned as err; otherwise err is ErrClosedPipe.
160 func (w
*PipeWriter
) Write(data
[]byte) (n
int, err error
) {
161 return w
.p
.write(data
)
164 // Close closes the writer; subsequent reads from the
165 // read half of the pipe will return no bytes and EOF.
166 func (w
*PipeWriter
) Close() error
{
167 return w
.CloseWithError(nil)
170 // CloseWithError closes the writer; subsequent reads from the
171 // read half of the pipe will return no bytes and the error err.
172 func (w
*PipeWriter
) CloseWithError(err error
) error
{
177 // Pipe creates a synchronous in-memory pipe.
178 // It can be used to connect code expecting an io.Reader
179 // with code expecting an io.Writer.
180 // Reads on one end are matched with writes on the other,
181 // copying data directly between the two; there is no internal buffering.
182 // It is safe to call Read and Write in parallel with each other or with
183 // Close. Close will complete once pending I/O is done. Parallel calls to
184 // Read, and parallel calls to Write, are also safe:
185 // the individual calls will be gated sequentially.
186 func Pipe() (*PipeReader
, *PipeWriter
) {