Commit f4dcc9b2 authored by Austin Clements's avatar Austin Clements

runtime: make _MSpanDead be the zero state

Currently the zero value of an mspan is in the "in use" state. This
seems like a bad idea in general. But it's going to wreak havoc when
we make fixalloc zero allocations: even "freed" mspan objects are
still on the allspans list and still get looked at by the garbage
collector. Hence, if we leave the mspan states the way they are,
allocating a span that reuses old memory will temporarily pass that
span (which is visible to GC!) through the "in use" state, which can
cause "unswept span" panics.

Fix all of this by making the zero state "dead".

Updates #17503.

Change-Id: I77c7ac06e297af4b9e6258bc091c37abe102acc3
Reviewed-on: https://go-review.googlesource.com/31367Reviewed-by: 's avatarKeith Randall <khr@golang.org>
Reviewed-by: 's avatarRick Hudson <rlh@golang.org>
parent aa581f51
......@@ -141,19 +141,19 @@ var mheap_ mheap
type mSpanState uint8
const (
_MSpanInUse mSpanState = iota // allocated for garbage collected heap
_MSpanStack // allocated for use by stack allocator
_MSpanDead mSpanState = iota
_MSpanInUse // allocated for garbage collected heap
_MSpanStack // allocated for use by stack allocator
_MSpanFree
_MSpanDead
)
// mSpanStateNames are the names of the span states, indexed by
// mSpanState.
var mSpanStateNames = []string{
"_MSpanDead",
"_MSpanInUse",
"_MSpanStack",
"_MSpanFree",
"_MSpanDead",
}
// mSpanList heads a linked list of spans.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment