mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-19 18:32:23 +00:00
p2p/discover: use lock in reseedingRandom
This commit is contained in:
parent
009658c4fa
commit
051ca137fb
1 changed files with 14 additions and 5 deletions
|
|
@ -22,7 +22,7 @@ import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"net"
|
"net"
|
||||||
"sync/atomic"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common/mclock"
|
"github.com/ethereum/go-ethereum/common/mclock"
|
||||||
|
|
@ -104,20 +104,29 @@ type randomSource interface {
|
||||||
|
|
||||||
// reseedingRandom is a random number generator that tracks when it was last re-seeded.
|
// reseedingRandom is a random number generator that tracks when it was last re-seeded.
|
||||||
type reseedingRandom struct {
|
type reseedingRandom struct {
|
||||||
cur atomic.Pointer[rand.Rand]
|
mu sync.Mutex
|
||||||
|
cur *rand.Rand
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *reseedingRandom) seed() {
|
func (r *reseedingRandom) seed() {
|
||||||
var b [8]byte
|
var b [8]byte
|
||||||
crand.Read(b[:])
|
crand.Read(b[:])
|
||||||
seed := binary.BigEndian.Uint64(b[:])
|
seed := binary.BigEndian.Uint64(b[:])
|
||||||
r.cur.Store(rand.New(rand.NewSource(int64(seed))))
|
new := rand.New(rand.NewSource(int64(seed)))
|
||||||
|
|
||||||
|
r.mu.Lock()
|
||||||
|
r.cur = new
|
||||||
|
r.mu.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *reseedingRandom) Intn(n int) int {
|
func (r *reseedingRandom) Intn(n int) int {
|
||||||
return r.cur.Load().Intn(n)
|
r.mu.Lock()
|
||||||
|
defer r.mu.Unlock()
|
||||||
|
return r.cur.Intn(n)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *reseedingRandom) Int63n(n int64) int64 {
|
func (r *reseedingRandom) Int63n(n int64) int64 {
|
||||||
return r.cur.Load().Int63n(n)
|
r.mu.Lock()
|
||||||
|
defer r.mu.Unlock()
|
||||||
|
return r.cur.Int63n(n)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue