aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/runtime/proc.go8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/runtime/proc.go b/src/runtime/proc.go
index e469f20e5e..56f97fa9f7 100644
--- a/src/runtime/proc.go
+++ b/src/runtime/proc.go
@@ -1105,6 +1105,8 @@ var casgstatusAlwaysTrack = false
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")
})
@@ -1120,7 +1122,11 @@ func casgstatus(gp *g, oldval, newval uint32) {
// 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