diff --git a/decode_typgen.go b/decode_typgen.go index 0b4c1d0..e453bce 100644 --- a/decode_typgen.go +++ b/decode_typgen.go @@ -5,36 +5,18 @@ import ( "sync" ) -var cachedValues struct { - m map[reflect.Type]chan reflect.Value - sync.RWMutex -} +var cachedPools sync.Map // map[reflect.Type]*sync.Pool func cachedValue(t reflect.Type) reflect.Value { - cachedValues.RLock() - ch := cachedValues.m[t] - cachedValues.RUnlock() - if ch != nil { - return <-ch - } - - cachedValues.Lock() - defer cachedValues.Unlock() - if ch = cachedValues.m[t]; ch != nil { - return <-ch - } - - ch = make(chan reflect.Value, 256) - go func() { - for { - ch <- reflect.New(t) - } - }() - if cachedValues.m == nil { - cachedValues.m = make(map[reflect.Type]chan reflect.Value, 8) + v, ok := cachedPools.Load(t) + if !ok { + v, _ = cachedPools.LoadOrStore(t, &sync.Pool{ + New: func() interface{} { + return reflect.New(t) + }, + }) } - cachedValues.m[t] = ch - return <-ch + return v.(*sync.Pool).Get().(reflect.Value) } func (d *Decoder) newValue(t reflect.Type) reflect.Value {