X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/08fe6b0770ad8b4aa5115052126f1e0d51dca1fa..816764a283c2cbf2d41b4582113065922b99bd52:/sdk/go/asyncbuf/buf.go diff --git a/sdk/go/asyncbuf/buf.go b/sdk/go/asyncbuf/buf.go index ebe0301c34..05af02f5f5 100644 --- a/sdk/go/asyncbuf/buf.go +++ b/sdk/go/asyncbuf/buf.go @@ -87,17 +87,22 @@ type reader struct { func (r *reader) Read(p []byte) (int, error) { r.b.cond.L.Lock() for { - if r.b.data.Len() > r.read || len(p) == 0 { + switch { + case r.read < r.b.data.Len(): buf := r.b.data.Bytes() r.b.cond.L.Unlock() n := copy(p, buf[r.read:]) r.read += n return n, nil - } - if r.b.err != nil { + case r.b.err != nil || len(p) == 0: + // r.b.err != nil means we reached EOF. And + // even if we're not at EOF, there's no need + // to block if len(p)==0. + err := r.b.err r.b.cond.L.Unlock() - return 0, r.b.err + return 0, err + default: + r.b.cond.Wait() } - r.b.cond.Wait() } }