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/buffer.go
2024-06-19 09:52:01 +02:00

59 lines
1.2 KiB
Go

package bufferpool
import (
"bytes"
"io"
"sync"
)
type Buffer interface {
io.Writer
io.Closer
GetReadSeekCloser() (io.ReadSeekCloser, error)
}
type buffer struct {
*bytes.Buffer
buf []byte
pool *sync.Pool
m sync.Mutex
closed bool
}
func (b *buffer) Close() error {
b.m.Lock()
defer b.m.Unlock()
if !b.closed {
b.pool.Put(b.buf)
b.closed = true
}
return nil
}
// GetReadSeekCloser returns a ReadSeekCloser that reads from the buffer.
// GetReadSeekCloser after Close will return EOF.
// It's a responsibility of the caller to Close the ReadSeekCloser to put the buffer back into the pool.
func (b *buffer) GetReadSeekCloser() (io.ReadSeekCloser, error) {
b.m.Lock()
defer b.m.Unlock()
if !b.closed {
b.closed = true
return newPoolReadSeekCloser(b.Buffer.Bytes(), b.pool), nil
}
return nil, io.EOF
}
// Close puts the buffer back into the pool.
// Close after GetReadSeekCloser does nothing.
func (b *buffer) Write(p []byte) (n int, err error) {
b.m.Lock()
defer b.m.Unlock()
if b.closed {
return 0, io.EOF
}
return b.Buffer.Write(p)
}
// Close puts the buffer back into the pool.
// Close after GetReadSeekCloser does nothing.