sync: add explicit noCopy fields to Map, Mutex, and Once

Following CLs will refactor Mutex and change the internals of Map. This
ends up breaking tests in x/tools for the copylock vet check, because
the error message changes. Let's insulate ourselves from such things
permanently by adding an explicit noCopy field. We'll update the vet
check to accept that as the problem, rather than depend on less explicit
internals.

We capture Once here too to clean up the error message as well.

Change-Id: Iead985fc8ec9ef3ea5ff615f26dde17bb03aeadb
Reviewed-on: https://go-review.googlesource.com/c/go/+/627777
Reviewed-by: Cherry Mui <cherryyz@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Tim King <taking@google.com>
This commit is contained in:
Michael Anthony Knyszek 2024-11-15 19:22:16 +00:00 committed by Gopher Robot
parent 5a0f2a7a7c
commit 53b2b64b64
4 changed files with 11 additions and 2 deletions

View File

@ -36,6 +36,8 @@ import (
// //
// [the Go memory model]: https://go.dev/ref/mem // [the Go memory model]: https://go.dev/ref/mem
type Map struct { type Map struct {
_ noCopy
mu Mutex mu Mutex
// read contains the portion of the map's contents that are safe for // read contains the portion of the map's contents that are safe for

View File

@ -34,6 +34,8 @@ func fatal(string)
// //
// [the Go memory model]: https://go.dev/ref/mem // [the Go memory model]: https://go.dev/ref/mem
type Mutex struct { type Mutex struct {
_ noCopy
state int32 state int32
sema uint32 sema uint32
} }

View File

@ -18,6 +18,8 @@ import (
// //
// [the Go memory model]: https://go.dev/ref/mem // [the Go memory model]: https://go.dev/ref/mem
type Once struct { type Once struct {
_ noCopy
// done indicates whether the action has been performed. // done indicates whether the action has been performed.
// It is first in the struct because it is used in the hot path. // It is first in the struct because it is used in the hot path.
// The hot path is inlined at every call site. // The hot path is inlined at every call site.

View File

@ -9,7 +9,10 @@
package main package main
import "sync" import (
"sync"
"time"
)
type T struct { type T struct {
int int
@ -38,7 +41,7 @@ func main() {
_ = x _ = x
} }
{ {
x := sync.Mutex{0, 0} // ERROR "assignment.*Mutex" x := time.Time{0, 0, nil} // ERROR "assignment.*Time"
_ = x _ = x
} }
{ {