]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: prevent duplicated works in WriteRuntimeTypes
authorCuong Manh Le <cuong.manhle.vn@gmail.com>
Tue, 8 Jun 2021 12:28:45 +0000 (19:28 +0700)
committerCuong Manh Le <cuong.manhle.vn@gmail.com>
Thu, 19 Aug 2021 16:10:32 +0000 (16:10 +0000)
While processing signatset, the entry is deleted immediately after being
pushed to signatslice. Then calling writeType may add the same type
to signatset again. That would add more works, though not a big impact
to the performace, since when writeType is guarded by s.Siggen() check.

Instead, we should keep the entry in signatset, so written type will
never be added again.

This change does not affect compiler performace, but help debugging
issue like one in #46386 easier.

Change-Id: Iddafe773885fa21cb7003ba27ddf9554fc3f297d
Reviewed-on: https://go-review.googlesource.com/c/go/+/326029
Trust: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/compile/internal/reflectdata/reflect.go

index b04e4d684fa4677caa04b2c0aa571e21dcb751d8..3db6585894d5888c65a21146751870392d22d589 100644 (file)
@@ -39,8 +39,11 @@ func CountPTabs() int {
 
 // runtime interface and reflection data structures
 var (
-       signatmu    sync.Mutex // protects signatset and signatslice
-       signatset   = make(map[*types.Type]struct{})
+       // protects signatset and signatslice
+       signatmu sync.Mutex
+       // Tracking which types need runtime type descriptor
+       signatset = make(map[*types.Type]struct{})
+       // Queue of types wait to be generated runtime type descriptor
        signatslice []*types.Type
 
        gcsymmu  sync.Mutex // protects gcsymset and gcsymslice
@@ -1248,7 +1251,6 @@ func WriteRuntimeTypes() {
                // Transfer entries to a slice and sort, for reproducible builds.
                for _, t := range signatslice {
                        signats = append(signats, typeAndStr{t: t, short: types.TypeSymName(t), regular: t.String()})
-                       delete(signatset, t)
                }
                signatslice = signatslice[:0]
                sort.Sort(typesByString(signats))