mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: rename m.gcing to m.preemptoff and make it a string
m.gcing has become overloaded to mean "don't preempt this g" in general. Once the garbage collector is preemptible, the one thing it *won't* mean is that we're in the garbage collector. So, rename gcing to "preemptoff" and make it a string giving a reason that preemption is disabled. gcing was never set to anything but 0 or 1, so we don't have to worry about there being a stack of reasons. Change-Id: I4337c29e8e942e7aa4f106fc29597e1b5de4ef46 Reviewed-on: https://go-review.googlesource.com/3660 Reviewed-by: Russ Cox <rsc@golang.org>
This commit is contained in:
parent
f95becaddb
commit
28b5118415
13 changed files with 36 additions and 32 deletions
|
|
@ -208,7 +208,7 @@ func stackalloc(n uint32) stack {
|
|||
}
|
||||
var x gclinkptr
|
||||
c := thisg.m.mcache
|
||||
if c == nil || thisg.m.gcing != 0 || thisg.m.helpgc != 0 {
|
||||
if c == nil || thisg.m.preemptoff != "" || thisg.m.helpgc != 0 {
|
||||
// c == nil can happen in the guts of exitsyscall or
|
||||
// procresize. Just get a stack from the global pool.
|
||||
// Also don't touch stackcache during gc
|
||||
|
|
@ -271,7 +271,7 @@ func stackfree(stk stack) {
|
|||
}
|
||||
x := gclinkptr(v)
|
||||
c := gp.m.mcache
|
||||
if c == nil || gp.m.gcing != 0 || gp.m.helpgc != 0 {
|
||||
if c == nil || gp.m.preemptoff != "" || gp.m.helpgc != 0 {
|
||||
lock(&stackpoolmu)
|
||||
stackpoolfree(x, order)
|
||||
unlock(&stackpoolmu)
|
||||
|
|
@ -648,7 +648,8 @@ func newstack() {
|
|||
|
||||
// Be conservative about where we preempt.
|
||||
// We are interested in preempting user Go code, not runtime code.
|
||||
// If we're holding locks, mallocing, or GCing, don't preempt.
|
||||
// If we're holding locks, mallocing, or preemption is disabled, don't
|
||||
// preempt.
|
||||
// This check is very early in newstack so that even the status change
|
||||
// from Grunning to Gwaiting and back doesn't happen in this case.
|
||||
// That status change by itself can be viewed as a small preemption,
|
||||
|
|
@ -658,7 +659,7 @@ func newstack() {
|
|||
// it needs a lock held by the goroutine), that small preemption turns
|
||||
// into a real deadlock.
|
||||
if preempt {
|
||||
if thisg.m.locks != 0 || thisg.m.mallocing != 0 || thisg.m.gcing != 0 || thisg.m.p.status != _Prunning {
|
||||
if thisg.m.locks != 0 || thisg.m.mallocing != 0 || thisg.m.preemptoff != "" || thisg.m.p.status != _Prunning {
|
||||
// Let the goroutine keep running for now.
|
||||
// gp->preempt is set, so it will be preempted next time.
|
||||
gp.stackguard0 = gp.stack.lo + _StackGuard
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue