1aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 2aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Copyright (C) 2013 The Android Open Source Project 3aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 4aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Licensed under the Apache License, Version 2.0 (the "License"); 5aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// you may not use this file except in compliance with the License. 6aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// You may obtain a copy of the License at 7aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 8aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// http://www.apache.org/licenses/LICENSE-2.0 9aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 10aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Unless required by applicable law or agreed to in writing, software 11aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// distributed under the License is distributed on an "AS IS" BASIS, 12aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// See the License for the specific language governing permissions and 14aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// limitations under the License. 15aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 16f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 1739910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/clock.h" 18f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 19f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen#include <time.h> 20f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 21f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthennamespace chromeos_update_engine { 22f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 23f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthenbase::Time Clock::GetWallclockTime() { 24f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen return base::Time::Now(); 25f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen} 26f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 27f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthenbase::Time Clock::GetMonotonicTime() { 28f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen struct timespec now_ts; 29f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen if (clock_gettime(CLOCK_MONOTONIC_RAW, &now_ts) != 0) { 30f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // Avoid logging this as an error as call-sites may call this very 313c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen // often and we don't want to fill up the disk. Note that this 323c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen // only fails if running on ancient kernels (CLOCK_MONOTONIC_RAW 333c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen // was added in Linux 2.6.28) so it never fails on a ChromeOS 343c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen // device. 353c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen return base::Time(); 363c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen } 373c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen struct timeval now_tv; 383c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen now_tv.tv_sec = now_ts.tv_sec; 393c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen now_tv.tv_usec = now_ts.tv_nsec/base::Time::kNanosecondsPerMicrosecond; 403c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen return base::Time::FromTimeVal(now_tv); 413c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen} 423c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen 433c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthenbase::Time Clock::GetBootTime() { 443c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen struct timespec now_ts; 453c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen if (clock_gettime(CLOCK_BOOTTIME, &now_ts) != 0) { 463c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen // Avoid logging this as an error as call-sites may call this very 473c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen // often and we don't want to fill up the disk. Note that this 483c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen // only fails if running on ancient kernels (CLOCK_BOOTTIME was 493c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen // added in Linux 2.6.39) so it never fails on a ChromeOS device. 50f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen return base::Time(); 51f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen } 52f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen struct timeval now_tv; 53f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen now_tv.tv_sec = now_ts.tv_sec; 54f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen now_tv.tv_usec = now_ts.tv_nsec/base::Time::kNanosecondsPerMicrosecond; 55f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen return base::Time::FromTimeVal(now_tv); 56f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen} 57f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 58f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen} // namespace chromeos_update_engine 59