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