From: Ian Lance Taylor Date: Wed, 17 Nov 2021 19:07:44 +0000 (-0800) Subject: runtime: make faketime more robust against GC X-Git-Tag: go1.18beta1~261 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=0440fb833405a5c61ed0269af9c5897b03390bac;p=gostls13.git runtime: make faketime more robust against GC When using faketime, only run the scavenger for one loop. It tries to run for 1 ms, but with faketime that calculation fails. Prohibit write barriers in the faketime write function, in case the GC wants to print something (e.g., with GODEBUG=gctrace=1). Fixes #49614 Change-Id: Iab5097fe78b6e0032ea8b493088264dfb25013c6 Reviewed-on: https://go-review.googlesource.com/c/go/+/364757 Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor Reviewed-by: Michael Knyszek TryBot-Result: Go Bot --- diff --git a/src/runtime/mgcscavenge.go b/src/runtime/mgcscavenge.go index 286aa1bbae..0399c2d21c 100644 --- a/src/runtime/mgcscavenge.go +++ b/src/runtime/mgcscavenge.go @@ -344,6 +344,11 @@ func bgscavenge(c chan int) { crit += float64(end - start) } released += r + + // When using fake time just do one loop. + if faketime != 0 { + break + } } if released == 0 { diff --git a/src/runtime/time_fake.go b/src/runtime/time_fake.go index 107f6be335..b5e0463588 100644 --- a/src/runtime/time_fake.go +++ b/src/runtime/time_fake.go @@ -41,6 +41,10 @@ func time_now() (sec int64, nsec int32, mono int64) { return faketime / 1e9, int32(faketime % 1e9), faketime } +// write is like the Unix write system call. +// We have to avoid write barriers to avoid potential deadlock +// on write calls. +//go:nowritebarrierrec func write(fd uintptr, p unsafe.Pointer, n int32) int32 { if !(fd == 1 || fd == 2) { // Do an ordinary write.