From f32f2954fbabbb29ce1f7d25c223a9ce25e1e317 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Tue, 10 Nov 2015 15:24:59 -0500 Subject: [PATCH] runtime: never allocate new M when jumping time forward When we're jumping time forward, it means everyone is asleep, so there should always be an M available. Furthermore, this causes both allocation and write barriers in contexts that may be running without a P (such as in sysmon). Hence, replace this allocation with a throw. Updates #10600. Change-Id: I2cee70d5db828d0044082878995949edb25dda5f Reviewed-on: https://go-review.googlesource.com/16815 Reviewed-by: Russ Cox --- src/runtime/proc.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 4dba0cabe9..94443b53c2 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -3274,11 +3274,12 @@ func checkdead() { } mp := mget() if mp == nil { - newm(nil, _p_) - } else { - mp.nextp.set(_p_) - notewakeup(&mp.park) + // There should always be a free M since + // nothing is running. + throw("checkdead: no m for timer") } + mp.nextp.set(_p_) + notewakeup(&mp.park) return } -- 2.48.1