From 1cfc2f11b13412a15f8478cebc35e50e6feb13a2 Mon Sep 17 00:00:00 2001 From: "William A. Kennington III" Date: Fri, 19 Oct 2018 17:29:46 -0700 Subject: Switch sd_event loops to sdeventplus This change is mostly focused around plumbing the sdeventplus::Event object everywhere and using the member functions provided for the event. No migration to the timer utility is performed yet. Change-Id: I912ab82bc081239d3b7c3cf7c5caca6742ef9c87 Signed-off-by: William A. Kennington III --- Makefile.am | 6 +++-- configure.ac | 2 ++ control/Makefile.am | 2 ++ control/actions.cpp | 2 +- control/main.cpp | 29 +++++------------------ control/manager.cpp | 4 ++-- control/manager.hpp | 5 ++-- control/zone.cpp | 10 ++++---- control/zone.hpp | 17 +++++++------- event.hpp | 13 ----------- monitor/Makefile.am | 2 ++ monitor/fan.cpp | 4 ++-- monitor/fan.hpp | 6 ++--- monitor/main.cpp | 30 ++++-------------------- monitor/tach_sensor.cpp | 4 ++-- monitor/tach_sensor.hpp | 6 ++--- presence/Makefile.am | 2 ++ presence/gpio.cpp | 18 +++++++------- presence/gpio.hpp | 11 ++++----- presence/tach_detect.cpp | 14 ++++------- test/Makefile.am | 2 +- test/timertest.cpp | 61 +++++++++++++++++------------------------------- timer.cpp | 5 ++-- timer.hpp | 10 +++----- 24 files changed, 99 insertions(+), 166 deletions(-) diff --git a/Makefile.am b/Makefile.am index 67f49e9..a20fe8a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -5,11 +5,13 @@ libfan_la_LDFLAGS = -static libfan_la_LIBADD = \ $(PHOSPHOR_DBUS_INTERFACES_LIBS) \ $(PHOSPHOR_LOGGING_LIBS) \ - $(SDBUSPLUS_LIBS) + $(SDBUSPLUS_LIBS) \ + $(SDEVENTPLUS_LIBS) libfan_la_CXXFLAGS = \ $(PHOSPHOR_DBUS_INTERFACES_CFLAGS) \ $(PHOSPHOR_LOGGING_CFLAGS) \ - $(SDBUSPLUS_CFLAGS) -flto + $(SDBUSPLUS_CFLAGS) \ + $(SDEVENTPLUS_CFLAGS) -flto libfan_la_SOURCES = \ utility.cpp \ timer.cpp diff --git a/configure.ac b/configure.ac index 544b763..b60d032 100644 --- a/configure.ac +++ b/configure.ac @@ -28,6 +28,8 @@ AX_APPEND_COMPILE_FLAGS([-Wall -Werror], [CXXFLAGS]) # Checks for libraries. PKG_CHECK_MODULES([SDBUSPLUS], [sdbusplus], , [AC_MSG_ERROR([The openbmc/sdbusplus package is required])]) +PKG_CHECK_MODULES([SDEVENTPLUS], [sdeventplus], , +[AC_MSG_ERROR([The openbmc/sdeventplus package is required])]) PKG_CHECK_MODULES([PHOSPHOR_LOGGING], [phosphor-logging], , [AC_MSG_ERROR([The openbmc/phosphor-logging package is required])]) PKG_CHECK_MODULES([SYSTEMD], [libsystemd >= 221], , diff --git a/control/Makefile.am b/control/Makefile.am index 01ee9c9..e0b0865 100644 --- a/control/Makefile.am +++ b/control/Makefile.am @@ -18,11 +18,13 @@ nodist_phosphor_fan_control_SOURCES = \ phosphor_fan_control_LDADD = \ $(top_builddir)/libfan.la \ $(SDBUSPLUS_LIBS) \ + $(SDEVENTPLUS_LIBS) \ $(PHOSPHOR_LOGGING_LIBS) \ ${PHOSPHOR_DBUS_INTERFACES_LIBS} phosphor_fan_control_CXXFLAGS = \ $(SDBUSPLUS_CFLAGS) \ + $(SDEVENTPLUS_CFLAGS) \ $(PHOSPHOR_LOGGING_CFLAGS) \ ${PHOSPHOR_DBUS_INTERFACES_CFLAGS} \ -flto diff --git a/control/actions.cpp b/control/actions.cpp index b162602..71f7f72 100644 --- a/control/actions.cpp +++ b/control/actions.cpp @@ -43,7 +43,7 @@ Action call_actions_based_on_timer(Timer&& tConf, std::vector&& actions) // Create/start timer and associate event data with it std::unique_ptr timer = std::make_unique( - zone.getEventPtr(), + zone.getEventLoop(), [&zone, actions = &actions, group = &group]() diff --git a/control/main.cpp b/control/main.cpp index 8c13cf9..4420488 100644 --- a/control/main.cpp +++ b/control/main.cpp @@ -14,10 +14,10 @@ * limitations under the License. */ #include +#include #include #include "argument.hpp" #include "manager.hpp" -#include "event.hpp" #include "sdbusplus.hpp" using namespace phosphor::fan::control; @@ -25,8 +25,8 @@ using namespace phosphor::logging; int main(int argc, char* argv[]) { + auto event = sdeventplus::Event::get_default(); auto bus = sdbusplus::bus::new_default(); - sd_event* events = nullptr; phosphor::fan::util::ArgumentParser args(argc, argv); if (argc != 2) @@ -51,23 +51,13 @@ int main(int argc, char* argv[]) return 1; } - auto r = sd_event_default(&events); - if (r < 0) - { - log("Failed call to sd_event_default()", - entry("ERROR=%s", strerror(-r))); - return 1; - } - - phosphor::fan::event::EventPtr eventPtr{events}; - //Attach the event object to the bus object so we can //handle both sd_events (for the timers) and dbus signals. - bus.attach_event(eventPtr.get(), SD_EVENT_PRIORITY_NORMAL); + bus.attach_event(event.get(), SD_EVENT_PRIORITY_NORMAL); try { - Manager manager(bus, eventPtr, mode); + Manager manager(bus, event, mode); //Init mode will just set fans to max and delay if (mode == Mode::init) @@ -75,15 +65,8 @@ int main(int argc, char* argv[]) manager.doInit(); return 0; } - else - { - r = sd_event_loop(eventPtr.get()); - if (r < 0) - { - log("Failed call to sd_event_loop", - entry("ERROR=%s", strerror(-r))); - } - } + + return event.loop(); } //Log the useful metadata on these exceptions and let the app //return 1 so it is restarted without a core dump. diff --git a/control/manager.cpp b/control/manager.cpp index 1078473..bc6b18e 100644 --- a/control/manager.cpp +++ b/control/manager.cpp @@ -75,7 +75,7 @@ bool checkCondition(sdbusplus::bus::bus& bus, const auto& c) //Note: Future code will check 'mode' before starting control algorithm Manager::Manager(sdbusplus::bus::bus& bus, - phosphor::fan::event::EventPtr& events, + const sdeventplus::Event& event, Mode mode) : _bus(bus) { @@ -99,7 +99,7 @@ Manager::Manager(sdbusplus::bus::bus& bus, for (auto& z : zones) { _zones.emplace(std::get(z), - std::make_unique(mode, _bus, events, z)); + std::make_unique(mode, _bus, event, z)); } break; diff --git a/control/manager.hpp b/control/manager.hpp index d049323..5b748a2 100644 --- a/control/manager.hpp +++ b/control/manager.hpp @@ -3,6 +3,7 @@ #include #include #include +#include #include "types.hpp" #include "zone.hpp" @@ -36,11 +37,11 @@ class Manager * _zoneLayouts data. * * @param[in] bus - The dbus object - * @param[in] events - The sd_event pointer + * @param[in] event - The event loop * @param[in] mode - The control mode */ Manager(sdbusplus::bus::bus& bus, - phosphor::fan::event::EventPtr& events, + const sdeventplus::Event& event, Mode mode); /** diff --git a/control/zone.cpp b/control/zone.cpp index f4c50d9..0050899 100644 --- a/control/zone.cpp +++ b/control/zone.cpp @@ -37,7 +37,7 @@ using InternalFailure = sdbusplus::xyz::openbmc_project::Common:: Zone::Zone(Mode mode, sdbusplus::bus::bus& bus, - phosphor::fan::event::EventPtr& events, + const sdeventplus::Event& event, const ZoneDefinition& def) : _bus(bus), _fullSpeed(std::get(def)), @@ -46,9 +46,9 @@ Zone::Zone(Mode mode, _defCeilingSpeed(std::get(def)), _incDelay(std::get(def)), _decInterval(std::get(def)), - _incTimer(events, [this](){ this->incTimerExpired(); }), - _decTimer(events, [this](){ this->decTimerExpired(); }), - _sdEvents(events) + _incTimer(event, [this](){ this->incTimerExpired(); }), + _decTimer(event, [this](){ this->decTimerExpired(); }), + _eventLoop(event) { auto& fanDefs = std::get(def); @@ -347,7 +347,7 @@ void Zone::initEvent(const SetSpeedEvent& event) ); std::unique_ptr timer = std::make_unique( - _sdEvents, + _eventLoop, [this, action = &(std::get(event)), group = &(std::get(event))]() diff --git a/control/zone.hpp b/control/zone.hpp index cd7e5d6..e035a64 100644 --- a/control/zone.hpp +++ b/control/zone.hpp @@ -4,6 +4,7 @@ #include #include #include +#include #include "fan.hpp" #include "types.hpp" #include "timer.hpp" @@ -48,12 +49,12 @@ class Zone * * @param[in] mode - mode of fan control * @param[in] bus - the dbus object - * @param[in] events - sd_event pointer + * @param[in] event - Event loop reference * @param[in] def - the fan zone definition data */ Zone(Mode mode, sdbusplus::bus::bus& bus, - phosphor::fan::event::EventPtr& events, + const sdeventplus::Event& event, const ZoneDefinition& def); /** @@ -332,13 +333,13 @@ class Zone void decTimerExpired(); /** - * @brief Get the event pointer used with this zone's timers + * @brief Get the event loop used with this zone's timers * - * @return - The Dbus event pointer for timers + * @return - The event loop for timers */ - inline auto& getEventPtr() + inline auto& getEventLoop() { - return _sdEvents; + return _eventLoop; } /** @@ -514,9 +515,9 @@ class Zone phosphor::fan::util::Timer _decTimer; /** - * Dbus event used on set speed event timers + * Event loop used on set speed event timers */ - phosphor::fan::event::EventPtr& _sdEvents; + sdeventplus::Event _eventLoop; /** * The vector of fans in this zone diff --git a/event.hpp b/event.hpp index 71ca6a6..a937d6d 100644 --- a/event.hpp +++ b/event.hpp @@ -23,19 +23,6 @@ struct EventSourceDeleter using EventSourcePtr = std::unique_ptr; -/** - * Customer deleter for sd_event - */ -struct EventDeleter -{ - void operator()(sd_event* event) const - { - sd_event_unref(event); - } -}; - -using EventPtr = std::unique_ptr; - } } } diff --git a/monitor/Makefile.am b/monitor/Makefile.am index cb9b8a4..e8d9bbd 100644 --- a/monitor/Makefile.am +++ b/monitor/Makefile.am @@ -19,12 +19,14 @@ BUILT_SOURCES = fan_monitor_defs.cpp phosphor_fan_monitor_LDADD = \ $(top_builddir)/libfan.la \ $(SDBUSPLUS_LIBS) \ + $(SDEVENTPLUS_LIBS) \ $(PHOSPHOR_LOGGING_LIBS) \ ${PHOSPHOR_DBUS_INTERFACES_LIBS} \ -lstdc++fs phosphor_fan_monitor_CXXFLAGS = \ $(SDBUSPLUS_CFLAGS) \ + $(SDEVENTPLUS_CFLAGS) \ $(PHOSPHOR_LOGGING_CFLAGS) \ ${PHOSPHOR_DBUS_INTERFACES_CFLAGS} \ -flto diff --git a/monitor/fan.cpp b/monitor/fan.cpp index 39b32bb..014080d 100644 --- a/monitor/fan.cpp +++ b/monitor/fan.cpp @@ -31,7 +31,7 @@ using namespace phosphor::logging; Fan::Fan(Mode mode, sdbusplus::bus::bus& bus, - phosphor::fan::event::EventPtr& events, + const sdeventplus::Event& event, std::unique_ptr& trust, const FanDefinition& def) : _bus(bus), @@ -58,7 +58,7 @@ Fan::Fan(Mode mode, std::get(s), std::get(s), std::get(def), - events)); + event)); _trustManager->registerSensor(_sensors.back()); } diff --git a/monitor/fan.hpp b/monitor/fan.hpp index fb87b66..663e27e 100644 --- a/monitor/fan.hpp +++ b/monitor/fan.hpp @@ -1,9 +1,9 @@ #pragma once #include +#include #include #include -#include "event.hpp" #include "tach_sensor.hpp" #include "trust_manager.hpp" #include "types.hpp" @@ -78,13 +78,13 @@ class Fan * * @param mode - mode of fan monitor * @param bus - the dbus object - * @param events - pointer to sd_event object + * @param event - event loop reference * @param trust - the tach trust manager * @param def - the fan definition structure */ Fan(Mode mode, sdbusplus::bus::bus& bus, - phosphor::fan::event::EventPtr& events, + const sdeventplus::Event& event, std::unique_ptr& trust, const FanDefinition& def); diff --git a/monitor/main.cpp b/monitor/main.cpp index 512e3f7..cba3832 100644 --- a/monitor/main.cpp +++ b/monitor/main.cpp @@ -15,9 +15,8 @@ */ #include #include -#include +#include #include "argument.hpp" -#include "event.hpp" #include "fan.hpp" #include "fan_defs.hpp" #include "trust_manager.hpp" @@ -27,8 +26,8 @@ using namespace phosphor::logging; int main(int argc, char* argv[]) { + auto event = sdeventplus::Event::get_default(); auto bus = sdbusplus::bus::new_default(); - sd_event* events = nullptr; std::vector> fans; phosphor::fan::util::ArgumentParser args(argc, argv); @@ -53,22 +52,12 @@ int main(int argc, char* argv[]) return 1; } - auto r = sd_event_default(&events); - if (r < 0) - { - log("Failed call to sd_event_default()", - entry("ERROR=%s", strerror(-r))); - return 1; - } - std::unique_ptr trust = std::make_unique(trustGroups); - phosphor::fan::event::EventPtr eventPtr{events}; - //Attach the event object to the bus object so we can //handle both sd_events (for the timers) and dbus signals. - bus.attach_event(eventPtr.get(), SD_EVENT_PRIORITY_NORMAL); + bus.attach_event(event.get(), SD_EVENT_PRIORITY_NORMAL); for (const auto& fanDef : fanDefinitions) { @@ -83,7 +72,7 @@ int main(int argc, char* argv[]) } } fans.emplace_back(std::make_unique( - mode, bus, eventPtr, trust, fanDef)); + mode, bus, event, trust, fanDef)); } if (mode == Mode::init) @@ -91,15 +80,6 @@ int main(int argc, char* argv[]) // Fans were initialized to be functional, exit return 0; } - else - { - r = sd_event_loop(eventPtr.get()); - if (r < 0) - { - log("Failed call to sd_event_loop", - entry("ERROR=%s", strerror(-r))); - } - } - return 1; + return event.loop(); } diff --git a/monitor/tach_sensor.cpp b/monitor/tach_sensor.cpp index 6789ed8..de1affb 100644 --- a/monitor/tach_sensor.cpp +++ b/monitor/tach_sensor.cpp @@ -76,7 +76,7 @@ TachSensor::TachSensor(Mode mode, size_t factor, size_t offset, size_t timeout, - phosphor::fan::event::EventPtr& events) : + const sdeventplus::Event& event) : _bus(bus), _fan(fan), _name(FAN_SENSOR_PATH + id), @@ -88,7 +88,7 @@ TachSensor::TachSensor(Mode mode, _offset(offset), _timeout(timeout), _timerMode(TimerMode::func), - _timer(events, [this, &fan](){ fan.timerExpired(*this); }) + _timer(event, [this, &fan](){ fan.timerExpired(*this); }) { // Start from a known state of functional setFunctional(true); diff --git a/monitor/tach_sensor.hpp b/monitor/tach_sensor.hpp index f59f6f5..c46aa00 100644 --- a/monitor/tach_sensor.hpp +++ b/monitor/tach_sensor.hpp @@ -3,7 +3,7 @@ #include #include #include -#include "event.hpp" +#include #include "timer.hpp" namespace phosphor @@ -78,7 +78,7 @@ class TachSensor * @param[in] factor - the factor of the sensor target * @param[in] offset - the offset of the sensor target * @param[in] timeout - Normal timeout value to use - * @param[in] events - sd_event pointer + * @param[in] event - Event loop reference */ TachSensor(Mode mode, sdbusplus::bus::bus& bus, @@ -90,7 +90,7 @@ class TachSensor size_t factor, size_t offset, size_t timeout, - phosphor::fan::event::EventPtr& events); + const sdeventplus::Event& event); /** * @brief Returns the target speed value diff --git a/presence/Makefile.am b/presence/Makefile.am index eb4dd6c..8fa0259 100644 --- a/presence/Makefile.am +++ b/presence/Makefile.am @@ -16,11 +16,13 @@ phosphor_fan_presence_tach_SOURCES = \ phosphor_fan_presence_tach_LDADD = \ $(top_builddir)/libfan.la \ $(SDBUSPLUS_LIBS) \ + $(SDEVENTPLUS_LIBS) \ $(PHOSPHOR_LOGGING_LIBS) \ ${PHOSPHOR_DBUS_INTERFACES_LIBS} \ $(LIBEVDEV_LIBS) phosphor_fan_presence_tach_CXXFLAGS = \ $(SDBUSPLUS_CFLAGS) \ + $(SDEVENTPLUS_CFLAGS) \ $(PHOSPHOR_LOGGING_CFLAGS) \ ${PHOSPHOR_DBUS_INTERFACES_CFLAGS} \ $(LIBEVDEV_CFLAGS) \ diff --git a/presence/gpio.cpp b/presence/gpio.cpp index 2a0a4c0..19593c2 100644 --- a/presence/gpio.cpp +++ b/presence/gpio.cpp @@ -13,14 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include +#include #include #include +#include #include #include #include "gpio.hpp" #include "rpolicy.hpp" -#include "sdevent.hpp" namespace phosphor { @@ -37,25 +37,23 @@ Gpio::Gpio( evdevfd(open(device.c_str(), O_RDONLY | O_NONBLOCK)), evdev(evdevpp::evdev::newFromFD(evdevfd())), phys(physDevice), - pin(physPin), - callback(nullptr) + pin(physPin) { } bool Gpio::start() { - callback = std::make_unique( - util::SDEvent::getEvent(), - evdevfd(), - [this](auto& s){this->ioCallback(s);}); + source.emplace(sdeventplus::Event::get_default(), + evdevfd(), EPOLLIN, + std::bind(&Gpio::ioCallback, this)); currentState = present(); return currentState; } void Gpio::stop() { - callback = nullptr; + source.reset(); } bool Gpio::present() @@ -75,7 +73,7 @@ void Gpio::fail() GPIO::CALLOUT_DEVICE_PATH(phys.c_str())); } -void Gpio::ioCallback(sdevent::source::Source& source) +void Gpio::ioCallback() { unsigned int type, code, value; diff --git a/presence/gpio.hpp b/presence/gpio.hpp index 978fdd9..2829bea 100644 --- a/presence/gpio.hpp +++ b/presence/gpio.hpp @@ -1,9 +1,8 @@ #pragma once -#include +#include +#include #include "evdevpp/evdev.hpp" -#include "sdevent/io.hpp" -#include "sdevent/source.hpp" #include "psensor.hpp" #include "utility.hpp" @@ -85,7 +84,7 @@ class Gpio : public PresenceSensor virtual RedundancyPolicy& getPolicy() = 0; /** @brief sdevent io callback. */ - void ioCallback(sdevent::source::Source& source); + void ioCallback(); /** The current state of the sensor. */ bool currentState; @@ -102,8 +101,8 @@ class Gpio : public PresenceSensor /** Gpio pin number. */ unsigned int pin; - /** sdevent io callback handle. */ - std::unique_ptr callback; + /** sdevent io handle. */ + std::optional source; }; } // namespace presence diff --git a/presence/tach_detect.cpp b/presence/tach_detect.cpp index da0f40f..9b23571 100644 --- a/presence/tach_detect.cpp +++ b/presence/tach_detect.cpp @@ -15,24 +15,20 @@ */ #include "generated.hpp" #include "sdbusplus.hpp" -#include "sdevent.hpp" - +#include int main(void) { using namespace phosphor::fan; - auto& event = util::SDEvent::getEvent(); - event.attach(util::SDBusPlus::getBus()); + auto event = sdeventplus::Event::get_default(); + util::SDBusPlus::getBus().attach_event( + event.get(), SD_EVENT_PRIORITY_NORMAL); for (auto& p: presence::ConfigPolicy::get()) { p->monitor(); } - event.loop(); - - // The loop should never exit. Exit with - // non zero status just in case. - return 1; + return event.loop(); } diff --git a/test/Makefile.am b/test/Makefile.am index 13ff55e..c4cd77d 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -8,6 +8,6 @@ check_PROGRAMS = timertest timertest_CPPFLAGS = -Igtest $(GTEST_CPPFLAGS) $(AM_CPPFLAGS) timertest_CXXFLAGS = $(PTHREAD_CFLAGS) ${PHOSPHOR_DBUS_INTERFACES_CFLAGS} timertest_LDFLAGS = -lgtest_main -lgtest $(PTHREAD_LIBS) $(OESDK_TESTCASE_FLAGS) \ - $(SYSTEMD_LIBS) ${SDBUSPLUS_LIBS} ${PHOSPHOR_DBUS_INTERFACES_LIBS} + $(SYSTEMD_LIBS) ${SDBUSPLUS_LIBS} $(SDEVENTPLUS_LIBS) ${PHOSPHOR_DBUS_INTERFACES_LIBS} timertest_SOURCES = timertest.cpp timertest_LDADD = $(top_builddir)/timer.o diff --git a/test/timertest.cpp b/test/timertest.cpp index 9d05e55..845a0e1 100644 --- a/test/timertest.cpp +++ b/test/timertest.cpp @@ -16,7 +16,7 @@ #include #include #include -#include "event.hpp" +#include #include "timer.hpp" /** @@ -34,21 +34,12 @@ using namespace std::chrono; class TimerTest : public ::testing::Test { public: - // systemd event handler - phosphor::fan::event::EventPtr events; - - // Need this so that events can be initialized. - int rc; + // event loop + sdeventplus::Event event; // Gets called as part of each TEST_F construction - TimerTest() - { - sd_event* event = nullptr; - auto rc = sd_event_default(&event); - EXPECT_GE(rc, 0); - - events.reset(event); - } + TimerTest() : event(sdeventplus::Event::get_default()) + { } }; /** @@ -91,8 +82,8 @@ class CallbackTester class CallbackTesterWithTimer : public CallbackTester { public: - CallbackTesterWithTimer(phosphor::fan::event::EventPtr& events) : - _timer(events, + CallbackTesterWithTimer(const sdeventplus::Event& event) : + _timer(event, std::bind(&CallbackTesterWithTimer::callbackFunction, this)) { @@ -135,7 +126,7 @@ TEST_F(TimerTest, timerExpiresAfter2seconds) { CallbackTester tester; - Timer timer(events, + Timer timer(event, std::bind(&CallbackTester::callbackFunction, &tester)); @@ -148,13 +139,12 @@ TEST_F(TimerTest, timerExpiresAfter2seconds) EXPECT_EQ(true, timer.running()); int count = 0; - auto sleepTime = duration_cast(seconds(1)); //Wait for 2 1s timeouts while (count < 2) { // Returns 0 on timeout and positive number on dispatch - if (sd_event_run(events.get(), sleepTime.count()) == 0) + if (event.run(seconds(1)) == 0) { count++; } @@ -172,7 +162,7 @@ TEST_F(TimerTest, timerRestart) { CallbackTester tester; - Timer timer(events, + Timer timer(event, std::bind(&CallbackTester::callbackFunction, &tester)); @@ -180,8 +170,7 @@ TEST_F(TimerTest, timerRestart) timer.start(time, Timer::TimerType::oneshot); //wait for a second - auto sleepTime = duration_cast(seconds(1)); - auto rc = sd_event_run(events.get(), sleepTime.count()); + auto rc = event.run(seconds(1)); //expect the timeout, not the dispatch //and the timer should still be running @@ -192,7 +181,7 @@ TEST_F(TimerTest, timerRestart) timer.start(time, Timer::TimerType::oneshot); //Wait just 1s, make sure not done - rc = sd_event_run(events.get(), sleepTime.count()); + rc = event.run(seconds(1)); EXPECT_EQ(0, rc); EXPECT_EQ(true, timer.running()); EXPECT_EQ(false, tester.gotCallback()); @@ -202,7 +191,7 @@ TEST_F(TimerTest, timerRestart) while (count < 1) { // Returns 0 on timeout and positive number on dispatch - if (sd_event_run(events.get(), sleepTime.count()) == 0) + if (event.run(seconds(1)) == 0) { count++; } @@ -221,17 +210,15 @@ TEST_F(TimerTest, timerStop) { CallbackTester tester; - Timer timer(events, + Timer timer(event, std::bind(&CallbackTester::callbackFunction, &tester)); auto time = duration_cast(seconds(2)); timer.start(time, Timer::TimerType::oneshot); - auto sleepTime = duration_cast(seconds(1)); - //wait 1s - auto rc = sd_event_run(events.get(), sleepTime.count()); + auto rc = event.run(seconds(1)); //expect the timeout, not the dispatch EXPECT_EQ(rc, 0); @@ -243,8 +230,7 @@ TEST_F(TimerTest, timerStop) EXPECT_EQ(false, tester.gotCallback()); //Wait another 2s, make sure no callbacks happened - sleepTime = duration_cast(seconds(2)); - rc = sd_event_run(events.get(), sleepTime.count()); + rc = event.run(seconds(2)); EXPECT_EQ(rc, 0); EXPECT_EQ(false, timer.running()); @@ -258,7 +244,7 @@ TEST_F(TimerTest, timerStop) */ TEST_F(TimerTest, timerRestartFromCallback) { - CallbackTesterWithTimer tester(events); + CallbackTesterWithTimer tester(event); auto& timer = tester.getTimer(); @@ -269,11 +255,10 @@ TEST_F(TimerTest, timerRestartFromCallback) //for another 1s int count = 0; - auto sleepTime = duration_cast(seconds(1)); while (count < 3) { // Returns 0 on timeout and positive number on dispatch - if (sd_event_run(events.get(), sleepTime.count()) == 0) + if (event.run(seconds(1)) == 0) { count++; } @@ -293,7 +278,7 @@ TEST_F(TimerTest, timerNoEventRun) { CallbackTester tester; - Timer timer(events, + Timer timer(event, std::bind(&CallbackTester::callbackFunction, &tester)); @@ -310,8 +295,7 @@ TEST_F(TimerTest, timerNoEventRun) EXPECT_EQ(false, tester.gotCallback()); //Now process an event - auto sleepTime = duration_cast(milliseconds(5)); - auto rc = sd_event_run(events.get(), sleepTime.count()); + auto rc = event.run(milliseconds(5)); EXPECT_GT(rc, 0); EXPECT_EQ(false, timer.running()); @@ -327,18 +311,17 @@ TEST_F(TimerTest, RepeatingTimer) { CallbackTester tester; - Timer timer(events, + Timer timer(event, std::bind(&CallbackTester::callbackFunction, &tester)); auto time = duration_cast(seconds(1)); timer.start(time, Timer::TimerType::repeating); int count = 0; - auto sleepTime = duration_cast(milliseconds(500)); while (count < 5) { - if (sd_event_run(events.get(), sleepTime.count()) == 0) + if (event.run(milliseconds(500)) == 0) { count++; } diff --git a/timer.cpp b/timer.cpp index 6929717..36057ab 100644 --- a/timer.cpp +++ b/timer.cpp @@ -32,16 +32,15 @@ using namespace phosphor::logging; using InternalFailure = sdbusplus::xyz::openbmc_project::Common:: Error::InternalFailure; -Timer::Timer(phosphor::fan::event::EventPtr& events, +Timer::Timer(const sdeventplus::Event& event, std::function callbackFunc) : - timeEvent(events), callback(callbackFunc), timeout(0) { sd_event_source* source = nullptr; // Start with an infinite expiration time - auto r = sd_event_add_time(timeEvent.get(), + auto r = sd_event_add_time(event.get(), &source, CLOCK_MONOTONIC, // Time base UINT64_MAX, // Expire time - way long time diff --git a/timer.hpp b/timer.hpp index 979a1cc..3b7783b 100644 --- a/timer.hpp +++ b/timer.hpp @@ -3,6 +3,7 @@ #include #include #include +#include #include "event.hpp" namespace phosphor @@ -46,10 +47,10 @@ class Timer /** * @brief Constructs timer object * - * @param[in] events - sd_event pointer, previously created + * @param[in] event - Event loop reference, previously created * @param[in] callbackFunc - The function to call on timer expiration */ - Timer(phosphor::fan::event::EventPtr& events, + Timer(const sdeventplus::Event& event, std::function callbackFunc); /** @@ -134,11 +135,6 @@ class Timer */ void setTimeout(); - /** - * @brief The sd_event structure - */ - phosphor::fan::event::EventPtr& timeEvent; - /** * @brief Source of events */ -- cgit v1.2.1