From 5af06e0f18d9ab602e7b73f3fe149106fff71710 Mon Sep 17 00:00:00 2001 From: Razvan Becheriu Date: Thu, 30 Oct 2025 13:59:26 +0200 Subject: [PATCH] [#4141] move to util --- .../libloadtests/close_unittests.cc | 22 ++++----- src/lib/dhcp/iface_mgr.cc | 2 +- src/lib/dhcp/iface_mgr.h | 7 ++- src/lib/dhcp/meson.build | 6 --- src/lib/dhcp/tests/meson.build | 2 - src/lib/{dhcp => util}/fd_event_handler.cc | 6 +-- src/lib/{dhcp => util}/fd_event_handler.h | 4 +- .../fd_event_handler_factory.cc | 8 ++-- .../{dhcp => util}/fd_event_handler_factory.h | 6 +-- src/lib/util/meson.build | 6 +++ src/lib/util/ready_check.cc | 45 ++----------------- .../{dhcp => util}/select_event_handler.cc | 6 +-- src/lib/{dhcp => util}/select_event_handler.h | 6 +-- .../fd_event_handler_factory_unittests.cc | 4 +- .../tests/fd_event_handler_unittests.h | 17 ++++--- src/lib/util/tests/meson.build | 2 + .../tests/select_event_handler_unittests.cc | 0 17 files changed, 59 insertions(+), 90 deletions(-) rename src/lib/{dhcp => util}/fd_event_handler.cc (85%) rename src/lib/{dhcp => util}/fd_event_handler.h (98%) rename src/lib/{dhcp => util}/fd_event_handler_factory.cc (80%) rename src/lib/{dhcp => util}/fd_event_handler_factory.h (91%) rename src/lib/{dhcp => util}/select_event_handler.cc (95%) rename src/lib/{dhcp => util}/select_event_handler.h (96%) rename src/lib/{dhcp => util}/tests/fd_event_handler_factory_unittests.cc (91%) rename src/lib/{dhcp => util}/tests/fd_event_handler_unittests.h (91%) rename src/lib/{dhcp => util}/tests/select_event_handler_unittests.cc (100%) diff --git a/src/hooks/dhcp/high_availability/libloadtests/close_unittests.cc b/src/hooks/dhcp/high_availability/libloadtests/close_unittests.cc index 741fc9c271..d01b2228e1 100644 --- a/src/hooks/dhcp/high_availability/libloadtests/close_unittests.cc +++ b/src/hooks/dhcp/high_availability/libloadtests/close_unittests.cc @@ -228,29 +228,29 @@ CloseHATest::runPartners(bool const backup /* = true */) { } wthread_->markReady(WatchedThread::READY); - FDEventHandlerPtr ev_handler_ = FDEventHandlerFactory::factoryFDEventHandler(); + FDEventHandlerPtr handler = FDEventHandlerFactory::factoryFDEventHandler(); for (;;) { - ev_handler_->clear(); - ev_handler_->add(wthread_->getWatchFd(WatchedThread::TERMINATE)); - ev_handler_->add(accept_partner1); - ev_handler_->add(accept_partner2); + handler->clear(); + handler->add(wthread_->getWatchFd(WatchedThread::TERMINATE)); + handler->add(accept_partner1); + handler->add(accept_partner2); for (auto const& reader : readers) { if (!reader.second) { continue; } - ev_handler_->add(reader.first); + handler->add(reader.first); } - int n = ev_handler_->waitEvent(0, 0); + int n = handler->waitEvent(0, 0); if ((n < 0) && (errno == EINTR)) { cerr << "interrupted" << endl; continue; } - if (ev_handler_->readReady(wthread_->getWatchFd(WatchedThread::TERMINATE))) { + if (handler->readReady(wthread_->getWatchFd(WatchedThread::TERMINATE))) { break; } - if (ev_handler_->readReady(accept_partner1)) { + if (handler->readReady(accept_partner1)) { int fd = accept(accept_partner1, 0, 0); if (fd < 0) { cerr << "accept1 failed " << strerror(errno) << endl; @@ -261,7 +261,7 @@ CloseHATest::runPartners(bool const backup /* = true */) { readers[fd] = true; } } - if (ev_handler_->readReady(accept_partner2)) { + if (handler->readReady(accept_partner2)) { int fd = accept(accept_partner2, 0, 0); if (fd < 0) { cerr << "accept2 failed " << strerror(errno) << endl; @@ -277,7 +277,7 @@ CloseHATest::runPartners(bool const backup /* = true */) { continue; } int fd = reader.first; - if (ev_handler_->readReady(fd)) { + if (handler->readReady(fd)) { char buf[128]; int cc = read(fd, buf, 128); if (cc < 0) { diff --git a/src/lib/dhcp/iface_mgr.cc b/src/lib/dhcp/iface_mgr.cc index cec5c896e9..520a846cf8 100644 --- a/src/lib/dhcp/iface_mgr.cc +++ b/src/lib/dhcp/iface_mgr.cc @@ -14,8 +14,8 @@ #include #include #include -#include #include +#include #include #include diff --git a/src/lib/dhcp/iface_mgr.h b/src/lib/dhcp/iface_mgr.h index 4db709a721..7a5f27f92e 100644 --- a/src/lib/dhcp/iface_mgr.h +++ b/src/lib/dhcp/iface_mgr.h @@ -10,13 +10,13 @@ #include #include #include -#include #include #include #include #include #include #include +#include #include #include #include @@ -35,7 +35,6 @@ #include namespace isc { - namespace dhcp { /// @brief IfaceMgr exception thrown thrown when interface detection fails. @@ -1630,10 +1629,10 @@ private: isc::util::WatchedThreadPtr dhcp_receiver_; /// @brief The FDEventHandler instance. - FDEventHandlerPtr fd_event_handler_; + util::FDEventHandlerPtr fd_event_handler_; /// @brief The receiver FDEventHandler instance. - FDEventHandlerPtr receiver_fd_event_handler_; + util::FDEventHandlerPtr receiver_fd_event_handler_; }; } // namespace isc::dhcp diff --git a/src/lib/dhcp/meson.build b/src/lib/dhcp/meson.build index 306cac9a52..6d2c0ab733 100644 --- a/src/lib/dhcp/meson.build +++ b/src/lib/dhcp/meson.build @@ -15,8 +15,6 @@ kea_dhcp_lib = shared_library( 'classify.cc', 'duid.cc', 'duid_factory.cc', - 'fd_event_handler.cc', - 'fd_event_handler_factory.cc', 'hwaddr.cc', 'iface_mgr.cc', iface_mgr, @@ -56,7 +54,6 @@ kea_dhcp_lib = shared_library( 'pkt_filter_inet6.cc', pkt_filter_cc, 'protocol_util.cc', - 'select_event_handler.cc', include_directories: [include_directories('.')] + INCLUDES, install: true, install_dir: LIBDIR, @@ -75,8 +72,6 @@ kea_dhcp_headers = [ 'docsis3_option_defs.h', 'duid.h', 'duid_factory.h', - 'fd_event_handler.h', - 'fd_event_handler_factory.h', 'hwaddr.h', 'iface_mgr.h', 'iface_mgr_error_handler.h', @@ -124,7 +119,6 @@ kea_dhcp_headers = [ 'pkt_filter_lpf.h', 'pkt_template.h', 'protocol_util.h', - 'select_event_handler.h', 'socket_info.h', 'std_option_defs.h', ] diff --git a/src/lib/dhcp/tests/meson.build b/src/lib/dhcp/tests/meson.build index 9a66ab0734..b08f6ca9ac 100644 --- a/src/lib/dhcp/tests/meson.build +++ b/src/lib/dhcp/tests/meson.build @@ -17,7 +17,6 @@ kea_dhcp_tests = executable( 'classify_unittest.cc', 'duid_factory_unittest.cc', 'duid_unittest.cc', - 'fd_event_handler_factory_unittests.cc', 'hwaddr_unittest.cc', 'iface_mgr_unittest.cc', 'libdhcp++_unittest.cc', @@ -62,7 +61,6 @@ kea_dhcp_tests = executable( 'protocol_util_unittest.cc', 'run_unittests.cc', pkt_filter_xpf_unittest_cc, - 'select_event_handler_unittests.cc', dependencies: [GTEST_DEP, CRYPTO_DEP], cpp_args: [f'-DTEST_DATA_BUILDDIR="@current_build_dir@"'], include_directories: [include_directories('.')] + INCLUDES, diff --git a/src/lib/dhcp/fd_event_handler.cc b/src/lib/util/fd_event_handler.cc similarity index 85% rename from src/lib/dhcp/fd_event_handler.cc rename to src/lib/util/fd_event_handler.cc index ddd324e777..9f9b778e09 100644 --- a/src/lib/dhcp/fd_event_handler.cc +++ b/src/lib/util/fd_event_handler.cc @@ -6,10 +6,10 @@ #include -#include +#include namespace isc { -namespace dhcp { +namespace util { FDEventHandler::FDEventHandler(HandlerType type) : type_(type) { } @@ -18,5 +18,5 @@ FDEventHandler::HandlerType FDEventHandler::type() { return (type_); } -} // end of namespace isc::dhcp +} // end of namespace isc::util } // end of namespace isc diff --git a/src/lib/dhcp/fd_event_handler.h b/src/lib/util/fd_event_handler.h similarity index 98% rename from src/lib/dhcp/fd_event_handler.h rename to src/lib/util/fd_event_handler.h index a5f5ed85f9..e8e9398690 100644 --- a/src/lib/dhcp/fd_event_handler.h +++ b/src/lib/util/fd_event_handler.h @@ -11,7 +11,7 @@ #include namespace isc { -namespace dhcp { +namespace util { /// @brief File descriptor event handler class handles events for registered /// file descriptors. @@ -77,7 +77,7 @@ private: /// @brief Shared pointer to an FD event handler. typedef boost::shared_ptr FDEventHandlerPtr; -} // namespace isc::dhcp +} // namespace isc::util } // namespace isc #endif // FD_EVENT_HANDLER_H diff --git a/src/lib/dhcp/fd_event_handler_factory.cc b/src/lib/util/fd_event_handler_factory.cc similarity index 80% rename from src/lib/dhcp/fd_event_handler_factory.cc rename to src/lib/util/fd_event_handler_factory.cc index ec99519f62..91a5b99818 100644 --- a/src/lib/dhcp/fd_event_handler_factory.cc +++ b/src/lib/util/fd_event_handler_factory.cc @@ -6,16 +6,16 @@ #include -#include -#include +#include +#include namespace isc { -namespace dhcp { +namespace util { FDEventHandlerPtr FDEventHandlerFactory::factoryFDEventHandler() { // todo: use configuration to initialize the FDEventHandler. return (FDEventHandlerPtr(new SelectEventHandler())); } -} // end of namespace isc::dhcp +} // end of namespace isc::util } // end of namespace isc diff --git a/src/lib/dhcp/fd_event_handler_factory.h b/src/lib/util/fd_event_handler_factory.h similarity index 91% rename from src/lib/dhcp/fd_event_handler_factory.h rename to src/lib/util/fd_event_handler_factory.h index 567cbbbd68..b45dec11c8 100644 --- a/src/lib/dhcp/fd_event_handler_factory.h +++ b/src/lib/util/fd_event_handler_factory.h @@ -7,10 +7,10 @@ #ifndef FD_EVENT_HANDLER_FACTORY_H #define FD_EVENT_HANDLER_FACTORY_H -#include +#include namespace isc { -namespace dhcp { +namespace util { /// @brief File descriptor event handler factory class handles the creation of /// the FDEventHangler instance according to configuration and OS supported @@ -28,7 +28,7 @@ public: static FDEventHandlerPtr factoryFDEventHandler(); }; -} // namespace isc::dhcp +} // namespace isc::util } // namespace isc #endif // FD_EVENT_HANDLER_FACTORY_H diff --git a/src/lib/util/meson.build b/src/lib/util/meson.build index 845a8dd3f6..0a90402e08 100644 --- a/src/lib/util/meson.build +++ b/src/lib/util/meson.build @@ -6,6 +6,8 @@ kea_util_lib = shared_library( 'dhcp_space.cc', 'encode/encode.cc', 'encode/utf8.cc', + 'fd_event_handler.cc', + 'fd_event_handler_factory.cc', 'filesystem.cc', 'labeled_value.cc', 'memory_segment_local.cc', @@ -13,6 +15,7 @@ kea_util_lib = shared_library( 'pid_file.cc', 'ready_check.cc', 'reconnect_ctl.cc', + 'select_event_handler.cc', 'state_model.cc', 'stopwatch.cc', 'stopwatch_impl.cc', @@ -43,6 +46,8 @@ kea_util_headers = [ 'doubles.h', 'encode/encode.h', 'encode/utf8.h', + 'fd_event_handler.h', + 'fd_event_handler_factory.h', 'filesystem.h', 'io/fd.h', 'io/pktinfo_utilities.h', @@ -60,6 +65,7 @@ kea_util_headers = [ 'readwrite_mutex.h', 'ready_check.h', 'reconnect_ctl.h', + 'select_event_handler.h', 'staged_value.h', 'state_model.h', 'stopwatch.h', diff --git a/src/lib/util/ready_check.cc b/src/lib/util/ready_check.cc index 29d835606e..703ee43dc8 100644 --- a/src/lib/util/ready_check.cc +++ b/src/lib/util/ready_check.cc @@ -6,53 +6,16 @@ #include -#include +#include namespace isc { namespace util { int selectCheck(const int fd_to_check, const unsigned int timeout_sec, bool read_check, bool write_check) { - // @todo: implement this using SelectEventHandler - // @todo: should move to epoll/kqueue? - if (fd_to_check < 0) { - return (-1); - } - if (fd_to_check >= FD_SETSIZE) { - return (-1); - } - int maxfd = 0; - - fd_set read_fds; - FD_ZERO(&read_fds); - - fd_set write_fds; - FD_ZERO(&write_fds); - - maxfd = fd_to_check; - - // Add this socket to read set - FD_SET(fd_to_check, &read_fds); - - // Add this socket to write set - FD_SET(fd_to_check, &write_fds); - - struct timeval select_timeout; - select_timeout.tv_sec = static_cast(timeout_sec); - select_timeout.tv_usec = 0; - - fd_set* read_p = 0; - fd_set* write_p = 0; - - if (read_check) { - read_p = &read_fds; - } - - if (write_check) { - write_p = &write_fds; - } - - return (select(maxfd + 1, read_p, write_p, 0, &select_timeout)); + FDEventHandlerPtr handler = FDEventHandlerFactory::factoryFDEventHandler(); + handler->add(fd_to_check, read_check, write_check); + return (handler->waitEvent(timeout_sec, 0)); } } // end of isc::util namespace diff --git a/src/lib/dhcp/select_event_handler.cc b/src/lib/util/select_event_handler.cc similarity index 95% rename from src/lib/dhcp/select_event_handler.cc rename to src/lib/util/select_event_handler.cc index 0d63f6e579..e4daf7a963 100644 --- a/src/lib/dhcp/select_event_handler.cc +++ b/src/lib/util/select_event_handler.cc @@ -7,7 +7,7 @@ #include #include -#include +#include #ifndef FD_COPY #define FD_COPY(orig, copy) \ @@ -17,7 +17,7 @@ #endif namespace isc { -namespace dhcp { +namespace util { SelectEventHandler::SelectEventHandler() : FDEventHandler(TYPE_SELECT), max_fd_(0) { clear(); @@ -73,5 +73,5 @@ void SelectEventHandler::clear() { max_fd_ = 0; } -} // end of namespace isc::dhcp +} // end of namespace isc::util } // end of namespace isc diff --git a/src/lib/dhcp/select_event_handler.h b/src/lib/util/select_event_handler.h similarity index 96% rename from src/lib/dhcp/select_event_handler.h rename to src/lib/util/select_event_handler.h index 4dd8a38a49..579a7c00da 100644 --- a/src/lib/dhcp/select_event_handler.h +++ b/src/lib/util/select_event_handler.h @@ -7,12 +7,12 @@ #ifndef SELECT_EVENT_HANDLER_H #define SELECT_EVENT_HANDLER_H -#include +#include #include namespace isc { -namespace dhcp { +namespace util { /// @brief File descriptor event handler class handles events for registered /// file descriptors. This class uses the OS select syscall for event handling. @@ -75,7 +75,7 @@ private: fd_set write_fd_set_data_; }; -} // namespace isc::dhcp +} // namespace isc::util; } // namespace isc #endif // SELECT_EVENT_HANDLER_H diff --git a/src/lib/dhcp/tests/fd_event_handler_factory_unittests.cc b/src/lib/util/tests/fd_event_handler_factory_unittests.cc similarity index 91% rename from src/lib/dhcp/tests/fd_event_handler_factory_unittests.cc rename to src/lib/util/tests/fd_event_handler_factory_unittests.cc index 4539ad418c..40405f8c44 100644 --- a/src/lib/dhcp/tests/fd_event_handler_factory_unittests.cc +++ b/src/lib/util/tests/fd_event_handler_factory_unittests.cc @@ -6,14 +6,14 @@ #include -#include #include +#include #include #include using namespace isc; -using namespace isc::dhcp; +using namespace isc::util; namespace { diff --git a/src/lib/dhcp/tests/fd_event_handler_unittests.h b/src/lib/util/tests/fd_event_handler_unittests.h similarity index 91% rename from src/lib/dhcp/tests/fd_event_handler_unittests.h rename to src/lib/util/tests/fd_event_handler_unittests.h index e41523eabc..04e2ad8854 100644 --- a/src/lib/dhcp/tests/fd_event_handler_unittests.h +++ b/src/lib/util/tests/fd_event_handler_unittests.h @@ -6,13 +6,18 @@ #include -#include -#include +#include +#include +#include #include +#include + +#include + using namespace isc; -using namespace isc::dhcp; +using namespace isc::util; const unsigned char MARKER = 0; @@ -26,7 +31,7 @@ class FDEventHandlerTest : public ::testing::Test { public: /// @brief Constructor. FDEventHandlerTest() { - handler_.reset(new isc::dhcp::FDEventHandlerType); + handler_.reset(new FDEventHandlerType); pipe(pipefd); } @@ -39,7 +44,7 @@ public: /// @brief The tested fd event handler. FDEventHandlerPtr handler_; - /// @brief The pipe used tor testing read and write operations. + /// @brief The pipe used for testing read and write operations. int pipefd[2]; }; @@ -48,6 +53,8 @@ TEST_F(FDEventHandlerTest, events) { EXPECT_EQ(0, handler_->waitEvent(0, 1000)); + EXPECT_THROW(handler_->add(-1), BadValue); + handler_->add(pipefd[0], true, false); handler_->add(pipefd[1], false, true); diff --git a/src/lib/util/tests/meson.build b/src/lib/util/tests/meson.build index 9c2ce19a28..9dd8f69097 100644 --- a/src/lib/util/tests/meson.build +++ b/src/lib/util/tests/meson.build @@ -12,6 +12,7 @@ kea_util_tests = executable( 'dhcp_space_unittest.cc', 'doubles_unittest.cc', 'encode_unittest.cc', + 'fd_event_handler_factory_unittests.cc', 'fd_tests.cc', 'filesystem_unittests.cc', 'hash_unittest.cc', @@ -25,6 +26,7 @@ kea_util_tests = executable( 'range_utilities_unittest.cc', 'readwrite_mutex_unittest.cc', 'run_unittests.cc', + 'select_event_handler_unittests.cc', 'staged_value_unittest.cc', 'state_model_unittest.cc', 'stopwatch_unittest.cc', diff --git a/src/lib/dhcp/tests/select_event_handler_unittests.cc b/src/lib/util/tests/select_event_handler_unittests.cc similarity index 100% rename from src/lib/dhcp/tests/select_event_handler_unittests.cc rename to src/lib/util/tests/select_event_handler_unittests.cc -- 2.47.3