mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[dev.garbage] runtime: make sure G.param and SudoG.elem do not hold stale pointers
In old conservative Go, this could cause memory leaks. A new pickier collector might reasonably crash when it saw one of these. LGTM=rlh R=rlh CC=golang-codereviews https://golang.org/cl/147480043
This commit is contained in:
parent
fdb0cc6e7b
commit
a3630c9e44
4 changed files with 30 additions and 2 deletions
|
|
@ -148,6 +148,9 @@ func acquireSudog() *sudog {
|
|||
c := gomcache()
|
||||
s := c.sudogcache
|
||||
if s != nil {
|
||||
if s.elem != nil {
|
||||
gothrow("acquireSudog: found s.elem != nil in cache")
|
||||
}
|
||||
c.sudogcache = s.next
|
||||
return s
|
||||
}
|
||||
|
|
@ -162,12 +165,22 @@ func acquireSudog() *sudog {
|
|||
// which keeps the garbage collector from being invoked.
|
||||
mp := acquirem()
|
||||
p := new(sudog)
|
||||
if p.elem != nil {
|
||||
gothrow("acquireSudog: found p.elem != nil after new")
|
||||
}
|
||||
releasem(mp)
|
||||
return p
|
||||
}
|
||||
|
||||
//go:nosplit
|
||||
func releaseSudog(s *sudog) {
|
||||
if s.elem != nil {
|
||||
gothrow("runtime: sudog with non-nil elem")
|
||||
}
|
||||
gp := getg()
|
||||
if gp.param != nil {
|
||||
gothrow("runtime: releaseSudog with non-nil gp.param")
|
||||
}
|
||||
c := gomcache()
|
||||
s.next = c.sudogcache
|
||||
c.sudogcache = s
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue