compile_race.go 712 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. //go:build race
  2. // +build race
  3. package decoder
  4. import (
  5. "sync"
  6. "unsafe"
  7. "github.com/goccy/go-json/internal/runtime"
  8. )
  9. var decMu sync.RWMutex
  10. func CompileToGetDecoder(typ *runtime.Type) (Decoder, error) {
  11. initDecoder()
  12. typeptr := uintptr(unsafe.Pointer(typ))
  13. if typeptr > typeAddr.MaxTypeAddr {
  14. return compileToGetDecoderSlowPath(typeptr, typ)
  15. }
  16. index := (typeptr - typeAddr.BaseTypeAddr) >> typeAddr.AddrShift
  17. decMu.RLock()
  18. if dec := cachedDecoder[index]; dec != nil {
  19. decMu.RUnlock()
  20. return dec, nil
  21. }
  22. decMu.RUnlock()
  23. dec, err := compileHead(typ, map[uintptr]Decoder{})
  24. if err != nil {
  25. return nil, err
  26. }
  27. decMu.Lock()
  28. cachedDecoder[index] = dec
  29. decMu.Unlock()
  30. return dec, nil
  31. }