OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 28 matching lines...) Expand all Loading... | |
39 #if defined(WEBRTC_MAC) | 39 #if defined(WEBRTC_MAC) |
40 static mach_timebase_info_data_t timebase; | 40 static mach_timebase_info_data_t timebase; |
41 if (timebase.denom == 0) { | 41 if (timebase.denom == 0) { |
42 // Get the timebase if this is the first time we run. | 42 // Get the timebase if this is the first time we run. |
43 // Recommended by Apple's QA1398. | 43 // Recommended by Apple's QA1398. |
44 if (mach_timebase_info(&timebase) != KERN_SUCCESS) { | 44 if (mach_timebase_info(&timebase) != KERN_SUCCESS) { |
45 RTC_DCHECK(false); | 45 RTC_DCHECK(false); |
46 } | 46 } |
47 } | 47 } |
48 // Use timebase to convert absolute time tick units into nanoseconds. | 48 // Use timebase to convert absolute time tick units into nanoseconds. |
49 ticks = mach_absolute_time() * timebase.numer / timebase.denom; | 49 ticks = mach_absolute_time() * timebase.numer / timebase.denom; |
tommi
2016/01/26 23:23:46
since we're here - can we do something about this
sprang_webrtc
2016/01/27 08:48:47
Are your sure "low initial value" applies here? Th
noahric
2016/04/05 04:48:28
FYI, the reason it was different was: https://code
| |
50 #elif defined(WEBRTC_POSIX) | 50 #elif defined(WEBRTC_POSIX) |
51 struct timespec ts; | 51 struct timespec ts; |
52 // TODO: Do we need to handle the case when CLOCK_MONOTONIC | 52 // TODO: Do we need to handle the case when CLOCK_MONOTONIC |
53 // is not supported? | 53 // is not supported? |
54 clock_gettime(CLOCK_MONOTONIC, &ts); | 54 clock_gettime(CLOCK_MONOTONIC, &ts); |
55 ticks = kNumNanosecsPerSec * static_cast<int64_t>(ts.tv_sec) + | 55 ticks = kNumNanosecsPerSec * static_cast<int64_t>(ts.tv_sec) + |
56 static_cast<int64_t>(ts.tv_nsec); | 56 static_cast<int64_t>(ts.tv_nsec); |
57 #elif defined(WEBRTC_WIN) | 57 #elif defined(WEBRTC_WIN) |
58 static volatile LONG last_timegettime = 0; | 58 static volatile LONG last_timegettime = 0; |
59 static volatile int64_t num_wrap_timegettime = 0; | 59 static volatile int64_t num_wrap_timegettime = 0; |
60 volatile LONG* last_timegettime_ptr = &last_timegettime; | 60 volatile LONG* last_timegettime_ptr = &last_timegettime; |
61 DWORD now = timeGetTime(); | 61 DWORD now = timeGetTime(); |
62 // Atomically update the last gotten time | 62 // Atomically update the last gotten time |
63 DWORD old = InterlockedExchange(last_timegettime_ptr, now); | 63 DWORD old = InterlockedExchange(last_timegettime_ptr, now); |
64 if (now < old) { | 64 if (now < old) { |
65 // If now is earlier than old, there may have been a race between | 65 // If now is earlier than old, there may have been a race between |
66 // threads. | 66 // threads. |
67 // 0x0fffffff ~3.1 days, the code will not take that long to execute | 67 // 0x0fffffff ~3.1 days, the code will not take that long to execute |
68 // so it must have been a wrap around. | 68 // so it must have been a wrap around. |
69 if (old > 0xf0000000 && now < 0x0fffffff) { | 69 if (old > 0xf0000000 && now < 0x0fffffff) { |
70 num_wrap_timegettime++; | 70 num_wrap_timegettime++; |
71 } | 71 } |
72 } | 72 } |
73 ticks = now + (num_wrap_timegettime << 32); | 73 ticks = now + (num_wrap_timegettime << 32); |
74 // TODO: Calculate with nanosecond precision. Otherwise, we're just | 74 // TODO: Calculate with nanosecond precision. Otherwise, we're just |
75 // wasting a multiply and divide when doing Time() on Windows. | 75 // wasting a multiply and divide when doing Time() on Windows. |
76 ticks = ticks * kNumNanosecsPerMillisec; | 76 ticks = ticks * kNumNanosecsPerMillisec; |
77 #else | |
pbos-webrtc
2016/01/26 15:00:22
#else #error? Do we ever build with none of these
sprang_webrtc
2016/01/27 08:48:47
Agreed it makes more sense to have #error here ins
| |
78 struct timeval tv; | |
79 gettimeofday(&tv, NULL); | |
80 ticks = | |
81 (kNumNanosecsPerSec * tv.tv_sec) + (kNumNanosecsPerMicrosec * tv.tv_usec); | |
77 #endif | 82 #endif |
78 return ticks; | 83 return ticks; |
79 } | 84 } |
80 | 85 |
81 uint32_t Time() { | 86 uint32_t Time() { |
82 return static_cast<uint32_t>(TimeNanos() / kNumNanosecsPerMillisec); | 87 return static_cast<uint32_t>(TimeNanos() / kNumNanosecsPerMillisec); |
83 } | 88 } |
84 | 89 |
85 uint64_t TimeMicros() { | 90 uint64_t TimeMicros() { |
86 return static_cast<uint64_t>(TimeNanos() / kNumNanosecsPerMicrosec); | 91 return static_cast<uint64_t>(TimeNanos() / kNumNanosecsPerMicrosec); |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
242 if (expiry_in_leap_year && month <= 2 - 1) // |month| is zero based. | 247 if (expiry_in_leap_year && month <= 2 - 1) // |month| is zero based. |
243 day -= 1; | 248 day -= 1; |
244 | 249 |
245 // Combine all variables into seconds from 1970-01-01 00:00 (except |month| | 250 // Combine all variables into seconds from 1970-01-01 00:00 (except |month| |
246 // which was accumulated into |day| above). | 251 // which was accumulated into |day| above). |
247 return (((static_cast<int64_t> | 252 return (((static_cast<int64_t> |
248 (year - 1970) * 365 + day) * 24 + hour) * 60 + min) * 60 + sec; | 253 (year - 1970) * 365 + day) * 24 + hour) * 60 + min) * 60 + sec; |
249 } | 254 } |
250 | 255 |
251 } // namespace rtc | 256 } // namespace rtc |
OLD | NEW |