Linux: Auto-detecting clock adjustment mode

This commit is contained in:
Pavel Kirienko 2014-03-31 19:52:43 +04:00
parent fd6f27b7d8
commit 788d7348b6
2 changed files with 38 additions and 4 deletions

View File

@ -6,8 +6,12 @@
#include <cassert>
#include <ctime>
#include <sys/time.h>
#include <cstdint>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>
#include <uavcan/driver/system_clock.hpp>
#include <uavcan_linux/exception.hpp>
@ -56,8 +60,14 @@ class SystemClock : public uavcan::ISystemClock
return adjtime(&tv, nullptr) == 0;
}
static ClockAdjustmentMode detectPreferredClockAdjustmentMode()
{
const bool godmode = geteuid() == 0;
return godmode ? ClockAdjustmentMode::SystemWide : ClockAdjustmentMode::PerDriverPrivate;
}
public:
SystemClock(ClockAdjustmentMode adj_mode = ClockAdjustmentMode::SystemWide)
SystemClock(ClockAdjustmentMode adj_mode = detectPreferredClockAdjustmentMode())
: gradual_adj_limit_(uavcan::UtcDuration::fromMSec(4000))
, adj_mode_(adj_mode)
, step_adj_cnt_(0)

View File

@ -15,12 +15,36 @@ static std::string systime2str(const std::chrono::system_clock::time_point& tp)
int main()
{
uavcan_linux::SystemClock clock;
/*
* Auto-detected clock adjustment mode
*/
std::cout << "Clock adjustment mode: ";
switch (clock.getAdjustmentMode())
{
case uavcan_linux::ClockAdjustmentMode::SystemWide:
{
std::cout << "SystemWide";
break;
}
case uavcan_linux::ClockAdjustmentMode::PerDriverPrivate:
{
std::cout << "PerDriverPrivate";
break;
}
default:
std::abort();
}
std::cout << std::endl;
/*
* Test adjustment
*/
double sec = 0;
std::cout << "Enter system time adjustment in seconds (fractions allowed): " << std::endl;
std::cin >> sec;
uavcan_linux::SystemClock clock;
const auto before = std::chrono::system_clock::now();
try
{