diff --git a/internal/clienthls/multiaccessbuffer.go b/internal/clienthls/multiaccessbuffer.go index bc00dfef..ff06ecad 100644 --- a/internal/clienthls/multiaccessbuffer.go +++ b/internal/clienthls/multiaccessbuffer.go @@ -12,27 +12,19 @@ type multiAccessBufferReader struct { } func (r *multiAccessBufferReader) Read(p []byte) (int, error) { - newReadPos := r.readPos + len(p) + r.m.mutex.Lock() + defer r.m.mutex.Unlock() - curBuf, err := func() ([]byte, error) { - r.m.mutex.Lock() - defer r.m.mutex.Unlock() - - if r.m.closed && r.readPos >= r.m.writePos { - return nil, io.EOF - } - - for !r.m.closed && newReadPos >= r.m.writePos { - r.m.cond.Wait() - } + if r.m.closed && r.m.writePos == r.readPos { + return 0, io.EOF + } - return r.m.buf.Bytes(), nil - }() - if err != nil { - return 0, err + for !r.m.closed && r.m.writePos == r.readPos { + r.m.cond.Wait() } - n := copy(p, curBuf[r.readPos:]) + buf := r.m.buf.Bytes() + n := copy(p, buf[r.readPos:]) r.readPos += n return n, nil diff --git a/internal/clienthls/multiaccessbuffer_test.go b/internal/clienthls/multiaccessbuffer_test.go index d854c946..1d5f4313 100644 --- a/internal/clienthls/multiaccessbuffer_test.go +++ b/internal/clienthls/multiaccessbuffer_test.go @@ -1,6 +1,7 @@ package clienthls import ( + "io" "testing" "github.com/stretchr/testify/require" @@ -18,10 +19,21 @@ func TestMultiAccessBuffer(t *testing.T) { require.NoError(t, err) require.Equal(t, []byte{0x01, 0x02, 0x03, 0x04}, buf[:n]) + buf = make([]byte, 10) + n, err = r.Read(buf) + require.NoError(t, err) + require.Equal(t, []byte{0x05, 0x06, 0x07, 0x08}, buf[:n]) + + m.Write([]byte{0x09, 0x0a, 0x0b, 0x0c}) + m.Close() buf = make([]byte, 10) n, err = r.Read(buf) require.NoError(t, err) - require.Equal(t, []byte{0x05, 0x06, 0x07, 0x08}, buf[:n]) + require.Equal(t, []byte{0x09, 0x0a, 0x0b, 0x0c}, buf[:n]) + + buf = make([]byte, 10) + _, err = r.Read(buf) + require.Equal(t, io.EOF, err) }