feature_config_without_sync_map.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. //+build !go1.9
  2. package jsoniter
  3. import (
  4. "reflect"
  5. "sync"
  6. )
  7. type frozenConfig struct {
  8. configBeforeFrozen Config
  9. sortMapKeys bool
  10. indentionStep int
  11. objectFieldMustBeSimpleString bool
  12. onlyTaggedField bool
  13. cacheLock *sync.RWMutex
  14. decoderCache map[reflect.Type]ValDecoder
  15. encoderCache map[reflect.Type]ValEncoder
  16. extensions []Extension
  17. streamPool chan *Stream
  18. iteratorPool chan *Iterator
  19. }
  20. func (cfg *frozenConfig) initCache() {
  21. cfg.cacheLock = &sync.RWMutex{}
  22. cfg.decoderCache = map[reflect.Type]ValDecoder{}
  23. cfg.encoderCache = map[reflect.Type]ValEncoder{}
  24. }
  25. func (cfg *frozenConfig) addDecoderToCache(cacheKey reflect.Type, decoder ValDecoder) {
  26. cfg.cacheLock.Lock()
  27. cfg.decoderCache[cacheKey] = decoder
  28. cfg.cacheLock.Unlock()
  29. }
  30. func (cfg *frozenConfig) addEncoderToCache(cacheKey reflect.Type, encoder ValEncoder) {
  31. cfg.cacheLock.Lock()
  32. cfg.encoderCache[cacheKey] = encoder
  33. cfg.cacheLock.Unlock()
  34. }
  35. func (cfg *frozenConfig) getDecoderFromCache(cacheKey reflect.Type) ValDecoder {
  36. cfg.cacheLock.RLock()
  37. decoder, _ := cfg.decoderCache[cacheKey].(ValDecoder)
  38. cfg.cacheLock.RUnlock()
  39. return decoder
  40. }
  41. func (cfg *frozenConfig) getEncoderFromCache(cacheKey reflect.Type) ValEncoder {
  42. cfg.cacheLock.RLock()
  43. encoder, _ := cfg.encoderCache[cacheKey].(ValEncoder)
  44. cfg.cacheLock.RUnlock()
  45. return encoder
  46. }