From cdd4223813d3a871553a45b27e227fff722c09ac Mon Sep 17 00:00:00 2001 From: Sebastian Zagrodzki Date: Wed, 26 Apr 2017 21:50:10 +0200 Subject: [PATCH] Handle a case where transfers channel was not closed properly. --- usb/transfer_stream.go | 3 +++ usb/transfer_stream_test.go | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/usb/transfer_stream.go b/usb/transfer_stream.go index 8c79c5e..0190dc7 100644 --- a/usb/transfer_stream.go +++ b/usb/transfer_stream.go @@ -75,6 +75,9 @@ func (r ReadStream) Read(p []byte) (int, error) { if err != nil { // wait error aborts immediately, all remaining data is invalid. t.free() + if s.delayedErr == nil { + close(s.transfers) + } for t := range s.transfers { t.cancel() t.wait() diff --git a/usb/transfer_stream_test.go b/usb/transfer_stream_test.go index 352973e..31b2a1c 100644 --- a/usb/transfer_stream_test.go +++ b/usb/transfer_stream_test.go @@ -198,6 +198,18 @@ func TestReadStream(t *testing.T) { {err: io.ErrClosedPipe}, }, }, + { + desc: "fail quickly", + transfers: [][]fakeStreamResult{ + {{waitErr: sentinelError}}, + {{n: 500}}, + {{n: 500}}, + }, + want: []readRes{ + {err: sentinelError}, + {err: io.ErrClosedPipe}, + }, + }, } { t.Run(strconv.Itoa(tcNum), func(t *testing.T) { t.Logf("Case %d: %s", tcNum, tc.desc)