| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- // 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 (
- "time"
- "golang.org/x/sys/windows"
- "gopkg.in/DataDog/dd-trace-go.v1/internal/log"
- )
- // This method is more precise than the go1.8 time.Now on Windows
- // See https://msdn.microsoft.com/en-us/library/windows/desktop/hh706895(v=vs.85).aspx
- // It is however ~10x slower and requires Windows 8+.
- func highPrecisionNow() int64 {
- var ft windows.Filetime
- windows.GetSystemTimePreciseAsFileTime(&ft)
- return ft.Nanoseconds()
- }
- func lowPrecisionNow() int64 {
- return time.Now().UnixNano()
- }
- // We use this method of initializing now over an init function due to dependency issues. The init
- // function may run after other declarations, such as that in payload_test:19, which results in a
- // nil dereference panic.
- var now func() int64 = func() func() int64 {
- if err := windows.LoadGetSystemTimePreciseAsFileTime(); err != nil {
- log.Warn("Unable to load high precison timer, defaulting to time.Now()")
- return lowPrecisionNow
- } else {
- return highPrecisionNow
- }
- }()
- var nowTime func() time.Time = func() func() time.Time {
- if err := windows.LoadGetSystemTimePreciseAsFileTime(); err != nil {
- log.Warn("Unable to load high precison timer, defaulting to time.Now()")
- return func() time.Time { return time.Unix(0, lowPrecisionNow()) }
- } else {
- return func() time.Time { return time.Unix(0, highPrecisionNow()) }
- }
- }()
|