mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
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>
This commit is contained in:
parent
540632841e
commit
5442f4d51b
1 changed files with 12 additions and 2 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue