File tree Expand file tree Collapse file tree 6 files changed +26
-12
lines changed Expand file tree Collapse file tree 6 files changed +26
-12
lines changed Original file line number Diff line number Diff line change 55 "fmt"
66 "reflect"
77 "strings"
8+ "sync"
89 "sync/atomic"
910 "unicode"
1011 "unsafe"
@@ -17,22 +18,27 @@ var (
1718 typeAddr * runtime.TypeAddr
1819 cachedDecoderMap unsafe.Pointer // map[uintptr]decoder
1920 cachedDecoder []Decoder
21+ initOnce sync.Once
2022)
2123
22- func init () {
23- typeAddr = runtime .AnalyzeTypeAddr ()
24- if typeAddr == nil {
25- typeAddr = & runtime.TypeAddr {}
26- }
27- cachedDecoder = make ([]Decoder , typeAddr .AddrRange >> typeAddr .AddrShift + 1 )
24+ func initDecoder () {
25+ initOnce .Do (func () {
26+ typeAddr = runtime .AnalyzeTypeAddr ()
27+ if typeAddr == nil {
28+ typeAddr = & runtime.TypeAddr {}
29+ }
30+ cachedDecoder = make ([]Decoder , typeAddr .AddrRange >> typeAddr .AddrShift + 1 )
31+ })
2832}
2933
3034func loadDecoderMap () map [uintptr ]Decoder {
35+ initDecoder ()
3136 p := atomic .LoadPointer (& cachedDecoderMap )
3237 return * (* map [uintptr ]Decoder )(unsafe .Pointer (& p ))
3338}
3439
3540func storeDecoder (typ uintptr , dec Decoder , m map [uintptr ]Decoder ) {
41+ initDecoder ()
3642 newDecoderMap := make (map [uintptr ]Decoder , len (m )+ 1 )
3743 newDecoderMap [typ ] = dec
3844
Original file line number Diff line number Diff line change @@ -10,6 +10,7 @@ import (
1010)
1111
1212func CompileToGetDecoder (typ * runtime.Type ) (Decoder , error ) {
13+ initDecoder ()
1314 typeptr := uintptr (unsafe .Pointer (typ ))
1415 if typeptr > typeAddr .MaxTypeAddr {
1516 return compileToGetDecoderSlowPath (typeptr , typ )
Original file line number Diff line number Diff line change @@ -13,6 +13,7 @@ import (
1313var decMu sync.RWMutex
1414
1515func CompileToGetDecoder (typ * runtime.Type ) (Decoder , error ) {
16+ initDecoder ()
1617 typeptr := uintptr (unsafe .Pointer (typ ))
1718 if typeptr > typeAddr .MaxTypeAddr {
1819 return compileToGetDecoderSlowPath (typeptr , typ )
Original file line number Diff line number Diff line change 55 "encoding"
66 "encoding/json"
77 "reflect"
8+ "sync"
89 "sync/atomic"
910 "unsafe"
1011
@@ -24,14 +25,17 @@ var (
2425 cachedOpcodeSets []* OpcodeSet
2526 cachedOpcodeMap unsafe.Pointer // map[uintptr]*OpcodeSet
2627 typeAddr * runtime.TypeAddr
28+ initEncoderOnce sync.Once
2729)
2830
29- func init () {
30- typeAddr = runtime .AnalyzeTypeAddr ()
31- if typeAddr == nil {
32- typeAddr = & runtime.TypeAddr {}
33- }
34- cachedOpcodeSets = make ([]* OpcodeSet , typeAddr .AddrRange >> typeAddr .AddrShift + 1 )
31+ func initEncoder () {
32+ initEncoderOnce .Do (func () {
33+ typeAddr = runtime .AnalyzeTypeAddr ()
34+ if typeAddr == nil {
35+ typeAddr = & runtime.TypeAddr {}
36+ }
37+ cachedOpcodeSets = make ([]* OpcodeSet , typeAddr .AddrRange >> typeAddr .AddrShift + 1 )
38+ })
3539}
3640
3741func loadOpcodeMap () map [uintptr ]* OpcodeSet {
Original file line number Diff line number Diff line change 44package encoder
55
66func CompileToGetCodeSet (ctx * RuntimeContext , typeptr uintptr ) (* OpcodeSet , error ) {
7+ initEncoder ()
78 if typeptr > typeAddr .MaxTypeAddr || typeptr < typeAddr .BaseTypeAddr {
89 codeSet , err := compileToGetCodeSetSlowPath (typeptr )
910 if err != nil {
Original file line number Diff line number Diff line change @@ -10,6 +10,7 @@ import (
1010var setsMu sync.RWMutex
1111
1212func CompileToGetCodeSet (ctx * RuntimeContext , typeptr uintptr ) (* OpcodeSet , error ) {
13+ initEncoder ()
1314 if typeptr > typeAddr .MaxTypeAddr || typeptr < typeAddr .BaseTypeAddr {
1415 codeSet , err := compileToGetCodeSetSlowPath (typeptr )
1516 if err != nil {
You can’t perform that action at this time.
0 commit comments