From a1c3e24b5466ede5dd2d817cadc6d91d1ae56f18 Mon Sep 17 00:00:00 2001 From: Kir Kolyshkin Date: Wed, 4 Sep 2024 18:19:44 -0700 Subject: [PATCH] cmd/internal/objabi: use sync.OnceValue Change-Id: I09c134fff728d32c5bc475889b8c673cc18120a0 Reviewed-on: https://go-review.googlesource.com/c/go/+/611041 Auto-Submit: Ian Lance Taylor LUCI-TryBot-Result: Go LUCI Reviewed-by: Ian Lance Taylor Reviewed-by: Dmitri Shuralyov --- src/cmd/internal/objabi/pkgspecial.go | 63 +++++++++++++-------------- 1 file changed, 30 insertions(+), 33 deletions(-) diff --git a/src/cmd/internal/objabi/pkgspecial.go b/src/cmd/internal/objabi/pkgspecial.go index f288096a02..0cf2e64e80 100644 --- a/src/cmd/internal/objabi/pkgspecial.go +++ b/src/cmd/internal/objabi/pkgspecial.go @@ -91,39 +91,36 @@ var allowAsmABIPkgs = []string{ "runtime/internal/startlinetest", } -var ( - pkgSpecials map[string]PkgSpecial - pkgSpecialsOnce sync.Once -) - // LookupPkgSpecial returns special build properties for the given package path. func LookupPkgSpecial(pkgPath string) PkgSpecial { - pkgSpecialsOnce.Do(func() { - // Construct pkgSpecials from various package lists. This lets us use - // more flexible logic, while keeping the final map simple, and avoids - // the init-time cost of a map. - pkgSpecials = make(map[string]PkgSpecial) - set := func(elt string, f func(*PkgSpecial)) { - s := pkgSpecials[elt] - f(&s) - pkgSpecials[elt] = s - } - for _, pkg := range runtimePkgs { - set(pkg, func(ps *PkgSpecial) { ps.Runtime = true; ps.NoInstrument = true }) - } - for _, pkg := range extraNoInstrumentPkgs { - if pkg[0] == '-' { - set(pkg[1:], func(ps *PkgSpecial) { ps.NoInstrument = false }) - } else { - set(pkg, func(ps *PkgSpecial) { ps.NoInstrument = true }) - } - } - for _, pkg := range noRaceFuncPkgs { - set(pkg, func(ps *PkgSpecial) { ps.NoRaceFunc = true }) - } - for _, pkg := range allowAsmABIPkgs { - set(pkg, func(ps *PkgSpecial) { ps.AllowAsmABI = true }) - } - }) - return pkgSpecials[pkgPath] + return pkgSpecialsOnce()[pkgPath] } + +var pkgSpecialsOnce = sync.OnceValue(func() map[string]PkgSpecial { + // Construct pkgSpecials from various package lists. This lets us use + // more flexible logic, while keeping the final map simple, and avoids + // the init-time cost of a map. + pkgSpecials := make(map[string]PkgSpecial) + set := func(elt string, f func(*PkgSpecial)) { + s := pkgSpecials[elt] + f(&s) + pkgSpecials[elt] = s + } + for _, pkg := range runtimePkgs { + set(pkg, func(ps *PkgSpecial) { ps.Runtime = true; ps.NoInstrument = true }) + } + for _, pkg := range extraNoInstrumentPkgs { + if pkg[0] == '-' { + set(pkg[1:], func(ps *PkgSpecial) { ps.NoInstrument = false }) + } else { + set(pkg, func(ps *PkgSpecial) { ps.NoInstrument = true }) + } + } + for _, pkg := range noRaceFuncPkgs { + set(pkg, func(ps *PkgSpecial) { ps.NoRaceFunc = true }) + } + for _, pkg := range allowAsmABIPkgs { + set(pkg, func(ps *PkgSpecial) { ps.AllowAsmABI = true }) + } + return pkgSpecials +}) -- 2.48.1