blob: 8d6a173b89af009dd4e0c755636bf31beadbf241 [file] [log] [blame] [edit]
// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "power_manager/common/clock.h"
#include <time.h>
#include <base/notreached.h>
namespace power_manager {
namespace {
// TODO(abhishekbh): Copied from Chrome's //base/time/time_now_posix.cc. Make
// upstream code available via libchrome and use it here:
// http://crbug.com/166153.
int64_t ConvertTimespecToMicros(const struct timespec& ts) {
// On 32-bit systems, the calculation cannot overflow int64_t.
// 2**32 * 1000000 + 2**64 / 1000 < 2**63
if (sizeof(ts.tv_sec) <= 4 && sizeof(ts.tv_nsec) <= 8) {
int64_t result = ts.tv_sec;
result *= base::Time::kMicrosecondsPerSecond;
result += (ts.tv_nsec / base::Time::kNanosecondsPerMicrosecond);
return result;
} else {
base::CheckedNumeric<int64_t> result(ts.tv_sec);
result *= base::Time::kMicrosecondsPerSecond;
result += (ts.tv_nsec / base::Time::kNanosecondsPerMicrosecond);
return result.ValueOrDie();
}
}
// TODO(abhishekbh): Copied from Chrome's //base/time/time_now_posix.cc. Make
// upstream code available via libchrome and use it here:
// http://crbug.com/166153.
// Returns count of |clk_id|. Retuns 0 if |clk_id| isn't present on the system.
int64_t ClockNow(clockid_t clk_id) {
struct timespec ts;
if (clock_gettime(clk_id, &ts) != 0) {
NOTREACHED() << "clock_gettime(" << clk_id << ") failed.";
return 0;
}
return ConvertTimespecToMicros(ts);
}
} // namespace
Clock::Clock() {}
Clock::~Clock() {}
base::TimeTicks Clock::GetCurrentTime() {
if (!current_time_for_testing_.is_null()) {
current_time_for_testing_ += time_step_for_testing_;
return current_time_for_testing_;
}
return base::TimeTicks::Now();
}
base::TimeTicks Clock::GetCurrentBootTime() {
if (!current_boot_time_for_testing_.is_null()) {
current_boot_time_for_testing_ += time_step_for_testing_;
return current_boot_time_for_testing_;
}
return base::TimeTicks() +
base::TimeDelta::FromMicroseconds(ClockNow(CLOCK_BOOTTIME));
}
base::Time Clock::GetCurrentWallTime() {
if (!current_wall_time_for_testing_.is_null()) {
current_wall_time_for_testing_ += time_step_for_testing_;
return current_wall_time_for_testing_;
}
return base::Time::Now();
}
} // namespace power_manager