Skip to content

Commit 969fb18

Browse files
Merge pull request #20 from DmitryRomanov/decoder_sync_pool
Decoder sync pool
2 parents b45de07 + 27c156a commit 969fb18

File tree

1 file changed

+9
-26
lines changed

1 file changed

+9
-26
lines changed

insane.go

+9-26
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,13 @@ var (
6363
MapUseThreshold = 16
6464
DisableBeautifulErrors = false // set to "true" for best performance, if you have many decode errors
6565

66-
decoderPool = make([]*decoder, 0, 16)
67-
decoderPoolIndex = -1
68-
decoderPoolMu = &sync.Mutex{}
66+
decoderPool = sync.Pool{
67+
New: func() interface{} {
68+
decoder := &decoder{}
69+
decoder.initPool()
70+
return decoder
71+
},
72+
}
6973

7074
numbersMap = make([]byte, 256)
7175

@@ -144,7 +148,6 @@ type StrictNode struct {
144148
}
145149

146150
type decoder struct {
147-
id int
148151
buf []byte
149152
root Root
150153
nodePool []*Node
@@ -1819,31 +1822,11 @@ func (d *decoder) expandPool() []*Node {
18191822
}
18201823

18211824
func getFromPool() *decoder {
1822-
decoderPoolMu.Lock()
1823-
defer decoderPoolMu.Unlock()
1824-
1825-
decoderPoolIndex++
1826-
if decoderPoolIndex >= len(decoderPool) {
1827-
decoder := &decoder{id: decoderPoolIndex}
1828-
decoder.initPool()
1829-
decoder.id = decoderPoolIndex
1830-
decoderPool = append(decoderPool, decoder)
1831-
}
1832-
1833-
return decoderPool[decoderPoolIndex]
1825+
return decoderPool.Get().(*decoder)
18341826
}
18351827

18361828
func backToPool(d *decoder) {
1837-
decoderPoolMu.Lock()
1838-
defer decoderPoolMu.Unlock()
1839-
1840-
decoderPool[d.id] = decoderPool[decoderPoolIndex]
1841-
decoderPool[d.id].id = d.id
1842-
1843-
d.id = decoderPoolIndex
1844-
decoderPool[decoderPoolIndex] = d
1845-
1846-
decoderPoolIndex--
1829+
decoderPool.Put(d)
18471830
}
18481831

18491832
func Spawn() *Root {

0 commit comments

Comments
 (0)