From 5442f4d51b01fea94159b035ce5b5ca5834487e5 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Mon, 7 Feb 2022 17:07:44 -0800 Subject: [PATCH] runtime: restore old mp.fastrand initialization CL 337350 changed mp.fastrand from a [2]uint32 to a uint64 and changed the initialization to a single call of int64Hash. However, int64Hash returns uintptr, so 32-bit systems this always left the most significant 32 bits of mp.fastrand initialized to 0. The new code also did not protect against initializing mp.fastrand to 0, which on a system that does not implement math.Mul64 (most 32-bit systems) would lead fastrand to always return 0. This CL restores the mp.fastrand initialization to what it was before CL 337350, adjusted for the change from [2]uint32 to uint64. Change-Id: I663b415d9424d967e8e665ce2d017604dcd5b204 Reviewed-on: https://go-review.googlesource.com/c/go/+/383916 Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor Reviewed-by: Keith Randall TryBot-Result: Gopher Robot --- src/runtime/proc.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 1be7a60830..94cff06a73 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -802,8 +802,18 @@ func mcommoninit(mp *m, id int64) { mp.id = mReserveID() } - // cputicks is not very random in startup virtual machine - mp.fastrand = uint64(int64Hash(uint64(mp.id), fastrandseed^uintptr(cputicks()))) + lo := uint32(int64Hash(uint64(mp.id), fastrandseed)) + hi := uint32(int64Hash(uint64(cputicks()), ^fastrandseed)) + if lo|hi == 0 { + hi = 1 + } + // Same behavior as for 1.17. + // TODO: Simplify ths. + if goarch.BigEndian { + mp.fastrand = uint64(lo)<<32 | uint64(hi) + } else { + mp.fastrand = uint64(hi)<<32 | uint64(lo) + } mpreinit(mp) if mp.gsignal != nil { -- 2.50.0