aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/heapdump.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/heapdump.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/heapdump.go')
-rw-r--r--src/runtime/heapdump.go15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/runtime/heapdump.go b/src/runtime/heapdump.go
index 33e224d587..2d531571aa 100644
--- a/src/runtime/heapdump.go
+++ b/src/runtime/heapdump.go
@@ -431,6 +431,9 @@ func finq_callback(fn *funcval, obj unsafe.Pointer, nret uintptr, fint *_type, o
}
func dumproots() {
+ // To protect mheap_.allspans.
+ assertWorldStopped()
+
// TODO(mwhudson): dump datamask etc from all objects
// data segment
dumpint(tagData)
@@ -468,6 +471,9 @@ func dumproots() {
var freemark [_PageSize / 8]bool
func dumpobjs() {
+ // To protect mheap_.allspans.
+ assertWorldStopped()
+
for _, s := range mheap_.allspans {
if s.state.get() != mSpanInUse {
continue
@@ -552,6 +558,8 @@ func dumpms() {
//go:systemstack
func dumpmemstats(m *MemStats) {
+ assertWorldStopped()
+
// These ints should be identical to the exported
// MemStats structure and should be ordered the same
// way too.
@@ -634,6 +642,9 @@ func dumpmemprof_callback(b *bucket, nstk uintptr, pstk *uintptr, size, allocs,
}
func dumpmemprof() {
+ // To protect mheap_.allspans.
+ assertWorldStopped()
+
iterate_memprof(dumpmemprof_callback)
for _, s := range mheap_.allspans {
if s.state.get() != mSpanInUse {
@@ -655,6 +666,8 @@ func dumpmemprof() {
var dumphdr = []byte("go1.7 heap dump\n")
func mdump(m *MemStats) {
+ assertWorldStopped()
+
// make sure we're done sweeping
for _, s := range mheap_.allspans {
if s.state.get() == mSpanInUse {
@@ -676,6 +689,8 @@ func mdump(m *MemStats) {
}
func writeheapdump_m(fd uintptr, m *MemStats) {
+ assertWorldStopped()
+
_g_ := getg()
casgstatus(_g_.m.curg, _Grunning, _Gwaiting)
_g_.waitreason = waitReasonDumpingHeap