decode_typgen.go 769 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package msgpack
  2. import (
  3. "reflect"
  4. "sync"
  5. )
  6. var cachedValues struct {
  7. m map[reflect.Type]chan reflect.Value
  8. sync.RWMutex
  9. }
  10. func cachedValue(t reflect.Type) reflect.Value {
  11. cachedValues.RLock()
  12. ch := cachedValues.m[t]
  13. cachedValues.RUnlock()
  14. if ch != nil {
  15. return <-ch
  16. }
  17. cachedValues.Lock()
  18. defer cachedValues.Unlock()
  19. if ch = cachedValues.m[t]; ch != nil {
  20. return <-ch
  21. }
  22. ch = make(chan reflect.Value, 256)
  23. go func() {
  24. for {
  25. ch <- reflect.New(t)
  26. }
  27. }()
  28. if cachedValues.m == nil {
  29. cachedValues.m = make(map[reflect.Type]chan reflect.Value, 8)
  30. }
  31. cachedValues.m[t] = ch
  32. return <-ch
  33. }
  34. func (d *Decoder) newValue(t reflect.Type) reflect.Value {
  35. if d.flags&usePreallocateValues == 0 {
  36. return reflect.New(t)
  37. }
  38. return cachedValue(t)
  39. }