1
0
Fork 0
mirror of https://github.com/anyproto/anytype-heart.git synced 2025-06-08 05:47:07 +09:00
anytype-heart/util/bufferpool/reader.go
Roman Khafizianov 6b73d0e839
GO-3538 image resize: add bufferpool
avoid double resizing
2024-05-28 16:45:18 +02:00

47 lines
891 B
Go

package bufferpool
import (
"bytes"
"io"
"sync"
)
// poolReadSeekCloser is a custom type that wraps a byte slice and a sync.Pool.
type poolReadSeekCloser struct {
*bytes.Reader
buf []byte
pool *sync.Pool
m sync.RWMutex
closed bool
}
// NewPoolReadSeekCloser creates a new poolReadSeekCloser.
func newPoolReadSeekCloser(buf []byte, pool *sync.Pool) io.ReadSeekCloser {
return &poolReadSeekCloser{
Reader: bytes.NewReader(buf),
buf: buf,
pool: pool,
}
}
// Close puts the buffer back into the pool.
func (prsc *poolReadSeekCloser) Close() error {
prsc.m.Lock()
defer prsc.m.Unlock()
if prsc.closed {
return nil
}
prsc.closed = true
prsc.pool.Put(prsc.buf)
return nil
}
func (prsc *poolReadSeekCloser) Read(p []byte) (n int, err error) {
prsc.m.RLock()
defer prsc.m.RUnlock()
if prsc.closed {
return 0, io.EOF
}
return prsc.Reader.Read(p)
}