Skip to content

Commit d09a8c8

Browse files
Robert Griesemergopherbot
authored andcommitted
go/types, types2: simplify locking in Named.resolveUnderlying
Avoid calling Named.resolveUnderlying in the first place (there is only one caller) if Named.underlying exists already. In Named.resolveUnderlying remove initial atomic check because of the check in Named.Underlying. Also, remove a 2nd atomic check after acquiring the lock as it likely won't help much. Change-Id: Ife87218fa2549d0903a10218f4dd7a70f85d6c7c Reviewed-on: https://go-review.googlesource.com/c/go/+/713521 Auto-Submit: Robert Griesemer <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Robert Griesemer <[email protected]> Reviewed-by: Mark Freeman <[email protected]>
1 parent 5a42af7 commit d09a8c8

File tree

2 files changed

+16
-24
lines changed

2 files changed

+16
-24
lines changed

src/cmd/compile/internal/types2/named.go

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -562,7 +562,10 @@ func (n *Named) Underlying() Type {
562562
}
563563
}
564564

565-
n.resolveUnderlying()
565+
if !n.stateHas(underlying) {
566+
n.resolveUnderlying()
567+
}
568+
566569
return n.underlying
567570
}
568571

@@ -588,11 +591,6 @@ func (t *Named) String() string { return TypeString(t, nil) }
588591
func (n *Named) resolveUnderlying() {
589592
assert(n.stateHas(resolved))
590593

591-
// optimization for likely case
592-
if n.stateHas(underlying) {
593-
return
594-
}
595-
596594
var seen map[*Named]int // allocated lazily
597595
var u Type
598596
for rhs := Type(n); u == nil; {
@@ -618,12 +616,7 @@ func (n *Named) resolveUnderlying() {
618616
break
619617
}
620618

621-
// acquire the lock without checking; performance is probably fine
622-
t.resolve()
623-
t.mu.Lock()
624-
defer t.mu.Unlock()
625-
626-
// t.underlying might have been set while we were locking
619+
// avoid acquiring the lock if we can
627620
if t.stateHas(underlying) {
628621
u = t.underlying
629622
break
@@ -634,6 +627,9 @@ func (n *Named) resolveUnderlying() {
634627
}
635628
seen[t] = len(seen)
636629

630+
t.resolve()
631+
t.mu.Lock()
632+
defer t.mu.Unlock()
637633
assert(t.fromRHS != nil || t.allowNilRHS)
638634
rhs = t.fromRHS
639635

src/go/types/named.go

Lines changed: 8 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)