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 <wak@google.com>
diff --git a/Makefile.am b/Makefile.am
index 67f49e9..a20fe8a 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -5,11 +5,13 @@
 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 @@
 # 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 @@
 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 @@
                 // Create/start timer and associate event data with it
                 std::unique_ptr<util::Timer> timer =
                     std::make_unique<util::Timer>(
-                            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 <sdbusplus/bus.hpp>
+#include <sdeventplus/event.hpp>
 #include <phosphor-logging/log.hpp>
 #include "argument.hpp"
 #include "manager.hpp"
-#include "event.hpp"
 #include "sdbusplus.hpp"
 
 using namespace phosphor::fan::control;
@@ -25,8 +25,8 @@
 
 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 @@
         return 1;
     }
 
-    auto r = sd_event_default(&events);
-    if (r < 0)
-    {
-        log<level::ERR>("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 @@
             manager.doInit();
             return 0;
         }
-        else
-        {
-            r = sd_event_loop(eventPtr.get());
-            if (r < 0)
-            {
-                log<level::ERR>("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 @@
 
 //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 @@
             for (auto& z : zones)
             {
                 _zones.emplace(std::get<zoneNumPos>(z),
-                               std::make_unique<Zone>(mode, _bus, events, z));
+                               std::make_unique<Zone>(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 <memory>
 #include <vector>
 #include <sdbusplus/bus.hpp>
+#include <sdeventplus/event.hpp>
 #include "types.hpp"
 #include "zone.hpp"
 
@@ -36,11 +37,11 @@
          * _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 @@
 
 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<fullSpeedPos>(def)),
@@ -46,9 +46,9 @@
     _defCeilingSpeed(std::get<fullSpeedPos>(def)),
     _incDelay(std::get<incDelayPos>(def)),
     _decInterval(std::get<decIntervalPos>(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<fanListPos>(def);
 
@@ -347,7 +347,7 @@
             );
         std::unique_ptr<util::Timer> timer =
             std::make_unique<util::Timer>(
-                _sdEvents,
+                _eventLoop,
                 [this,
                  action = &(std::get<actionsPos>(event)),
                  group = &(std::get<groupPos>(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 <cassert>
 #include <algorithm>
 #include <sdbusplus/bus.hpp>
+#include <sdeventplus/event.hpp>
 #include "fan.hpp"
 #include "types.hpp"
 #include "timer.hpp"
@@ -48,12 +49,12 @@
          *
          * @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 @@
         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 @@
         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 @@
 
 using EventSourcePtr = std::unique_ptr<sd_event_source, EventSourceDeleter>;
 
-/**
- * Customer deleter for sd_event
- */
-struct EventDeleter
-{
-    void operator()(sd_event* event) const
-    {
-        sd_event_unref(event);
-    }
-};
-
-using EventPtr = std::unique_ptr<sd_event, EventDeleter>;
-
 }
 }
 }
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 @@
 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 @@
 
 Fan::Fan(Mode mode,
          sdbusplus::bus::bus& bus,
-         phosphor::fan::event::EventPtr&  events,
+         const sdeventplus::Event&  event,
          std::unique_ptr<trust::Manager>& trust,
          const FanDefinition& def) :
     _bus(bus),
@@ -58,7 +58,7 @@
                             std::get<factorField>(s),
                             std::get<offsetField>(s),
                             std::get<timeoutField>(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 <sdbusplus/bus.hpp>
+#include <sdeventplus/event.hpp>
 #include <tuple>
 #include <vector>
-#include "event.hpp"
 #include "tach_sensor.hpp"
 #include "trust_manager.hpp"
 #include "types.hpp"
@@ -78,13 +78,13 @@
          *
          * @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::Manager>& 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 <phosphor-logging/log.hpp>
 #include <sdbusplus/bus.hpp>
-#include <systemd/sd-daemon.h>
+#include <sdeventplus/event.hpp>
 #include "argument.hpp"
-#include "event.hpp"
 #include "fan.hpp"
 #include "fan_defs.hpp"
 #include "trust_manager.hpp"
@@ -27,8 +26,8 @@
 
 int main(int argc, char* argv[])
 {
+    auto event = sdeventplus::Event::get_default();
     auto bus = sdbusplus::bus::new_default();
-    sd_event* events = nullptr;
     std::vector<std::unique_ptr<Fan>> fans;
     phosphor::fan::util::ArgumentParser args(argc, argv);
 
@@ -53,22 +52,12 @@
         return 1;
     }
 
-    auto r = sd_event_default(&events);
-    if (r < 0)
-    {
-        log<level::ERR>("Failed call to sd_event_default()",
-                        entry("ERROR=%s", strerror(-r)));
-        return 1;
-    }
-
     std::unique_ptr<phosphor::fan::trust::Manager> trust =
             std::make_unique<phosphor::fan::trust::Manager>(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 @@
             }
         }
         fans.emplace_back(std::make_unique<Fan>(
-                mode, bus, eventPtr, trust, fanDef));
+                mode, bus, event, trust, fanDef));
     }
 
     if (mode == Mode::init)
@@ -91,15 +80,6 @@
         // Fans were initialized to be functional, exit
         return 0;
     }
-    else
-    {
-        r = sd_event_loop(eventPtr.get());
-        if (r < 0)
-        {
-            log<level::ERR>("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 @@
                        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 @@
     _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 <chrono>
 #include <sdbusplus/bus.hpp>
 #include <sdbusplus/server.hpp>
-#include "event.hpp"
+#include <sdeventplus/event.hpp>
 #include "timer.hpp"
 
 namespace phosphor
@@ -78,7 +78,7 @@
          * @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 @@
                    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_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 <memory>
+#include <functional>
 #include <phosphor-logging/elog-errors.hpp>
 #include <phosphor-logging/elog.hpp>
+#include <sdeventplus/event.hpp>
 #include <tuple>
 #include <xyz/openbmc_project/Common/Callout/error.hpp>
 #include "gpio.hpp"
 #include "rpolicy.hpp"
-#include "sdevent.hpp"
 
 namespace phosphor
 {
@@ -37,25 +37,23 @@
     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<sdevent::event::io::IO>(
-            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 @@
             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 <memory>
+#include <sdeventplus/source/io.hpp>
+#include <optional>
 #include "evdevpp/evdev.hpp"
-#include "sdevent/io.hpp"
-#include "sdevent/source.hpp"
 #include "psensor.hpp"
 #include "utility.hpp"
 
@@ -85,7 +84,7 @@
         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 @@
         /** Gpio pin number. */
         unsigned int pin;
 
-        /** sdevent io callback handle. */
-        std::unique_ptr<sdevent::event::io::IO> callback;
+        /** sdevent io handle. */
+        std::optional<sdeventplus::source::IO> 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 <sdeventplus/event.hpp>
 
 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 @@
 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 <iostream>
 #include <chrono>
 #include <gtest/gtest.h>
-#include "event.hpp"
+#include <sdeventplus/event.hpp>
 #include "timer.hpp"
 
 /**
@@ -34,21 +34,12 @@
 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 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 @@
 {
     CallbackTester tester;
 
-    Timer timer(events,
+    Timer timer(event,
                 std::bind(&CallbackTester::callbackFunction, &tester));
 
 
@@ -148,13 +139,12 @@
     EXPECT_EQ(true, timer.running());
 
     int count = 0;
-    auto sleepTime = duration_cast<microseconds>(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 @@
 {
     CallbackTester tester;
 
-    Timer timer(events,
+    Timer timer(event,
                 std::bind(&CallbackTester::callbackFunction, &tester));
 
 
@@ -180,8 +170,7 @@
     timer.start(time, Timer::TimerType::oneshot);
 
     //wait for a second
-    auto sleepTime = duration_cast<microseconds>(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 @@
     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 @@
     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 @@
 {
     CallbackTester tester;
 
-    Timer timer(events,
+    Timer timer(event,
                 std::bind(&CallbackTester::callbackFunction, &tester));
 
 
     auto time = duration_cast<microseconds>(seconds(2));
     timer.start(time, Timer::TimerType::oneshot);
 
-    auto sleepTime = duration_cast<microseconds>(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 @@
     EXPECT_EQ(false, tester.gotCallback());
 
     //Wait another 2s, make sure no callbacks happened
-    sleepTime = duration_cast<microseconds>(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, timerRestartFromCallback)
 {
-    CallbackTesterWithTimer tester(events);
+    CallbackTesterWithTimer tester(event);
 
     auto& timer = tester.getTimer();
 
@@ -269,11 +255,10 @@
     //for another 1s
 
     int count = 0;
-    auto sleepTime = duration_cast<microseconds>(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 @@
 {
     CallbackTester tester;
 
-    Timer timer(events,
+    Timer timer(event,
                 std::bind(&CallbackTester::callbackFunction, &tester));
 
 
@@ -310,8 +295,7 @@
     EXPECT_EQ(false, tester.gotCallback());
 
     //Now process an event
-    auto sleepTime = duration_cast<microseconds>(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 @@
 {
     CallbackTester tester;
 
-    Timer timer(events,
+    Timer timer(event,
                 std::bind(&CallbackTester::callbackFunction, &tester));
 
     auto time = duration_cast<microseconds>(seconds(1));
     timer.start(time, Timer::TimerType::repeating);
 
     int count = 0;
-    auto sleepTime = duration_cast<microseconds>(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 InternalFailure = sdbusplus::xyz::openbmc_project::Common::
                             Error::InternalFailure;
 
-Timer::Timer(phosphor::fan::event::EventPtr& events,
+Timer::Timer(const sdeventplus::Event& event,
              std::function<void()> 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 <chrono>
 #include <functional>
 #include <memory>
+#include <sdeventplus/event.hpp>
 #include "event.hpp"
 
 namespace phosphor
@@ -46,10 +47,10 @@
         /**
          * @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<void()> callbackFunc);
 
         /**
@@ -135,11 +136,6 @@
         void setTimeout();
 
         /**
-         * @brief The sd_event structure
-         */
-        phosphor::fan::event::EventPtr& timeEvent;
-
-        /**
          * @brief Source of events
          */
         phosphor::fan::event::EventSourcePtr eventSource;