github.com/bodgit/sevenzip@v1.5.1/internal/lz4/reader.go (about) 1 package lz4 2 3 import ( 4 "errors" 5 "io" 6 "sync" 7 8 lz4 "github.com/pierrec/lz4/v4" 9 ) 10 11 //nolint:gochecknoglobals 12 var lz4ReaderPool sync.Pool 13 14 type readCloser struct { 15 c io.Closer 16 r *lz4.Reader 17 } 18 19 func (rc *readCloser) Close() (err error) { 20 if rc.c != nil { 21 lz4ReaderPool.Put(rc.r) 22 err = rc.c.Close() 23 rc.c, rc.r = nil, nil 24 } 25 26 return 27 } 28 29 func (rc *readCloser) Read(p []byte) (int, error) { 30 if rc.r == nil { 31 return 0, errors.New("lz4: Read after Close") 32 } 33 34 return rc.r.Read(p) 35 } 36 37 // NewReader returns a new LZ4 io.ReadCloser. 38 func NewReader(_ []byte, _ uint64, readers []io.ReadCloser) (io.ReadCloser, error) { 39 if len(readers) != 1 { 40 return nil, errors.New("lz4: need exactly one reader") 41 } 42 43 r, ok := lz4ReaderPool.Get().(*lz4.Reader) 44 if ok { 45 r.Reset(readers[0]) 46 } else { 47 r = lz4.NewReader(readers[0]) 48 } 49 50 return &readCloser{ 51 c: readers[0], 52 r: r, 53 }, nil 54 }