diff options
author | Michael Pratt <mpratt@google.com> | 2020-10-28 18:06:05 -0400 |
---|---|---|
committer | Michael Pratt <mpratt@google.com> | 2020-10-30 20:20:58 +0000 |
commit | 6abbfc17c255c07134a69c3ca305231db80530ec (patch) | |
tree | 0c63ed03f28c20d9927ee8c4352ba0d16f76cb99 /src/runtime/mgcmark.go | |
parent | 94b3fd06cb431358f45786246cd279c8bdb9370b (diff) | |
download | go-6abbfc17c255c07134a69c3ca305231db80530ec.tar.gz go-6abbfc17c255c07134a69c3ca305231db80530ec.zip |
runtime: add world-stopped assertions
Stopping the world is an implicit lock for many operations, so we should
assert the world is stopped in functions that require it.
This is enabled along with the rest of lock ranking, though it is a bit
orthogonal and likely cheap enough to enable all the time should we
choose.
Requiring a lock _or_ world stop is common, so that can be expressed as
well.
Updates #40677
Change-Id: If0a58544f4251d367f73c4120c9d39974c6cd091
Reviewed-on: https://go-review.googlesource.com/c/go/+/248577
Run-TryBot: Michael Pratt <mpratt@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
Trust: Michael Pratt <mpratt@google.com>
Diffstat (limited to 'src/runtime/mgcmark.go')
-rw-r--r-- | src/runtime/mgcmark.go | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/src/runtime/mgcmark.go b/src/runtime/mgcmark.go index c71c0e58d3..5a24cdac88 100644 --- a/src/runtime/mgcmark.go +++ b/src/runtime/mgcmark.go @@ -54,6 +54,8 @@ const ( // // The world must be stopped. func gcMarkRootPrepare() { + assertWorldStopped() + work.nFlushCacheRoots = 0 // Compute how many data and BSS root blocks there are. @@ -1535,6 +1537,8 @@ func gcmarknewobject(span *mspan, obj, size, scanSize uintptr) { // // The world must be stopped. func gcMarkTinyAllocs() { + assertWorldStopped() + for _, p := range allp { c := p.mcache if c == nil || c.tiny == 0 { |