| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- // Unless explicitly stated otherwise all files in this repository are licensed
- // under the Apache License Version 2.0.
- // This product includes software developed at Datadog (https://www.datadoghq.com/).
- // Copyright 2016 Datadog, Inc.
- package tracer
- import (
- cryptorand "crypto/rand"
- "math"
- "math/big"
- "math/rand"
- "sync"
- "time"
- "gopkg.in/DataDog/dd-trace-go.v1/internal/log"
- )
- // random holds a thread-safe source of random numbers.
- var random *rand.Rand
- func init() {
- var seed int64
- n, err := cryptorand.Int(cryptorand.Reader, big.NewInt(math.MaxInt64))
- if err == nil {
- seed = n.Int64()
- } else {
- log.Warn("cannot generate random seed: %v; using current time", err)
- seed = time.Now().UnixNano()
- }
- random = rand.New(&safeSource{
- source: rand.NewSource(seed),
- })
- }
- // safeSource holds a thread-safe implementation of rand.Source64.
- type safeSource struct {
- source rand.Source
- sync.Mutex
- }
- func (rs *safeSource) Int63() int64 {
- rs.Lock()
- n := rs.source.Int63()
- rs.Unlock()
- return n
- }
- func (rs *safeSource) Uint64() uint64 { return uint64(rs.Int63()) }
- func (rs *safeSource) Seed(seed int64) {
- rs.Lock()
- rs.source.Seed(seed)
- rs.Unlock()
- }
|