Remove pkg/ioutils.cancelReadCloser

Remove pkg/ioutils's cancelReadCloser type and the vendored copy of
golang.org/x/net/context which it needed, neither of which was used
anywhere else in here.  This should let us sidestep any potential
incompatibilities with the standard library's context package, which was
introduced in golang 1.7.

Signed-off-by: Nalin Dahyabhai <nalin@redhat.com>
This commit is contained in:
Nalin Dahyabhai 2017-02-16 12:19:35 -05:00
parent 417d28901b
commit dff96cdeb2
2 changed files with 0 additions and 89 deletions

View file

@ -4,8 +4,6 @@ import (
"crypto/sha256" "crypto/sha256"
"encoding/hex" "encoding/hex"
"io" "io"
"golang.org/x/net/context"
) )
type readCloserWrapper struct { type readCloserWrapper struct {
@ -83,72 +81,3 @@ func (r *OnEOFReader) runFunc() {
r.Fn = nil r.Fn = nil
} }
} }
// cancelReadCloser wraps an io.ReadCloser with a context for cancelling read
// operations.
type cancelReadCloser struct {
cancel func()
pR *io.PipeReader // Stream to read from
pW *io.PipeWriter
}
// NewCancelReadCloser creates a wrapper that closes the ReadCloser when the
// context is cancelled. The returned io.ReadCloser must be closed when it is
// no longer needed.
func NewCancelReadCloser(ctx context.Context, in io.ReadCloser) io.ReadCloser {
pR, pW := io.Pipe()
// Create a context used to signal when the pipe is closed
doneCtx, cancel := context.WithCancel(context.Background())
p := &cancelReadCloser{
cancel: cancel,
pR: pR,
pW: pW,
}
go func() {
_, err := io.Copy(pW, in)
select {
case <-ctx.Done():
// If the context was closed, p.closeWithError
// was already called. Calling it again would
// change the error that Read returns.
default:
p.closeWithError(err)
}
in.Close()
}()
go func() {
for {
select {
case <-ctx.Done():
p.closeWithError(ctx.Err())
case <-doneCtx.Done():
return
}
}
}()
return p
}
// Read wraps the Read method of the pipe that provides data from the wrapped
// ReadCloser.
func (p *cancelReadCloser) Read(buf []byte) (n int, err error) {
return p.pR.Read(buf)
}
// closeWithError closes the wrapper and its underlying reader. It will
// cause future calls to Read to return err.
func (p *cancelReadCloser) closeWithError(err error) {
p.pW.CloseWithError(err)
p.cancel()
}
// Close closes the wrapper its underlying reader. It will cause
// future calls to Read to return io.EOF.
func (p *cancelReadCloser) Close() error {
p.closeWithError(io.EOF)
return nil
}

View file

@ -2,12 +2,8 @@ package ioutils
import ( import (
"fmt" "fmt"
"io/ioutil"
"strings" "strings"
"testing" "testing"
"time"
"golang.org/x/net/context"
) )
// Implement io.Reader // Implement io.Reader
@ -78,17 +74,3 @@ func (p *perpetualReader) Read(buf []byte) (n int, err error) {
} }
return len(buf), nil return len(buf), nil
} }
func TestCancelReadCloser(t *testing.T) {
ctx, _ := context.WithTimeout(context.Background(), 100*time.Millisecond)
cancelReadCloser := NewCancelReadCloser(ctx, ioutil.NopCloser(&perpetualReader{}))
for {
var buf [128]byte
_, err := cancelReadCloser.Read(buf[:])
if err == context.DeadlineExceeded {
break
} else if err != nil {
t.Fatalf("got unexpected error: %v", err)
}
}
}