diff options
author | Ian Lance Taylor <iant@golang.org> | 2022-02-07 17:07:44 -0800 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2022-02-08 22:26:40 +0000 |
commit | 5442f4d51b01fea94159b035ce5b5ca5834487e5 (patch) | |
tree | e3209b70ac1d4b647ef8192cf46ba3e685719497 /src/runtime/proc.go | |
parent | 540632841e678573885e296db0cb73b15f48f96c (diff) | |
download | go-5442f4d51b01fea94159b035ce5b5ca5834487e5.tar.gz go-5442f4d51b01fea94159b035ce5b5ca5834487e5.zip |
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 <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Diffstat (limited to 'src/runtime/proc.go')
-rw-r--r-- | src/runtime/proc.go | 14 |
1 files 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 { |