mirror of
https://github.com/golang/go
synced 2024-11-18 06:44:49 -07:00
runtime: disallow malloc or panic in scavenge
Mallocs and panics in the scavenge path are particularly nasty because they're likely to silently self-deadlock on the mheap.lock. Avoid sinking lots of time into debugging these issues in the future by turning these into immediate throws. Change-Id: Ib36fdda33bc90b21c32432b03561630c1f3c69bc Reviewed-on: https://go-review.googlesource.com/38293 Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Rick Hudson <rlh@golang.org>
This commit is contained in:
parent
13ae271d5d
commit
df6025bc0d
@ -991,6 +991,11 @@ func scavengelist(list *mSpanList, now, limit uint64) uintptr {
|
||||
}
|
||||
|
||||
func (h *mheap) scavenge(k int32, now, limit uint64) {
|
||||
// Disallow malloc or panic while holding the heap lock. We do
|
||||
// this here because this is an non-mallocgc entry-point to
|
||||
// the mheap API.
|
||||
gp := getg()
|
||||
gp.m.mallocing++
|
||||
lock(&h.lock)
|
||||
var sumreleased uintptr
|
||||
for i := 0; i < len(h.free); i++ {
|
||||
@ -998,6 +1003,7 @@ func (h *mheap) scavenge(k int32, now, limit uint64) {
|
||||
}
|
||||
sumreleased += scavengelist(&h.freelarge, now, limit)
|
||||
unlock(&h.lock)
|
||||
gp.m.mallocing--
|
||||
|
||||
if debug.gctrace > 0 {
|
||||
if sumreleased > 0 {
|
||||
|
Loading…
Reference in New Issue
Block a user