config_without_sync_map.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. //+build !go1.9
  2. package jsoniter
  3. import (
  4. "sync"
  5. )
  6. type frozenConfig struct {
  7. configBeforeFrozen Config
  8. sortMapKeys bool
  9. indentionStep int
  10. objectFieldMustBeSimpleString bool
  11. onlyTaggedField bool
  12. disallowUnknownFields bool
  13. cacheLock *sync.RWMutex
  14. decoderCache map[uintptr]ValDecoder
  15. encoderCache map[uintptr]ValEncoder
  16. extensions []Extension
  17. streamPool *sync.Pool
  18. iteratorPool *sync.Pool
  19. }
  20. func (cfg *frozenConfig) initCache() {
  21. cfg.cacheLock = &sync.RWMutex{}
  22. cfg.decoderCache = map[uintptr]ValDecoder{}
  23. cfg.encoderCache = map[uintptr]ValEncoder{}
  24. }
  25. func (cfg *frozenConfig) addDecoderToCache(cacheKey uintptr, decoder ValDecoder) {
  26. cfg.cacheLock.Lock()
  27. cfg.decoderCache[cacheKey] = decoder
  28. cfg.cacheLock.Unlock()
  29. }
  30. func (cfg *frozenConfig) addEncoderToCache(cacheKey uintptr, encoder ValEncoder) {
  31. cfg.cacheLock.Lock()
  32. cfg.encoderCache[cacheKey] = encoder
  33. cfg.cacheLock.Unlock()
  34. }
  35. func (cfg *frozenConfig) getDecoderFromCache(cacheKey uintptr) 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 uintptr) ValEncoder {
  42. cfg.cacheLock.RLock()
  43. encoder, _ := cfg.encoderCache[cacheKey].(ValEncoder)
  44. cfg.cacheLock.RUnlock()
  45. return encoder
  46. }
  47. var cfgCacheLock = &sync.RWMutex{}
  48. var cfgCache = map[Config]*frozenConfig{}
  49. func getFrozenConfigFromCache(cfg Config) *frozenConfig {
  50. cfgCacheLock.RLock()
  51. frozenConfig := cfgCache[cfg]
  52. cfgCacheLock.RUnlock()
  53. return frozenConfig
  54. }
  55. func addFrozenConfigToCache(cfg Config, frozenConfig *frozenConfig) {
  56. cfgCacheLock.Lock()
  57. cfgCache[cfg] = frozenConfig
  58. cfgCacheLock.Unlock()
  59. }