Move to steady_timer
deadline_timer and steady_timer have one important difference, the
former runs off CLOCK_REALTIME, and the later runs off CLOCK_MONOTONIC.
For a long time we've relied on deadline_timer incorrectly, given that
dbus-sensors does not care in the least about the calendar time, and
only cares about the difference between sensor scans.
Fortunately, this likely has no effect on the behavior of the sensors
most of the time, and in general, in a time change, the clock generally
moves forward, so all timers would immediately expire, scan all sensors,
and move on. phosphor-pid-control is intentionally designed to handle
this case, so it's quite likely that a user would never notice it, and
even if they did, would have to be looking at a debug console the moment
it happened.
The other effect is that in most cases, sensors call clock_gettime more
than they probably need to, which might slow down the performance.
This commit moves all usages of sensor timing to steady_timer, which
should give us more consistent results, and (in theory at least) be
faster. Because of stdlib compliance things, this also has the effect
of us dropping our dependence on boost::posix_time, and move to
std::chrono::duration objects, per the coding standard.
Signed-off-by: Ed Tanous <edtanous@google.com>
Change-Id: I69f948fb3f0fc0dfd7fd196d26ba46742a3e15a7
diff --git a/src/ADCSensor.cpp b/src/ADCSensor.cpp
index eacce22..fe2c8a7 100644
--- a/src/ADCSensor.cpp
+++ b/src/ADCSensor.cpp
@@ -18,7 +18,6 @@
#include <ADCSensor.hpp>
#include <boost/asio/read_until.hpp>
-#include <boost/date_time/posix_time/posix_time.hpp>
#include <sdbusplus/asio/connection.hpp>
#include <sdbusplus/asio/object_server.hpp>
@@ -109,7 +108,7 @@
// value. Guarantee that the HW signal can be stable, the HW signal
// could be instability.
waitTimer.expires_from_now(
- boost::posix_time::milliseconds(bridgeGpio->setupTimeMs));
+ std::chrono::milliseconds(bridgeGpio->setupTimeMs));
waitTimer.async_wait(
[weakRef, buffer](const boost::system::error_code& ec) {
std::shared_ptr<ADCSensor> self = weakRef.lock();
@@ -198,7 +197,7 @@
return; // we're no longer valid
}
inputDev.assign(fd);
- waitTimer.expires_from_now(boost::posix_time::milliseconds(sensorPollMs));
+ waitTimer.expires_from_now(std::chrono::milliseconds(sensorPollMs));
waitTimer.async_wait([weakRef](const boost::system::error_code& ec) {
std::shared_ptr<ADCSensor> self = weakRef.lock();
if (ec == boost::asio::error::operation_aborted)
diff --git a/src/ADCSensorMain.cpp b/src/ADCSensorMain.cpp
index a2f6514..05d586f 100644
--- a/src/ADCSensorMain.cpp
+++ b/src/ADCSensorMain.cpp
@@ -320,7 +320,7 @@
UpdateType::init);
});
- boost::asio::deadline_timer filterTimer(io);
+ boost::asio::steady_timer filterTimer(io);
std::function<void(sdbusplus::message_t&)> eventHandler =
[&](sdbusplus::message_t& message) {
if (message.is_method_error())
@@ -330,7 +330,7 @@
}
sensorsChanged->insert(message.get_path());
// this implicitly cancels the timer
- filterTimer.expires_from_now(boost::posix_time::seconds(1));
+ filterTimer.expires_from_now(std::chrono::seconds(1));
filterTimer.async_wait([&](const boost::system::error_code& ec) {
if (ec == boost::asio::error::operation_aborted)
@@ -378,7 +378,7 @@
}
// this implicitly cancels the timer
- filterTimer.expires_from_now(boost::posix_time::seconds(1));
+ filterTimer.expires_from_now(std::chrono::seconds(1));
filterTimer.async_wait([&](const boost::system::error_code& ec) {
if (ec == boost::asio::error::operation_aborted)
diff --git a/src/ChassisIntrusionSensor.cpp b/src/ChassisIntrusionSensor.cpp
index 6c40717..2bb04ce 100644
--- a/src/ChassisIntrusionSensor.cpp
+++ b/src/ChassisIntrusionSensor.cpp
@@ -146,8 +146,7 @@
void ChassisIntrusionSensor::pollSensorStatusByPch()
{
// setting a new experation implicitly cancels any pending async wait
- mPollTimer.expires_from_now(
- boost::posix_time::seconds(intrusionSensorPollSec));
+ mPollTimer.expires_from_now(std::chrono::seconds(intrusionSensorPollSec));
mPollTimer.async_wait([&](const boost::system::error_code& ec) {
// case of timer expired
diff --git a/src/ExitAirTempSensor.cpp b/src/ExitAirTempSensor.cpp
index 33fd079..eb816e8 100644
--- a/src/ExitAirTempSensor.cpp
+++ b/src/ExitAirTempSensor.cpp
@@ -938,11 +938,11 @@
io.post([&]() { createSensor(objectServer, sensor, systemBus); });
- boost::asio::deadline_timer configTimer(io);
+ boost::asio::steady_timer configTimer(io);
std::function<void(sdbusplus::message_t&)> eventHandler =
[&](sdbusplus::message_t&) {
- configTimer.expires_from_now(boost::posix_time::seconds(1));
+ configTimer.expires_from_now(std::chrono::seconds(1));
// create a timer because normally multiple properties change
configTimer.async_wait([&](const boost::system::error_code& ec) {
if (ec == boost::asio::error::operation_aborted)
diff --git a/src/ExternalSensor.cpp b/src/ExternalSensor.cpp
index 3a6c4aa..cbba6e1 100644
--- a/src/ExternalSensor.cpp
+++ b/src/ExternalSensor.cpp
@@ -4,7 +4,6 @@
#include <unistd.h>
-#include <boost/date_time/posix_time/posix_time.hpp>
#include <sdbusplus/asio/connection.hpp>
#include <sdbusplus/asio/object_server.hpp>
diff --git a/src/ExternalSensorMain.cpp b/src/ExternalSensorMain.cpp
index e79098f..23721a8 100644
--- a/src/ExternalSensorMain.cpp
+++ b/src/ExternalSensorMain.cpp
@@ -351,7 +351,7 @@
createSensors(objectServer, sensors, systemBus, nullptr, reaperTimer);
});
- boost::asio::deadline_timer filterTimer(io);
+ boost::asio::steady_timer filterTimer(io);
std::function<void(sdbusplus::message_t&)> eventHandler =
[&objectServer, &sensors, &systemBus, &sensorsChanged, &filterTimer,
&reaperTimer](sdbusplus::message_t& message) mutable {
@@ -370,7 +370,7 @@
}
// this implicitly cancels the timer
- filterTimer.expires_from_now(boost::posix_time::seconds(1));
+ filterTimer.expires_from_now(std::chrono::seconds(1));
filterTimer.async_wait(
[&objectServer, &sensors, &systemBus, &sensorsChanged,
diff --git a/src/FanMain.cpp b/src/FanMain.cpp
index a192380..9d495e0 100644
--- a/src/FanMain.cpp
+++ b/src/FanMain.cpp
@@ -556,7 +556,7 @@
nullptr);
});
- boost::asio::deadline_timer filterTimer(io);
+ boost::asio::steady_timer filterTimer(io);
std::function<void(sdbusplus::message_t&)> eventHandler =
[&](sdbusplus::message_t& message) {
if (message.is_method_error())
@@ -566,7 +566,7 @@
}
sensorsChanged->insert(message.get_path());
// this implicitly cancels the timer
- filterTimer.expires_from_now(boost::posix_time::seconds(1));
+ filterTimer.expires_from_now(std::chrono::seconds(1));
filterTimer.async_wait([&](const boost::system::error_code& ec) {
if (ec == boost::asio::error::operation_aborted)
diff --git a/src/HwmonTempMain.cpp b/src/HwmonTempMain.cpp
index 4ee020a..9ebdfcd 100644
--- a/src/HwmonTempMain.cpp
+++ b/src/HwmonTempMain.cpp
@@ -532,7 +532,7 @@
createSensors(io, objectServer, sensors, systemBus, nullptr);
});
- boost::asio::deadline_timer filterTimer(io);
+ boost::asio::steady_timer filterTimer(io);
std::function<void(sdbusplus::message_t&)> eventHandler =
[&](sdbusplus::message_t& message) {
if (message.is_method_error())
@@ -542,7 +542,7 @@
}
sensorsChanged->insert(message.get_path());
// this implicitly cancels the timer
- filterTimer.expires_from_now(boost::posix_time::seconds(1));
+ filterTimer.expires_from_now(std::chrono::seconds(1));
filterTimer.async_wait([&](const boost::system::error_code& ec) {
if (ec == boost::asio::error::operation_aborted)
diff --git a/src/HwmonTempSensor.cpp b/src/HwmonTempSensor.cpp
index 3f19ec1..ee096ea 100644
--- a/src/HwmonTempSensor.cpp
+++ b/src/HwmonTempSensor.cpp
@@ -18,7 +18,6 @@
#include <HwmonTempSensor.hpp>
#include <boost/asio/read_until.hpp>
-#include <boost/date_time/posix_time/posix_time.hpp>
#include <sdbusplus/asio/connection.hpp>
#include <sdbusplus/asio/object_server.hpp>
@@ -116,7 +115,7 @@
void HwmonTempSensor::restartRead()
{
std::weak_ptr<HwmonTempSensor> weakRef = weak_from_this();
- waitTimer.expires_from_now(boost::posix_time::milliseconds(sensorPollMs));
+ waitTimer.expires_from_now(std::chrono::milliseconds(sensorPollMs));
waitTimer.async_wait([weakRef](const boost::system::error_code& ec) {
if (ec == boost::asio::error::operation_aborted)
{
diff --git a/src/IntelCPUSensor.cpp b/src/IntelCPUSensor.cpp
index 8f04e99..3410574 100644
--- a/src/IntelCPUSensor.cpp
+++ b/src/IntelCPUSensor.cpp
@@ -20,7 +20,6 @@
#include <Utils.hpp>
#include <boost/algorithm/string/replace.hpp>
#include <boost/asio/read_until.hpp>
-#include <boost/date_time/posix_time/posix_time.hpp>
#include <sdbusplus/asio/connection.hpp>
#include <sdbusplus/asio/object_server.hpp>
@@ -113,7 +112,7 @@
void IntelCPUSensor::restartRead(void)
{
std::weak_ptr<IntelCPUSensor> weakRef = weak_from_this();
- waitTimer.expires_from_now(boost::posix_time::milliseconds(pollTime));
+ waitTimer.expires_from_now(std::chrono::milliseconds(pollTime));
waitTimer.async_wait([weakRef](const boost::system::error_code& ec) {
if (ec == boost::asio::error::operation_aborted)
{
diff --git a/src/IntelCPUSensorMain.cpp b/src/IntelCPUSensorMain.cpp
index 485729b..0d7f896 100644
--- a/src/IntelCPUSensorMain.cpp
+++ b/src/IntelCPUSensorMain.cpp
@@ -22,7 +22,6 @@
#include <boost/algorithm/string/replace.hpp>
#include <boost/container/flat_map.hpp>
#include <boost/container/flat_set.hpp>
-#include <boost/date_time/posix_time/posix_time.hpp>
#include <sdbusplus/asio/connection.hpp>
#include <sdbusplus/asio/object_server.hpp>
#include <sdbusplus/bus/match.hpp>
@@ -94,8 +93,8 @@
{IntelCPUSensor::labelTcontrol, "Tthrottle", "Tjmax"})};
void detectCpuAsync(
- boost::asio::deadline_timer& pingTimer,
- boost::asio::deadline_timer& creationTimer, boost::asio::io_service& io,
+ boost::asio::steady_timer& pingTimer,
+ boost::asio::steady_timer& creationTimer, boost::asio::io_service& io,
sdbusplus::asio::object_server& objectServer,
std::shared_ptr<sdbusplus::asio::connection>& dbusConnection,
boost::container::flat_set<CPUConfig>& cpuConfigs,
@@ -447,8 +446,8 @@
std::cout << parameters << " on bus " << busStr << " is exported\n";
}
-void detectCpu(boost::asio::deadline_timer& pingTimer,
- boost::asio::deadline_timer& creationTimer,
+void detectCpu(boost::asio::steady_timer& pingTimer,
+ boost::asio::steady_timer& creationTimer,
boost::asio::io_service& io,
sdbusplus::asio::object_server& objectServer,
std::shared_ptr<sdbusplus::asio::connection>& dbusConnection,
@@ -555,7 +554,7 @@
if (rescanDelaySeconds != 0U)
{
creationTimer.expires_from_now(
- boost::posix_time::seconds(rescanDelaySeconds));
+ std::chrono::seconds(rescanDelaySeconds));
creationTimer.async_wait([&](const boost::system::error_code& ec) {
if (ec == boost::asio::error::operation_aborted)
{
@@ -579,14 +578,14 @@
}
void detectCpuAsync(
- boost::asio::deadline_timer& pingTimer,
- boost::asio::deadline_timer& creationTimer, boost::asio::io_service& io,
+ boost::asio::steady_timer& pingTimer,
+ boost::asio::steady_timer& creationTimer, boost::asio::io_service& io,
sdbusplus::asio::object_server& objectServer,
std::shared_ptr<sdbusplus::asio::connection>& dbusConnection,
boost::container::flat_set<CPUConfig>& cpuConfigs,
ManagedObjectType& sensorConfigs)
{
- pingTimer.expires_from_now(boost::posix_time::seconds(1));
+ pingTimer.expires_from_now(std::chrono::seconds(1));
pingTimer.async_wait([&](const boost::system::error_code& ec) {
if (ec == boost::asio::error::operation_aborted)
{
@@ -710,12 +709,12 @@
boost::container::flat_set<CPUConfig> cpuConfigs;
sdbusplus::asio::object_server objectServer(systemBus);
- boost::asio::deadline_timer pingTimer(io);
- boost::asio::deadline_timer creationTimer(io);
- boost::asio::deadline_timer filterTimer(io);
+ boost::asio::steady_timer pingTimer(io);
+ boost::asio::steady_timer creationTimer(io);
+ boost::asio::steady_timer filterTimer(io);
ManagedObjectType sensorConfigs;
- filterTimer.expires_from_now(boost::posix_time::seconds(1));
+ filterTimer.expires_from_now(std::chrono::seconds(1));
filterTimer.async_wait([&](const boost::system::error_code& ec) {
if (ec == boost::asio::error::operation_aborted)
{
@@ -743,7 +742,7 @@
}
// this implicitly cancels the timer
- filterTimer.expires_from_now(boost::posix_time::seconds(1));
+ filterTimer.expires_from_now(std::chrono::seconds(1));
filterTimer.async_wait([&](const boost::system::error_code& ec) {
if (ec == boost::asio::error::operation_aborted)
{
diff --git a/src/IpmbSensor.cpp b/src/IpmbSensor.cpp
index 7c5f965..5dabc25 100644
--- a/src/IpmbSensor.cpp
+++ b/src/IpmbSensor.cpp
@@ -52,7 +52,7 @@
boost::container::flat_map<std::string, std::unique_ptr<IpmbSensor>> sensors;
-std::unique_ptr<boost::asio::deadline_timer> initCmdTimer;
+std::unique_ptr<boost::asio::steady_timer> initCmdTimer;
IpmbSensor::IpmbSensor(std::shared_ptr<sdbusplus::asio::connection>& conn,
boost::asio::io_service& io,
@@ -335,7 +335,7 @@
void IpmbSensor::read(void)
{
- waitTimer.expires_from_now(boost::posix_time::milliseconds(sensorPollMs));
+ waitTimer.expires_from_now(std::chrono::milliseconds(sensorPollMs));
waitTimer.async_wait([this](const boost::system::error_code& ec) {
if (ec == boost::asio::error::operation_aborted)
{
@@ -586,7 +586,7 @@
// we seem to send this command too fast sometimes, wait before
// sending
initCmdTimer->expires_from_now(
- boost::posix_time::seconds(reinitWaitSeconds));
+ std::chrono::seconds(reinitWaitSeconds));
initCmdTimer->async_wait([](const boost::system::error_code ec) {
if (ec == boost::asio::error::operation_aborted)
@@ -614,15 +614,15 @@
systemBus->request_name("xyz.openbmc_project.IpmbSensor");
sdbusplus::asio::object_server objectServer(systemBus);
- initCmdTimer = std::make_unique<boost::asio::deadline_timer>(io);
+ initCmdTimer = std::make_unique<boost::asio::steady_timer>(io);
io.post([&]() { createSensors(io, objectServer, sensors, systemBus); });
- boost::asio::deadline_timer configTimer(io);
+ boost::asio::steady_timer configTimer(io);
std::function<void(sdbusplus::message_t&)> eventHandler =
[&](sdbusplus::message_t&) {
- configTimer.expires_from_now(boost::posix_time::seconds(1));
+ configTimer.expires_from_now(std::chrono::seconds(1));
// create a timer because normally multiple properties change
configTimer.async_wait([&](const boost::system::error_code& ec) {
if (ec == boost::asio::error::operation_aborted)
diff --git a/src/MCUTempSensor.cpp b/src/MCUTempSensor.cpp
index 47893d2..ba68bed 100644
--- a/src/MCUTempSensor.cpp
+++ b/src/MCUTempSensor.cpp
@@ -151,7 +151,7 @@
{
static constexpr size_t pollTime = 1; // in seconds
- waitTimer.expires_from_now(boost::posix_time::seconds(pollTime));
+ waitTimer.expires_from_now(std::chrono::seconds(pollTime));
waitTimer.async_wait([this](const boost::system::error_code& ec) {
if (ec == boost::asio::error::operation_aborted)
{
@@ -263,11 +263,11 @@
io.post([&]() { createSensors(io, objectServer, sensors, systemBus); });
- boost::asio::deadline_timer configTimer(io);
+ boost::asio::steady_timer configTimer(io);
std::function<void(sdbusplus::message_t&)> eventHandler =
[&](sdbusplus::message_t&) {
- configTimer.expires_from_now(boost::posix_time::seconds(1));
+ configTimer.expires_from_now(std::chrono::seconds(1));
// create a timer because normally multiple properties change
configTimer.async_wait([&](const boost::system::error_code& ec) {
if (ec == boost::asio::error::operation_aborted)
diff --git a/src/NVMeBasicContext.cpp b/src/NVMeBasicContext.cpp
index 465f177..b4599c7 100644
--- a/src/NVMeBasicContext.cpp
+++ b/src/NVMeBasicContext.cpp
@@ -352,7 +352,7 @@
{
pollCursor = sensors.begin();
- scanTimer.expires_from_now(boost::posix_time::seconds(1));
+ scanTimer.expires_from_now(std::chrono::seconds(1));
scanTimer.async_wait([weakSelf{weak_from_this()}](
const boost::system::error_code errorCode) {
if (errorCode == boost::asio::error::operation_aborted)
diff --git a/src/NVMeSensorMain.cpp b/src/NVMeSensorMain.cpp
index 1398d3c..463ada3 100644
--- a/src/NVMeSensorMain.cpp
+++ b/src/NVMeSensorMain.cpp
@@ -17,7 +17,7 @@
#include <NVMeBasicContext.hpp>
#include <NVMeContext.hpp>
#include <NVMeSensor.hpp>
-#include <boost/asio/deadline_timer.hpp>
+#include <boost/asio/steady_timer.hpp>
#include <optional>
#include <regex>
@@ -235,11 +235,11 @@
io.post([&]() { createSensors(io, objectServer, systemBus); });
- boost::asio::deadline_timer filterTimer(io);
+ boost::asio::steady_timer filterTimer(io);
std::function<void(sdbusplus::message_t&)> eventHandler =
[&filterTimer, &io, &objectServer, &systemBus](sdbusplus::message_t&) {
// this implicitly cancels the timer
- filterTimer.expires_from_now(boost::posix_time::seconds(1));
+ filterTimer.expires_from_now(std::chrono::seconds(1));
filterTimer.async_wait([&](const boost::system::error_code& ec) {
if (ec == boost::asio::error::operation_aborted)
diff --git a/src/PSUEvent.cpp b/src/PSUEvent.cpp
index 8c83d06..27bb8b1 100644
--- a/src/PSUEvent.cpp
+++ b/src/PSUEvent.cpp
@@ -218,7 +218,7 @@
void PSUSubEvent::restartRead()
{
std::weak_ptr<PSUSubEvent> weakRef = weak_from_this();
- waitTimer.expires_from_now(boost::posix_time::milliseconds(eventPollMs));
+ waitTimer.expires_from_now(std::chrono::milliseconds(eventPollMs));
waitTimer.async_wait([weakRef](const boost::system::error_code& ec) {
if (ec == boost::asio::error::operation_aborted)
{
diff --git a/src/PSUSensor.cpp b/src/PSUSensor.cpp
index c5ed373..6e2934f 100644
--- a/src/PSUSensor.cpp
+++ b/src/PSUSensor.cpp
@@ -19,7 +19,6 @@
#include <PSUSensor.hpp>
#include <boost/asio/random_access_file.hpp>
#include <boost/asio/read_until.hpp>
-#include <boost/date_time/posix_time/posix_time.hpp>
#include <sdbusplus/asio/connection.hpp>
#include <sdbusplus/asio/object_server.hpp>
@@ -146,7 +145,7 @@
void PSUSensor::restartRead(void)
{
std::weak_ptr<PSUSensor> weakRef = weak_from_this();
- waitTimer.expires_from_now(boost::posix_time::milliseconds(sensorPollMs));
+ waitTimer.expires_from_now(std::chrono::milliseconds(sensorPollMs));
waitTimer.async_wait([weakRef](const boost::system::error_code& ec) {
if (ec == boost::asio::error::operation_aborted)
{
diff --git a/src/PSUSensorMain.cpp b/src/PSUSensorMain.cpp
index 0a197b8..918b9c6 100644
--- a/src/PSUSensorMain.cpp
+++ b/src/PSUSensorMain.cpp
@@ -1050,7 +1050,7 @@
propertyInitialize();
io.post([&]() { createSensors(io, objectServer, systemBus, nullptr); });
- boost::asio::deadline_timer filterTimer(io);
+ boost::asio::steady_timer filterTimer(io);
std::function<void(sdbusplus::message_t&)> eventHandler =
[&](sdbusplus::message_t& message) {
if (message.is_method_error())
@@ -1059,7 +1059,7 @@
return;
}
sensorsChanged->insert(message.get_path());
- filterTimer.expires_from_now(boost::posix_time::seconds(3));
+ filterTimer.expires_from_now(std::chrono::seconds(3));
filterTimer.async_wait([&](const boost::system::error_code& ec) {
if (ec == boost::asio::error::operation_aborted)
{
diff --git a/src/TachSensor.cpp b/src/TachSensor.cpp
index dacbec6..35185cd 100644
--- a/src/TachSensor.cpp
+++ b/src/TachSensor.cpp
@@ -19,7 +19,6 @@
#include <TachSensor.hpp>
#include <Utils.hpp>
#include <boost/asio/read_until.hpp>
-#include <boost/date_time/posix_time/posix_time.hpp>
#include <gpiod.hpp>
#include <sdbusplus/asio/connection.hpp>
#include <sdbusplus/asio/object_server.hpp>
@@ -125,7 +124,7 @@
void TachSensor::restartRead(size_t pollTime)
{
std::weak_ptr<TachSensor> weakRef = weak_from_this();
- waitTimer.expires_from_now(boost::posix_time::milliseconds(pollTime));
+ waitTimer.expires_from_now(std::chrono::milliseconds(pollTime));
waitTimer.async_wait([weakRef](const boost::system::error_code& ec) {
if (ec == boost::asio::error::operation_aborted)
{
diff --git a/src/Thresholds.cpp b/src/Thresholds.cpp
index 610e68e..ee0456d 100644
--- a/src/Thresholds.cpp
+++ b/src/Thresholds.cpp
@@ -339,14 +339,14 @@
}
if (pair == nullptr)
{
- pair = &timers.emplace_back(timerUsed, boost::asio::deadline_timer(io));
+ pair = &timers.emplace_back(timerUsed, boost::asio::steady_timer(io));
}
pair->first.used = true;
pair->first.level = threshold.level;
pair->first.direction = threshold.direction;
pair->first.assert = assert;
- pair->second.expires_from_now(boost::posix_time::seconds(waitTime));
+ pair->second.expires_from_now(std::chrono::seconds(waitTime));
pair->second.async_wait([weakSensor, pair, threshold, assert,
assertValue](boost::system::error_code ec) {
auto sensorPtr = weakSensor.lock();