| | |
| | |
| | |
| |
|
| | |
| |
|
| | package testing |
| |
|
| | import ( |
| | "errors" |
| | "internal/syscall/windows" |
| | "math/bits" |
| | "syscall" |
| | "time" |
| | ) |
| |
|
| | |
| | |
| | func isWindowsRetryable(err error) bool { |
| | for { |
| | unwrapped := errors.Unwrap(err) |
| | if unwrapped == nil { |
| | break |
| | } |
| | err = unwrapped |
| | } |
| | if err == syscall.ERROR_ACCESS_DENIED { |
| | return true |
| | } |
| | if err == windows.ERROR_SHARING_VIOLATION { |
| | return true |
| | } |
| | return false |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | type highPrecisionTime struct { |
| | now int64 |
| | } |
| |
|
| | |
| | func highPrecisionTimeNow() highPrecisionTime { |
| | var t highPrecisionTime |
| | |
| | t.now = windows.QueryPerformanceCounter() |
| | return t |
| | } |
| |
|
| | func (a highPrecisionTime) sub(b highPrecisionTime) time.Duration { |
| | delta := a.now - b.now |
| |
|
| | if queryPerformanceFrequency == 0 { |
| | queryPerformanceFrequency = windows.QueryPerformanceFrequency() |
| | } |
| | hi, lo := bits.Mul64(uint64(delta), uint64(time.Second)/uint64(time.Nanosecond)) |
| | quo, _ := bits.Div64(hi, lo, uint64(queryPerformanceFrequency)) |
| | return time.Duration(quo) |
| | } |
| |
|
| | var queryPerformanceFrequency int64 |
| |
|
| | |
| | func highPrecisionTimeSince(a highPrecisionTime) time.Duration { |
| | return highPrecisionTimeNow().sub(a) |
| | } |
| |
|