1*6777b538SAndroid Build Coastguard Worker // Copyright 2018 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h" 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker namespace base { 8*6777b538SAndroid Build Coastguard Worker 9*6777b538SAndroid Build Coastguard Worker // static FromUptimeMillis(int64_t uptime_millis_value)10*6777b538SAndroid Build Coastguard WorkerTimeTicks TimeTicks::FromUptimeMillis(int64_t uptime_millis_value) { 11*6777b538SAndroid Build Coastguard Worker // The implementation of the SystemClock.uptimeMillis() in AOSP uses the same 12*6777b538SAndroid Build Coastguard Worker // clock as base::TimeTicks::Now(): clock_gettime(CLOCK_MONOTONIC), see in 13*6777b538SAndroid Build Coastguard Worker // platform/system/code: 14*6777b538SAndroid Build Coastguard Worker // 1. libutils/SystemClock.cpp 15*6777b538SAndroid Build Coastguard Worker // 2. libutils/Timers.cpp 16*6777b538SAndroid Build Coastguard Worker // 17*6777b538SAndroid Build Coastguard Worker // We are not aware of any motivations for Android OEMs to modify the AOSP 18*6777b538SAndroid Build Coastguard Worker // implementation of either uptimeMillis() or clock_gettime(CLOCK_MONOTONIC), 19*6777b538SAndroid Build Coastguard Worker // so we assume that there are no such customizations. 20*6777b538SAndroid Build Coastguard Worker // 21*6777b538SAndroid Build Coastguard Worker // Under these assumptions the conversion is as safe as copying the value of 22*6777b538SAndroid Build Coastguard Worker // base::TimeTicks::Now() with a loss of sub-millisecond precision. 23*6777b538SAndroid Build Coastguard Worker return TimeTicks(uptime_millis_value * Time::kMicrosecondsPerMillisecond); 24*6777b538SAndroid Build Coastguard Worker } 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker // This file is included on chromeos_ash because it needs to interpret 27*6777b538SAndroid Build Coastguard Worker // UptimeMillis values from the Android container. 28*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID) 29*6777b538SAndroid Build Coastguard Worker 30*6777b538SAndroid Build Coastguard Worker // static FromJavaNanoTime(int64_t nano_time_value)31*6777b538SAndroid Build Coastguard WorkerTimeTicks TimeTicks::FromJavaNanoTime(int64_t nano_time_value) { 32*6777b538SAndroid Build Coastguard Worker // The implementation of the System.nanoTime() in AOSP uses the same 33*6777b538SAndroid Build Coastguard Worker // clock as UptimeMillis() and base::TimeTicks::Now(): 34*6777b538SAndroid Build Coastguard Worker // clock_gettime(CLOCK_MONOTONIC), see ojluni/src/main/native/System.c in 35*6777b538SAndroid Build Coastguard Worker // AOSP. 36*6777b538SAndroid Build Coastguard Worker // 37*6777b538SAndroid Build Coastguard Worker // From Android documentation on android.os.SystemClock: 38*6777b538SAndroid Build Coastguard Worker // [uptimeMillis()] is the basis for most interval timing such as 39*6777b538SAndroid Build Coastguard Worker // Thread.sleep(millls), Object.wait(millis), and System.nanoTime(). 40*6777b538SAndroid Build Coastguard Worker // 41*6777b538SAndroid Build Coastguard Worker // We are not aware of any motivations for Android OEMs to modify the AOSP 42*6777b538SAndroid Build Coastguard Worker // implementation of either uptimeMillis(), nanoTime, or 43*6777b538SAndroid Build Coastguard Worker // clock_gettime(CLOCK_MONOTONIC), so we assume that there are no such 44*6777b538SAndroid Build Coastguard Worker // customizations. 45*6777b538SAndroid Build Coastguard Worker // 46*6777b538SAndroid Build Coastguard Worker // Under these assumptions the conversion is as safe as copying the value of 47*6777b538SAndroid Build Coastguard Worker // base::TimeTicks::Now() without the (theoretical) sub-microsecond 48*6777b538SAndroid Build Coastguard Worker // resolution. 49*6777b538SAndroid Build Coastguard Worker return TimeTicks(nano_time_value / Time::kNanosecondsPerMicrosecond); 50*6777b538SAndroid Build Coastguard Worker } 51*6777b538SAndroid Build Coastguard Worker ToUptimeMillis() const52*6777b538SAndroid Build Coastguard Workerjlong TimeTicks::ToUptimeMillis() const { 53*6777b538SAndroid Build Coastguard Worker // See FromUptimeMillis. UptimeMillis and TimeTicks use the same clock source, 54*6777b538SAndroid Build Coastguard Worker // and only differ in resolution. 55*6777b538SAndroid Build Coastguard Worker return us_ / Time::kMicrosecondsPerMillisecond; 56*6777b538SAndroid Build Coastguard Worker } 57*6777b538SAndroid Build Coastguard Worker ToUptimeMicros() const58*6777b538SAndroid Build Coastguard Workerjlong TimeTicks::ToUptimeMicros() const { 59*6777b538SAndroid Build Coastguard Worker // Same as ToUptimeMillis but maintains sub-millisecond precision. 60*6777b538SAndroid Build Coastguard Worker return us_; 61*6777b538SAndroid Build Coastguard Worker } 62*6777b538SAndroid Build Coastguard Worker 63*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_ANDROID) 64*6777b538SAndroid Build Coastguard Worker 65*6777b538SAndroid Build Coastguard Worker } // namespace base 66