TimeAndOffsetFromDevice returns time we got from phc device + offset
(device string, method TimeMethod)
| 103 | |
| 104 | // TimeAndOffsetFromDevice returns time we got from phc device + offset |
| 105 | func TimeAndOffsetFromDevice(device string, method TimeMethod) (SysoffResult, error) { |
| 106 | f, err := os.Open(device) |
| 107 | if err != nil { |
| 108 | return SysoffResult{}, err |
| 109 | } |
| 110 | defer f.Close() |
| 111 | dev := FromFile(f) |
| 112 | |
| 113 | switch method { |
| 114 | case MethodSyscallClockGettime: |
| 115 | var ts unix.Timespec |
| 116 | ts1 := time.Now() |
| 117 | err = unix.ClockGettime(dev.ClockID(), &ts) |
| 118 | ts2 := time.Now() |
| 119 | if err != nil { |
| 120 | return SysoffResult{}, fmt.Errorf("failed clock_gettime: %w", err) |
| 121 | } |
| 122 | |
| 123 | return SysoffEstimateBasic(ts1, time.Unix(ts.Unix()), ts2), nil |
| 124 | case MethodIoctlSysOffsetExtended: |
| 125 | extended, err := dev.ReadSysoffExtended() |
| 126 | if err != nil { |
| 127 | return SysoffResult{}, err |
| 128 | } |
| 129 | return extended.BestSample(), nil |
| 130 | case MethodIoctlSysOffsetExtendedRealTimeClock: |
| 131 | extended, err := dev.ReadSysoffExtendedRealTimeClock1() |
| 132 | if err != nil { |
| 133 | return SysoffResult{}, err |
| 134 | } |
| 135 | return extended.BestSample(), nil |
| 136 | case MethodIoctlSysOffsetPrecise: |
| 137 | precise, err := dev.ReadSysoffPrecise() |
| 138 | if err != nil { |
| 139 | return SysoffResult{}, err |
| 140 | } |
| 141 | return SysoffFromPrecise(precise), nil |
| 142 | } |
| 143 | return SysoffResult{}, fmt.Errorf("unknown method to get PHC time %q", method) |
| 144 | } |
| 145 | |
| 146 | // generics in standard library can't come soon enough... |
| 147 | func abs(value time.Duration) time.Duration { |
no test coverage detected
searching dependent graphs…