config_without_sync_map.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. disallowUnknownFields bool
  14. cacheLock *sync.RWMutex
  15. decoderCache map[reflect.Type]ValDecoder
  16. encoderCache map[reflect.Type]ValEncoder
  17. extensions []Extension
  18. streamPool chan *Stream
  19. iteratorPool chan *Iterator
  20. }
  21. func (cfg *frozenConfig) initCache() {
  22. cfg.cacheLock = &sync.RWMutex{}
  23. cfg.decoderCache = map[reflect.Type]ValDecoder{}
  24. cfg.encoderCache = map[reflect.Type]ValEncoder{}
  25. }
  26. func (cfg *frozenConfig) addDecoderToCache(cacheKey reflect.Type, decoder ValDecoder) {
  27. cfg.cacheLock.Lock()
  28. cfg.decoderCache[cacheKey] = decoder
  29. cfg.cacheLock.Unlock()
  30. }
  31. func (cfg *frozenConfig) addEncoderToCache(cacheKey reflect.Type, encoder ValEncoder) {
  32. cfg.cacheLock.Lock()
  33. cfg.encoderCache[cacheKey] = encoder
  34. cfg.cacheLock.Unlock()
  35. }
  36. func (cfg *frozenConfig) getDecoderFromCache(cacheKey reflect.Type) ValDecoder {
  37. cfg.cacheLock.RLock()
  38. decoder, _ := cfg.decoderCache[cacheKey].(ValDecoder)
  39. cfg.cacheLock.RUnlock()
  40. return decoder
  41. }
  42. func (cfg *frozenConfig) getEncoderFromCache(cacheKey reflect.Type) ValEncoder {
  43. cfg.cacheLock.RLock()
  44. encoder, _ := cfg.encoderCache[cacheKey].(ValEncoder)
  45. cfg.cacheLock.RUnlock()
  46. return encoder
  47. }
  48. var cfgCacheLock = &sync.RWMutex{}
  49. var cfgCache = map[Config]*frozenConfig{}
  50. func getFrozenConfigFromCache(cfg Config) *frozenConfig {
  51. cfgCacheLock.RLock()
  52. frozenConfig := cfgCache[cfg]
  53. cfgCacheLock.RUnlock()
  54. return frozenConfig
  55. }
  56. func addFrozenConfigToCache(cfg Config, frozenConfig *frozenConfig) {
  57. cfgCacheLock.Lock()
  58. cfgCache[cfg] = frozenConfig
  59. cfgCacheLock.Unlock()
  60. }