compile_race.go 697 B

12345678910111213141516171819202122232425262728293031323334353637
  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. typeptr := uintptr(unsafe.Pointer(typ))
  12. if typeptr > typeAddr.MaxTypeAddr {
  13. return compileToGetDecoderSlowPath(typeptr, typ)
  14. }
  15. index := (typeptr - typeAddr.BaseTypeAddr) >> typeAddr.AddrShift
  16. decMu.RLock()
  17. if dec := cachedDecoder[index]; dec != nil {
  18. decMu.RUnlock()
  19. return dec, nil
  20. }
  21. decMu.RUnlock()
  22. dec, err := compileHead(typ, map[uintptr]Decoder{})
  23. if err != nil {
  24. return nil, err
  25. }
  26. decMu.Lock()
  27. cachedDecoder[index] = dec
  28. decMu.Unlock()
  29. return dec, nil
  30. }