diff --git a/multireader.go b/multireader.go index 1cb8cf8..1025975 100644 --- a/multireader.go +++ b/multireader.go @@ -91,6 +91,31 @@ func (m *MultiReader) shift() { } } +func (m *MultiReader) removeReader(id int) { + var ( + pin int + nb []*Reader + ) + for idx := range m.pos { + if m.pos[idx].id == id { + pin = idx + break + } + } + + nb = make([]*Reader, len(m.pos)-1) + if pin == 0 { + copy(nb, m.pos[1:]) + } else if pin == len(m.pos)-1 { + copy(nb, m.pos[:len(m.pos)-1]) + } else { + copy(nb, m.pos[:pin]) + copy(nb[pin:], m.pos[pin+1:]) + } + + m.pos = nb +} + func (m *MultiReader) Close() error { m.mtx.Lock() defer m.mtx.Unlock() @@ -155,6 +180,8 @@ func (r *Reader) seek(offset int, whence int) (int, error) { r.readPos = offset case io.SeekEnd: r.readPos = r.multiReader.lastWritePos - offset + default: + return 0, ErrUnsupportedWhence } r.multiReader.sortLastPos() @@ -192,5 +219,7 @@ func (r *Reader) Close() error { r.mtx.Lock() defer r.mtx.Unlock() r.closed = true + + r.multiReader.removeReader(r.id) return nil }