60 lines
1.5 KiB
Go
60 lines
1.5 KiB
Go
package gojay
|
|
|
|
import (
|
|
"io"
|
|
"sync"
|
|
)
|
|
|
|
var streamDecPool = sync.Pool{
|
|
New: newStreamDecoderPool,
|
|
}
|
|
|
|
// NewDecoder returns a new StreamDecoder.
|
|
// It takes an io.Reader implementation as data input.
|
|
// It initiates the done channel returned by Done().
|
|
func (s stream) NewDecoder(r io.Reader) *StreamDecoder {
|
|
dec := NewDecoder(r)
|
|
streamDec := &StreamDecoder{
|
|
Decoder: dec,
|
|
done: make(chan struct{}, 1),
|
|
mux: sync.RWMutex{},
|
|
}
|
|
return streamDec
|
|
}
|
|
func newStreamDecoderPool() interface{} {
|
|
return Stream.NewDecoder(nil)
|
|
}
|
|
|
|
// BorrowDecoder borrows a StreamDecoder from the pool.
|
|
// It takes an io.Reader implementation as data input.
|
|
// It initiates the done channel returned by Done().
|
|
//
|
|
// If no StreamEncoder is available in the pool, it returns a fresh one
|
|
func (s stream) BorrowDecoder(r io.Reader) *StreamDecoder {
|
|
return s.borrowDecoder(r, 512)
|
|
}
|
|
|
|
func (s stream) borrowDecoder(r io.Reader, bufSize int) *StreamDecoder {
|
|
streamDec := streamDecPool.Get().(*StreamDecoder)
|
|
streamDec.called = 0
|
|
streamDec.keysDone = 0
|
|
streamDec.cursor = 0
|
|
streamDec.err = nil
|
|
streamDec.r = r
|
|
streamDec.length = 0
|
|
streamDec.isPooled = 0
|
|
streamDec.done = make(chan struct{}, 1)
|
|
if bufSize > 0 {
|
|
streamDec.data = make([]byte, bufSize)
|
|
}
|
|
return streamDec
|
|
}
|
|
|
|
// Release sends back a Decoder to the pool.
|
|
// If a decoder is used after calling Release
|
|
// a panic will be raised with an InvalidUsagePooledDecoderError error.
|
|
func (dec *StreamDecoder) Release() {
|
|
dec.isPooled = 1
|
|
streamDecPool.Put(dec)
|
|
}
|