Skip to content

Commit abce6f6

Browse files
committed
fixed data race
1 parent 3ae71c9 commit abce6f6

File tree

1 file changed

+8
-2
lines changed

1 file changed

+8
-2
lines changed

io/struct_decoder.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
| |
77
| io/struct_decoder.go |
88
| |
9-
| LastModified: Mar 5, 2022 |
9+
| LastModified: Dec 13, 2023 |
1010
| Author: Ma Bingyao <[email protected]> |
1111
| |
1212
\*________________________________________________________*/
@@ -67,10 +67,14 @@ func (dec *Decoder) ReadObject() interface{} {
6767
type structDecoder struct {
6868
t *reflect2.UnsafeStructType
6969
fields map[string]FieldAccessor
70+
sync.RWMutex
7071
}
7172

7273
func (valdec *structDecoder) decodeField(dec *Decoder, ptr unsafe.Pointer, name string) {
73-
if field, ok := valdec.fields[name]; ok {
74+
valdec.RLock()
75+
field, ok := valdec.fields[name]
76+
valdec.RUnlock()
77+
if ok {
7478
field.Decode(dec, field.Type.Type1(), field.Field.UnsafeGet(ptr))
7579
} else {
7680
var v interface{}
@@ -130,6 +134,8 @@ func getNamedStructDecoder(t reflect.Type) ValueDecoder {
130134
func newNamedStructDecoder(t reflect.Type, tag ...string) *structDecoder {
131135
t2 := reflect2.Type2(t).(*reflect2.UnsafeStructType)
132136
decoder := &structDecoder{t: t2}
137+
decoder.Lock()
138+
defer decoder.Unlock()
133139
registerNamedStructDecoder(t, decoder)
134140
decoder.fields = getFieldMap(t, tag...)
135141
return decoder

0 commit comments

Comments
 (0)