summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilliam A. Kennington III <wak@google.com>2018-09-20 18:48:20 -0700
committerWilliam A. Kennington III <wak@google.com>2018-09-27 11:57:23 -0700
commit3a70fa24fc016a06b0dc2ecdc3c7275d1f25425c (patch)
tree649acab21ab5c66f607e02b348ee49c51ac53599
parent548e9f13d2f0aa3eb0ec6ab179c3f5697b108366 (diff)
downloadphosphor-networkd-3a70fa24fc016a06b0dc2ecdc3c7275d1f25425c.tar.gz
phosphor-networkd-3a70fa24fc016a06b0dc2ecdc3c7275d1f25425c.zip
Migrate to a common timer class
This change pulls in sdeventplus and uses the timer implementation as a drop in for the currently included timer. Tested: Unit tests still build but are not currently running. Manually tested this change on a zaius machine and made sure timers went off. Change-Id: I2808196581fc766843931403b83fead16926b0ae Signed-off-by: William A. Kennington III <wak@google.com>
-rw-r--r--Makefile.am4
-rw-r--r--configure.ac2
-rw-r--r--network_manager.cpp17
-rw-r--r--network_manager_main.cpp31
-rw-r--r--rtnetlink_server.cpp9
-rw-r--r--test/Makefile.am3
-rw-r--r--test/test_network_manager.cpp1
-rw-r--r--test/test_rtnetlink.cpp9
-rw-r--r--timer.cpp123
-rw-r--r--timer.hpp100
-rw-r--r--types.hpp4
11 files changed, 36 insertions, 267 deletions
diff --git a/Makefile.am b/Makefile.am
index a3fd0d6..fa3f92b 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -18,7 +18,6 @@ noinst_HEADERS = \
dhcp_configuration.hpp \
vlan_interface.hpp \
rtnetlink_server.hpp \
- timer.hpp \
dns_updater.hpp \
watch.hpp \
argument.hpp
@@ -52,7 +51,6 @@ phosphor_network_manager_SOURCES = \
dhcp_configuration.cpp \
vlan_interface.cpp \
rtnetlink_server.cpp \
- timer.cpp \
dns_updater.cpp \
watch.cpp
@@ -71,6 +69,7 @@ BUILT_SOURCES = \
phosphor_network_manager_LDFLAGS = \
$(SYSTEMD_LIBS) \
$(SDBUSPLUS_LIBS) \
+ $(SDEVENTPLUS_LIBS) \
$(PHOSPHOR_DBUS_INTERFACES_LIBS) \
$(PHOSPHOR_LOGGING_LIBS) \
-lstdc++fs
@@ -78,6 +77,7 @@ phosphor_network_manager_LDFLAGS = \
phosphor_network_manager_CXXFLAGS = \
$(SYSTEMD_CFLAGS) \
$(SDBUSPLUS_CFLAGS) \
+ $(SDEVENTPLUS_CFLAGS) \
$(PHOSPHOR_DBUS_INTERFACES_CFLAGS) \
$(PHOSPHOR_LOGGING_CFLAGS) \
-flto
diff --git a/configure.ac b/configure.ac
index 48adff4..b7bfd18 100644
--- a/configure.ac
+++ b/configure.ac
@@ -34,6 +34,8 @@ PKG_CHECK_MODULES([SYSTEMD], [libsystemd >= 221])
PKG_CHECK_MODULES([SDBUSPLUS], [sdbusplus],,\
AC_MSG_ERROR(["Requires sdbusplus package."]))
+PKG_CHECK_MODULES([SDEVENTPLUS], [sdeventplus],,\
+AC_MSG_ERROR(["Requires sdeventplus package."]))
AC_PATH_PROG([SDBUSPLUSPLUS], [sdbus++])
diff --git a/network_manager.cpp b/network_manager.cpp
index c1b0ba6..35a9fc8 100644
--- a/network_manager.cpp
+++ b/network_manager.cpp
@@ -4,7 +4,7 @@
#include "ipaddress.hpp"
#include "network_config.hpp"
-#include "timer.hpp"
+#include "types.hpp"
#include "util.hpp"
#include <arpa/inet.h>
@@ -25,8 +25,8 @@ namespace phosphor
namespace network
{
-extern std::unique_ptr<phosphor::network::Timer> refreshObjectTimer;
-extern std::unique_ptr<phosphor::network::Timer> restartTimer;
+extern std::unique_ptr<Timer> refreshObjectTimer;
+extern std::unique_ptr<Timer> restartTimer;
using namespace phosphor::logging;
using namespace sdbusplus::xyz::openbmc_project::Common::Error;
@@ -207,15 +207,8 @@ void Manager::restartTimers()
using namespace std::chrono;
if (refreshObjectTimer && restartTimer)
{
- // start the restart timer.
- auto restartTime =
- duration_cast<microseconds>(phosphor::network::restartTimeout);
- restartTimer->startTimer(restartTime);
-
- // start the refresh timer.
- auto refreshTime =
- duration_cast<microseconds>(phosphor::network::refreshTimeout);
- refreshObjectTimer->startTimer(refreshTime);
+ restartTimer->restartOnce(restartTimeout);
+ refreshObjectTimer->restartOnce(refreshTimeout);
}
}
diff --git a/network_manager_main.cpp b/network_manager_main.cpp
index 5f6b81b..7709f7d 100644
--- a/network_manager_main.cpp
+++ b/network_manager_main.cpp
@@ -3,16 +3,18 @@
#include "dns_updater.hpp"
#include "network_manager.hpp"
#include "rtnetlink_server.hpp"
-#include "timer.hpp"
+#include "types.hpp"
#include "watch.hpp"
#include <linux/netlink.h>
+#include <functional>
#include <memory>
#include <phosphor-logging/elog-errors.hpp>
#include <phosphor-logging/log.hpp>
#include <sdbusplus/bus.hpp>
#include <sdbusplus/server/manager.hpp>
+#include <sdeventplus/event.hpp>
#include <xyz/openbmc_project/Common/error.hpp>
namespace phosphor
@@ -21,8 +23,8 @@ namespace network
{
std::unique_ptr<phosphor::network::Manager> manager = nullptr;
-std::unique_ptr<phosphor::network::Timer> refreshObjectTimer = nullptr;
-std::unique_ptr<phosphor::network::Timer> restartTimer = nullptr;
+std::unique_ptr<Timer> refreshObjectTimer = nullptr;
+std::unique_ptr<Timer> restartTimer = nullptr;
/** @brief refresh the network objects. */
void refreshObjects()
@@ -42,24 +44,17 @@ void restartNetwork()
restartSystemdUnit("systemd-networkd.service");
}
-} // namespace network
-} // namespace phosphor
-
void initializeTimers()
{
- std::function<void()> refreshFunc(
- std::bind(&phosphor::network::refreshObjects));
-
- std::function<void()> restartFunc(
- std::bind(&phosphor::network::restartNetwork));
-
- phosphor::network::refreshObjectTimer =
- std::make_unique<phosphor::network::Timer>(refreshFunc);
-
- phosphor::network::restartTimer =
- std::make_unique<phosphor::network::Timer>(restartFunc);
+ auto event = sdeventplus::Event::get_default();
+ refreshObjectTimer =
+ std::make_unique<Timer>(event, std::bind(refreshObjects));
+ restartTimer = std::make_unique<Timer>(event, std::bind(restartNetwork));
}
+} // namespace network
+} // namespace phosphor
+
void createNetLinkSocket(phosphor::Descriptor& smartSock)
{
using namespace phosphor::logging;
@@ -81,7 +76,7 @@ int main(int argc, char* argv[])
{
using namespace phosphor::logging;
- initializeTimers();
+ phosphor::network::initializeTimers();
auto bus = sdbusplus::bus::new_default();
diff --git a/rtnetlink_server.cpp b/rtnetlink_server.cpp
index 3121e4d..2e2436b 100644
--- a/rtnetlink_server.cpp
+++ b/rtnetlink_server.cpp
@@ -1,6 +1,5 @@
#include "rtnetlink_server.hpp"
-#include "timer.hpp"
#include "types.hpp"
#include "util.hpp"
@@ -22,7 +21,7 @@ namespace phosphor
namespace network
{
-extern std::unique_ptr<phosphor::network::Timer> refreshObjectTimer;
+extern std::unique_ptr<Timer> refreshObjectTimer;
namespace rtnetlink
{
@@ -47,13 +46,11 @@ static int eventHandler(sd_event_source* es, int fd, uint32_t revents,
{
// starting the timer here to make sure that we don't want
// create the child objects multiple times.
- if (refreshObjectTimer->isExpired())
+ if (refreshObjectTimer->hasExpired())
{
- using namespace std::chrono;
- auto time = duration_cast<microseconds>(refreshTimeout);
// if start timer throws exception then let the application
// crash
- refreshObjectTimer->startTimer(time);
+ refreshObjectTimer->restartOnce(refreshTimeout);
} // end if
} // end if
diff --git a/test/Makefile.am b/test/Makefile.am
index b32e210..b726e53 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -21,6 +21,7 @@ generic_cpp_flags = -Igtest $(GTEST_CPPFLAGS) $(AM_CPPFLAGS)
generic_cxx_flags = $(PTHREAD_CFLAGS) \
$(SYSTEMD_CFLAGS) \
$(SDBUSPLUS_CFLAGS) \
+ $(SDEVENTPLUS_CFLAGS) \
$(PHOSPHOR_LOGGING_CFLAGS) \
$(PHOSPHOR_DBUS_INTERFACES_CFLAGS)
@@ -28,6 +29,7 @@ generic_ld_flags = -lgtest_main -lgtest -lstdc++fs \
$(OESDK_TESTCASE_FLAGS) \
$(SYSTEMD_LIBS) \
$(SDBUSPLUS_LIBS) \
+ $(SDEVENTPLUS_LIBS) \
$(PHOSPHOR_LOGGING_LIBS) \
$(PHOSPHOR_DBUS_INTERFACES_LIBS)
@@ -49,7 +51,6 @@ test_LDADD = $(top_builddir)/ethernet_interface.o \
$(top_builddir)/ipaddress.o \
$(top_builddir)/routing_table.o \
$(top_builddir)/util.o \
- $(top_builddir)/timer.o \
$(top_builddir)/rtnetlink_server.o \
$(top_builddir)/system_configuration.o \
$(top_builddir)/dhcp_configuration.o \
diff --git a/test/test_network_manager.cpp b/test/test_network_manager.cpp
index 1c0a116..d97b182 100644
--- a/test/test_network_manager.cpp
+++ b/test/test_network_manager.cpp
@@ -1,6 +1,5 @@
#include "mock_syscall.hpp"
#include "network_manager.hpp"
-#include "timer.hpp"
#include "xyz/openbmc_project/Common/error.hpp"
#include <arpa/inet.h>
diff --git a/test/test_rtnetlink.cpp b/test/test_rtnetlink.cpp
index 4be3743..ee43bf4 100644
--- a/test/test_rtnetlink.cpp
+++ b/test/test_rtnetlink.cpp
@@ -1,13 +1,15 @@
#include "mock_syscall.hpp"
#include "network_manager.hpp"
#include "rtnetlink_server.hpp"
-#include "timer.hpp"
#include "types.hpp"
#include <linux/rtnetlink.h>
#include <net/if.h>
+#include <chrono>
+#include <functional>
#include <sdbusplus/bus.hpp>
+#include <sdeventplus/event.hpp>
#include <gtest/gtest.h>
@@ -34,9 +36,8 @@ void refreshObjects()
void initializeTimers()
{
- std::function<void()> refreshFunc(std::bind(&refreshObjects));
-
- refreshObjectTimer = std::make_unique<Timer>(refreshFunc);
+ refreshObjectTimer = std::make_unique<Timer>(
+ sdeventplus::Event::get_default(), std::bind(refreshObjects));
}
class TestRtNetlink : public testing::Test
diff --git a/timer.cpp b/timer.cpp
deleted file mode 100644
index d257433..0000000
--- a/timer.cpp
+++ /dev/null
@@ -1,123 +0,0 @@
-#include "timer.hpp"
-
-#include <chrono>
-#include <phosphor-logging/elog-errors.hpp>
-#include <phosphor-logging/log.hpp>
-#include <xyz/openbmc_project/Common/error.hpp>
-
-namespace phosphor
-{
-namespace network
-{
-
-using namespace phosphor::logging;
-using namespace sdbusplus::xyz::openbmc_project::Common::Error;
-// Initializes the timer object
-void Timer::initialize()
-{
- // This can not be called more than once.
- if (eventSource)
- {
- log<level::ERR>("Timer already initialized");
- elog<InternalFailure>();
- }
-
- auto r = sd_event_default(&timeEvent);
- if (r < 0)
- {
- log<level::ERR>("Failure in creating the sd_event",
- entry("ERROR=%d", r));
-
- elog<InternalFailure>();
- }
-
- // Add infinite expiration time
- r = sd_event_add_time(timeEvent, &eventSource,
- CLOCK_MONOTONIC, // Time base
- UINT64_MAX, // Expire time - way long time
- 0, // Use default event accuracy
- timeoutHandler, // Callback handler on timeout
- this); // User data
- if (r < 0)
- {
- log<level::ERR>("Failure to set initial expiration time value",
- entry("ERROR=%d", r));
-
- elog<InternalFailure>();
- }
-
- // Disable the timer for now
- r = setTimer(SD_EVENT_OFF);
- if (r < 0)
- {
- log<level::ERR>("Failure to disable timer", entry("ERROR=%d", r));
-
- elog<InternalFailure>();
- }
- return;
-}
-
-/** @brief callback handler on timeout */
-int Timer::timeoutHandler(sd_event_source* eventSource, uint64_t usec,
- void* userData)
-{
- auto timer = static_cast<Timer*>(userData);
- timer->expired = true;
-
- // Call optional user call back function if available
- if (timer->userCallBack)
- {
- timer->userCallBack();
- }
-
- sd_event_source_set_enabled(eventSource, SD_EVENT_OFF);
- return 0;
-}
-
-// Gets the time from steady_clock
-std::chrono::microseconds Timer::getTime()
-{
- using namespace std::chrono;
- auto usec = steady_clock::now().time_since_epoch();
- return duration_cast<microseconds>(usec);
-}
-
-// Enables or disables the timer
-int Timer::setTimer(int action)
-{
- return sd_event_source_set_enabled(eventSource, action);
-}
-
-// Sets the time and arms the timer
-int Timer::startTimer(std::chrono::microseconds timeValue)
-{
- // Disable the timer
- setTimer(SD_EVENT_OFF);
- expired = false;
-
- // Get the current MONOTONIC time and add the delta
- auto expireTime = getTime() + timeValue;
-
- // Set the time
- auto r = sd_event_source_set_time(eventSource, expireTime.count());
- if (r < 0)
- {
- log<level::ERR>("Failure to set timer", entry("ERROR=%d", r));
-
- elog<InternalFailure>();
- }
-
- // A ONESHOT timer means that when the timer goes off,
- // its moves to disabled state.
- r = setTimer(SD_EVENT_ONESHOT);
- if (r < 0)
- {
- log<level::ERR>("Failure to start timer", entry("ERROR=%d", r));
-
- elog<InternalFailure>();
- }
- return r;
-}
-
-} // namespace network
-} // namespace phosphor
diff --git a/timer.hpp b/timer.hpp
deleted file mode 100644
index 32b6f17..0000000
--- a/timer.hpp
+++ /dev/null
@@ -1,100 +0,0 @@
-#pragma once
-
-#include <systemd/sd-event.h>
-
-#include <chrono>
-#include <functional>
-
-namespace phosphor
-{
-namespace network
-{
-
-/** @class Timer
- * @brief Usage would be,instantiate the timer with the call back
- * and start the timer for the given time.
- */
-class Timer
-{
- public:
- /** @brief Only need the default Timer */
- Timer() = delete;
- Timer(const Timer&) = delete;
- Timer& operator=(const Timer&) = delete;
- Timer(Timer&&) = delete;
- Timer& operator=(Timer&&) = delete;
-
- /** @brief Constructs timer object
- *
- * @param[in] funcCallBack - optional function callback for timer
- * expirations
- */
- Timer(std::function<void()> userCallBack = nullptr) :
- userCallBack(userCallBack)
- {
- // Initialize the timer
- initialize();
- }
-
- ~Timer()
- {
- if (eventSource)
- {
- eventSource = sd_event_source_unref(eventSource);
- }
- if (timeEvent)
- {
- timeEvent = sd_event_unref(timeEvent);
- }
- }
-
- inline auto isExpired() const
- {
- return expired;
- }
-
- /** @brief Starts the timer with specified expiration value.
- * input is an offset from the current steady_clock
- */
- int startTimer(std::chrono::microseconds usec);
-
- /** @brief Enables / disables the timer */
- int setTimer(int action);
-
- private:
- /** @brief the sd_event structure */
- sd_event* timeEvent = nullptr;
-
- /** @brief Source of events */
- sd_event_source* eventSource = nullptr;
-
- bool expired = true;
-
- /** @brief Initializes the timer object with infinite
- * expiration time and sets up the callback handler
- *
- * @return None.
- *
- * @error std::runtime exception thrown
- */
- void initialize();
-
- /** @brief Callback function when timer goes off
- *
- * @param[in] eventSource - Source of the event
- * @param[in] usec - time in micro seconds
- * @param[in] userData - User data pointer
- *
- */
- static int timeoutHandler(sd_event_source* eventSource, uint64_t usec,
- void* userData);
-
- /** @brief Gets the current time from steady clock */
- static std::chrono::microseconds getTime();
-
- /** @brief Optional function to call on timer expiration */
- std::function<void()> userCallBack;
-};
-
-} // namespace network
-} // namespace phosphor
diff --git a/types.hpp b/types.hpp
index b8038b4..9ffe5ad 100644
--- a/types.hpp
+++ b/types.hpp
@@ -8,6 +8,8 @@
#include <list>
#include <map>
#include <memory>
+#include <sdeventplus/clock.hpp>
+#include <sdeventplus/utility/timer.hpp>
#include <set>
#include <string>
#include <vector>
@@ -76,5 +78,7 @@ using AddrList = std::list<AddrInfo>;
using IntfAddrMap = std::map<IntfName, AddrList>;
using InterfaceList = std::set<IntfName>;
+using Timer = sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic>;
+
} // namespace network
} // namespace phosphor
OpenPOWER on IntegriCloud