1*84e33947SAndroid Build Coastguard Worker /* 2*84e33947SAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project 3*84e33947SAndroid Build Coastguard Worker * 4*84e33947SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*84e33947SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*84e33947SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*84e33947SAndroid Build Coastguard Worker * 8*84e33947SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*84e33947SAndroid Build Coastguard Worker * 10*84e33947SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*84e33947SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*84e33947SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*84e33947SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*84e33947SAndroid Build Coastguard Worker * limitations under the License. 15*84e33947SAndroid Build Coastguard Worker */ 16*84e33947SAndroid Build Coastguard Worker 17*84e33947SAndroid Build Coastguard Worker #include "chre/platform/system_time.h" 18*84e33947SAndroid Build Coastguard Worker 19*84e33947SAndroid Build Coastguard Worker #include <cerrno> 20*84e33947SAndroid Build Coastguard Worker #include <cstring> 21*84e33947SAndroid Build Coastguard Worker #include <ctime> 22*84e33947SAndroid Build Coastguard Worker 23*84e33947SAndroid Build Coastguard Worker #include "chre/platform/assert.h" 24*84e33947SAndroid Build Coastguard Worker #include "chre/util/optional.h" 25*84e33947SAndroid Build Coastguard Worker 26*84e33947SAndroid Build Coastguard Worker namespace chre { 27*84e33947SAndroid Build Coastguard Worker namespace { 28*84e33947SAndroid Build Coastguard Worker 29*84e33947SAndroid Build Coastguard Worker chre::Optional<Nanoseconds> gTimeOverride; 30*84e33947SAndroid Build Coastguard Worker 31*84e33947SAndroid Build Coastguard Worker } // anonymous namespace 32*84e33947SAndroid Build Coastguard Worker getMonotonicTime()33*84e33947SAndroid Build Coastguard WorkerNanoseconds SystemTime::getMonotonicTime() { 34*84e33947SAndroid Build Coastguard Worker if (gTimeOverride.has_value()) { 35*84e33947SAndroid Build Coastguard Worker return gTimeOverride.value(); 36*84e33947SAndroid Build Coastguard Worker } 37*84e33947SAndroid Build Coastguard Worker 38*84e33947SAndroid Build Coastguard Worker struct timespec timeNow; 39*84e33947SAndroid Build Coastguard Worker if (clock_gettime(CLOCK_MONOTONIC, &timeNow)) { 40*84e33947SAndroid Build Coastguard Worker CHRE_ASSERT_LOG(false, "Failed to obtain time with error: %s", 41*84e33947SAndroid Build Coastguard Worker strerror(errno)); 42*84e33947SAndroid Build Coastguard Worker return Nanoseconds(UINT64_MAX); 43*84e33947SAndroid Build Coastguard Worker } 44*84e33947SAndroid Build Coastguard Worker 45*84e33947SAndroid Build Coastguard Worker // The C++11 spec guarantees that tv_sec and tv_nsec only have values >= 0 and 46*84e33947SAndroid Build Coastguard Worker // [0, 999999999]. It is safe to static cast these to their unsigned 47*84e33947SAndroid Build Coastguard Worker // counterpart. 48*84e33947SAndroid Build Coastguard Worker return Seconds(static_cast<uint64_t>(timeNow.tv_sec)) + 49*84e33947SAndroid Build Coastguard Worker Nanoseconds(static_cast<uint64_t>(timeNow.tv_nsec)); 50*84e33947SAndroid Build Coastguard Worker } 51*84e33947SAndroid Build Coastguard Worker getEstimatedHostTimeOffset()52*84e33947SAndroid Build Coastguard Workerint64_t SystemTime::getEstimatedHostTimeOffset() { 53*84e33947SAndroid Build Coastguard Worker return 0; 54*84e33947SAndroid Build Coastguard Worker } 55*84e33947SAndroid Build Coastguard Worker 56*84e33947SAndroid Build Coastguard Worker namespace platform_linux { 57*84e33947SAndroid Build Coastguard Worker overrideMonotonicTime(Nanoseconds ns)58*84e33947SAndroid Build Coastguard Workervoid overrideMonotonicTime(Nanoseconds ns) { 59*84e33947SAndroid Build Coastguard Worker gTimeOverride = ns; 60*84e33947SAndroid Build Coastguard Worker } 61*84e33947SAndroid Build Coastguard Worker clearMonotonicTimeOverride(void)62*84e33947SAndroid Build Coastguard Workervoid clearMonotonicTimeOverride(void) { 63*84e33947SAndroid Build Coastguard Worker gTimeOverride.reset(); 64*84e33947SAndroid Build Coastguard Worker } 65*84e33947SAndroid Build Coastguard Worker 66*84e33947SAndroid Build Coastguard Worker } // namespace platform_linux 67*84e33947SAndroid Build Coastguard Worker } // namespace chre 68