func casgstatus(gp *g, oldval, newval uint32) {
if (oldval&_Gscan != 0) || (newval&_Gscan != 0) || oldval == newval {
systemstack(func() {
+ // Call on the systemstack to prevent print and throw from counting
+ // against the nosplit stack reservation.
print("runtime: casgstatus: oldval=", hex(oldval), " newval=", hex(newval), "\n")
throw("casgstatus: bad incoming values")
})
// GC time to finish and change the state to oldval.
for i := 0; !gp.atomicstatus.CompareAndSwap(oldval, newval); i++ {
if oldval == _Gwaiting && gp.atomicstatus.Load() == _Grunnable {
- throw("casgstatus: waiting for Gwaiting but is Grunnable")
+ systemstack(func() {
+ // Call on the systemstack to prevent throw from counting
+ // against the nosplit stack reservation.
+ throw("casgstatus: waiting for Gwaiting but is Grunnable")
+ })
}
if i == 0 {
nextYield = nanotime() + yieldDelay