| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/time/time.h" | 5 #include "base/time/time.h" |
| 6 | 6 |
| 7 #include <CoreFoundation/CFDate.h> | 7 #include <CoreFoundation/CFDate.h> |
| 8 #include <CoreFoundation/CFTimeZone.h> | 8 #include <CoreFoundation/CFTimeZone.h> |
| 9 #include <mach/mach.h> | 9 #include <mach/mach.h> |
| 10 #include <mach/mach_time.h> | 10 #include <mach/mach_time.h> |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 result /= timebase_info.denom; | 62 result /= timebase_info.denom; |
| 63 | 63 |
| 64 // Don't bother with the rollover handling that the Windows version does. | 64 // Don't bother with the rollover handling that the Windows version does. |
| 65 // With numer and denom = 1 (the expected case), the 64-bit absolute time | 65 // With numer and denom = 1 (the expected case), the 64-bit absolute time |
| 66 // reported in nanoseconds is enough to last nearly 585 years. | 66 // reported in nanoseconds is enough to last nearly 585 years. |
| 67 return base::checked_cast<int64_t>(result.ValueOrDie()); | 67 return base::checked_cast<int64_t>(result.ValueOrDie()); |
| 68 #endif // defined(OS_IOS) | 68 #endif // defined(OS_IOS) |
| 69 } | 69 } |
| 70 | 70 |
| 71 int64_t ComputeThreadTicks() { | 71 int64_t ComputeThreadTicks() { |
| 72 #if defined(OS_IOS) | |
| 73 NOTREACHED(); | |
| 74 return 0; | |
| 75 #else | |
| 76 base::mac::ScopedMachSendRight thread(mach_thread_self()); | 72 base::mac::ScopedMachSendRight thread(mach_thread_self()); |
| 77 mach_msg_type_number_t thread_info_count = THREAD_BASIC_INFO_COUNT; | 73 mach_msg_type_number_t thread_info_count = THREAD_BASIC_INFO_COUNT; |
| 78 thread_basic_info_data_t thread_info_data; | 74 thread_basic_info_data_t thread_info_data; |
| 79 | 75 |
| 80 if (thread.get() == MACH_PORT_NULL) { | 76 if (thread.get() == MACH_PORT_NULL) { |
| 81 DLOG(ERROR) << "Failed to get mach_thread_self()"; | 77 DLOG(ERROR) << "Failed to get mach_thread_self()"; |
| 82 return 0; | 78 return 0; |
| 83 } | 79 } |
| 84 | 80 |
| 85 kern_return_t kr = thread_info( | 81 kern_return_t kr = thread_info( |
| 86 thread, | 82 thread, |
| 87 THREAD_BASIC_INFO, | 83 THREAD_BASIC_INFO, |
| 88 reinterpret_cast<thread_info_t>(&thread_info_data), | 84 reinterpret_cast<thread_info_t>(&thread_info_data), |
| 89 &thread_info_count); | 85 &thread_info_count); |
| 90 MACH_DCHECK(kr == KERN_SUCCESS, kr) << "thread_info"; | 86 MACH_DCHECK(kr == KERN_SUCCESS, kr) << "thread_info"; |
| 91 | 87 |
| 92 base::CheckedNumeric<int64_t> absolute_micros( | 88 base::CheckedNumeric<int64_t> absolute_micros( |
| 93 thread_info_data.user_time.seconds); | 89 thread_info_data.user_time.seconds); |
| 94 absolute_micros *= base::Time::kMicrosecondsPerSecond; | 90 absolute_micros *= base::Time::kMicrosecondsPerSecond; |
| 95 absolute_micros += thread_info_data.user_time.microseconds; | 91 absolute_micros += thread_info_data.user_time.microseconds; |
| 96 return absolute_micros.ValueOrDie(); | 92 return absolute_micros.ValueOrDie(); |
| 97 #endif // defined(OS_IOS) | |
| 98 } | 93 } |
| 99 | 94 |
| 100 } // namespace | 95 } // namespace |
| 101 | 96 |
| 102 namespace base { | 97 namespace base { |
| 103 | 98 |
| 104 // The Time routines in this file use Mach and CoreFoundation APIs, since the | 99 // The Time routines in this file use Mach and CoreFoundation APIs, since the |
| 105 // POSIX definition of time_t in Mac OS X wraps around after 2038--and | 100 // POSIX definition of time_t in Mac OS X wraps around after 2038--and |
| 106 // there are already cookie expiration dates, etc., past that time out in | 101 // there are already cookie expiration dates, etc., past that time out in |
| 107 // the field. Using CFDate prevents that problem, and using mach_absolute_time | 102 // the field. Using CFDate prevents that problem, and using mach_absolute_time |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 230 ThreadTicks ThreadTicks::Now() { | 225 ThreadTicks ThreadTicks::Now() { |
| 231 return ThreadTicks(ComputeThreadTicks()); | 226 return ThreadTicks(ComputeThreadTicks()); |
| 232 } | 227 } |
| 233 | 228 |
| 234 // static | 229 // static |
| 235 TraceTicks TraceTicks::Now() { | 230 TraceTicks TraceTicks::Now() { |
| 236 return TraceTicks(ComputeCurrentTicks()); | 231 return TraceTicks(ComputeCurrentTicks()); |
| 237 } | 232 } |
| 238 | 233 |
| 239 } // namespace base | 234 } // namespace base |
| OLD | NEW |