]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: restore old mp.fastrand initialization
authorIan Lance Taylor <iant@golang.org>
Tue, 8 Feb 2022 01:07:44 +0000 (17:07 -0800)
committerIan Lance Taylor <iant@golang.org>
Tue, 8 Feb 2022 22:26:40 +0000 (22:26 +0000)
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>

src/runtime/proc.go

index 1be7a60830d628bcb4ab2a04f2b1d5a3a19e9d19..94cff06a73dc58f3eea1889c454b9592493276ed 100644 (file)
@@ -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 {