aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/mstats.go
diff options
context:
space:
mode:
authorMichael Pratt <mpratt@google.com>2020-10-28 18:06:05 -0400
committerMichael Pratt <mpratt@google.com>2020-10-30 20:20:58 +0000
commit6abbfc17c255c07134a69c3ca305231db80530ec (patch)
tree0c63ed03f28c20d9927ee8c4352ba0d16f76cb99 /src/runtime/mstats.go
parent94b3fd06cb431358f45786246cd279c8bdb9370b (diff)
downloadgo-6abbfc17c255c07134a69c3ca305231db80530ec.tar.xz
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/mstats.go')
-rw-r--r--src/runtime/mstats.go14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/runtime/mstats.go b/src/runtime/mstats.go
index e0a417d213..3829355d7b 100644
--- a/src/runtime/mstats.go
+++ b/src/runtime/mstats.go
@@ -601,6 +601,8 @@ func readGCStats_m(pauses *[]uint64) {
//
//go:nowritebarrier
func updatememstats() {
+ assertWorldStopped()
+
// Flush mcaches to mcentral before doing anything else.
//
// Flushing to the mcentral may in general cause stats to
@@ -706,6 +708,8 @@ func updatememstats() {
//
//go:nowritebarrier
func flushmcache(i int) {
+ assertWorldStopped()
+
p := allp[i]
c := p.mcache
if c == nil {
@@ -721,6 +725,8 @@ func flushmcache(i int) {
//
//go:nowritebarrier
func flushallmcaches() {
+ assertWorldStopped()
+
for i := 0; i < int(gomaxprocs); i++ {
flushmcache(i)
}
@@ -876,10 +882,10 @@ func (m *consistentHeapStats) release(c *mcache) {
// unsafeRead aggregates the delta for this shard into out.
//
// Unsafe because it does so without any synchronization. The
-// only safe time to call this is if the world is stopped or
-// we're freezing the world or going down anyway (and we just
-// want _some_ estimate).
+// world must be stopped.
func (m *consistentHeapStats) unsafeRead(out *heapStatsDelta) {
+ assertWorldStopped()
+
for i := range m.stats {
out.merge(&m.stats[i])
}
@@ -890,6 +896,8 @@ func (m *consistentHeapStats) unsafeRead(out *heapStatsDelta) {
// Unsafe because the world must be stopped and values should
// be donated elsewhere before clearing.
func (m *consistentHeapStats) unsafeClear() {
+ assertWorldStopped()
+
for i := range m.stats {
m.stats[i] = heapStatsDelta{}
}