aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/proc.go
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2022-02-07 17:07:44 -0800
committerIan Lance Taylor <iant@golang.org>2022-02-08 22:26:40 +0000
commit5442f4d51b01fea94159b035ce5b5ca5834487e5 (patch)
treee3209b70ac1d4b647ef8192cf46ba3e685719497 /src/runtime/proc.go
parent540632841e678573885e296db0cb73b15f48f96c (diff)
downloadgo-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.go14
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 {