osaf/services/infrastructure/dtms/transport/tests/Makefile.am | 3 +- osaf/services/infrastructure/dtms/transport/tests/transport_monitor_test.cc | 4 +- osaf/services/infrastructure/dtms/transport/transport_monitor.cc | 41 +++++---- 3 files changed, 27 insertions(+), 21 deletions(-)
diff --git a/osaf/services/infrastructure/dtms/transport/tests/Makefile.am b/osaf/services/infrastructure/dtms/transport/tests/Makefile.am --- a/osaf/services/infrastructure/dtms/transport/tests/Makefile.am +++ b/osaf/services/infrastructure/dtms/transport/tests/Makefile.am @@ -42,4 +42,5 @@ transport_test_SOURCES = \ transport_test_LDADD = \ $(GTEST_DIR)/lib/libgtest.la \ - $(GTEST_DIR)/lib/libgtest_main.la + $(GTEST_DIR)/lib/libgtest_main.la \ + $(top_builddir)/osaf/libs/core/libopensaf_core.la diff --git a/osaf/services/infrastructure/dtms/transport/tests/transport_monitor_test.cc b/osaf/services/infrastructure/dtms/transport/tests/transport_monitor_test.cc --- a/osaf/services/infrastructure/dtms/transport/tests/transport_monitor_test.cc +++ b/osaf/services/infrastructure/dtms/transport/tests/transport_monitor_test.cc @@ -82,14 +82,14 @@ class TransportMonitorTest : public ::te TEST_F(TransportMonitorTest, WaitForNonexistentDaemonName) { pid_t pid = monitor_->WaitForDaemon("name_does_not_exist", 17); EXPECT_EQ(pid, pid_t{-1}); - EXPECT_EQ(mock_osaf_poll.invocations, 17); + EXPECT_EQ(mock_osaf_poll.invocations, 1); } TEST_F(TransportMonitorTest, WaitForNonexistentDaemonPid) { CreatePidFile("pid_does_not_exist", 1234567890, false); pid_t pid = monitor_->WaitForDaemon("pid_does_not_exist", 1); EXPECT_EQ(pid, pid_t{-1}); - EXPECT_EQ(mock_osaf_poll.invocations, 1); + EXPECT_EQ(mock_osaf_poll.invocations, 0); } TEST_F(TransportMonitorTest, WaitForExistingPid) { diff --git a/osaf/services/infrastructure/dtms/transport/transport_monitor.cc b/osaf/services/infrastructure/dtms/transport/transport_monitor.cc --- a/osaf/services/infrastructure/dtms/transport/transport_monitor.cc +++ b/osaf/services/infrastructure/dtms/transport/transport_monitor.cc @@ -25,15 +25,16 @@ #include "./configmake.h" #include "osaf/libs/core/common/include/osaf_poll.h" #include "osaf/libs/core/cplusplus/base/getenv.h" +#include "osaf/libs/core/cplusplus/base/file_notify.h" TransportMonitor::TransportMonitor(int term_fd) : term_fd_{term_fd}, - pkgpiddir_{base::GetEnv<std::string>("pkgpiddir", PKGPIDDIR)}, - proc_path_{"/proc/"}, - mds_log_file_{base::GetEnv<std::string>("pkglogdir", PKGLOGDIR) - + "/mds.log"}, - old_mds_log_file_{mds_log_file_ + ".old"}, - use_tipc_{base::GetEnv<std::string>("MDS_TRANSPORT", "TCP") == "TIPC"} { +pkgpiddir_{base::GetEnv<std::string>("pkgpiddir", PKGPIDDIR)}, +proc_path_{"/proc/"}, +mds_log_file_{base::GetEnv<std::string>("pkglogdir", PKGLOGDIR) + + "/mds.log"}, +old_mds_log_file_{mds_log_file_ + ".old"}, +use_tipc_{base::GetEnv<std::string>("MDS_TRANSPORT", "TCP") == "TIPC"} { } TransportMonitor::~TransportMonitor() { @@ -43,15 +44,17 @@ pid_t TransportMonitor::WaitForDaemon(co int64_t seconds_to_wait) { std::string pidfile = pkgpiddir_ + "/" + daemon_name + ".pid"; pid_t pid = pid_t{-1}; - for (int64_t count = 0; count != seconds_to_wait; ++count) { - if (!(std::ifstream{pidfile} >> pid).fail() - && IsDir(proc_path_ + std::to_string(pid))) - break; - pid = pid_t{-1}; - if (Sleep(1)) - return pid_t{-1}; + base::FileNotify file_notify; + int rc = file_notify.WaitForFileCreation(pidfile, seconds_to_wait * 1000); + + if (rc == base::FileNotify::kOK) { + if (!(std::ifstream{pidfile} >> pid).fail()) { + if (IsDir(proc_path_ + std::to_string(pid))) { + return pid; + } + } } - return pid; + return pid_t{-1}; } bool TransportMonitor::Sleep(int64_t seconds_to_wait) { @@ -65,6 +68,7 @@ bool TransportMonitor::IsDir(const std:: } void TransportMonitor::RotateMdsLogs(pid_t pid_to_watch) { + base::FileNotify file_notify; std::string pid_path{proc_path_ + std::to_string(pid_to_watch)}; for (;;) { if (FileSize(mds_log_file_) > kMaxFileSize) { @@ -72,10 +76,11 @@ void TransportMonitor::RotateMdsLogs(pid rename(mds_log_file(), old_mds_log_file()); } if (pid_to_watch != pid_t{0}) { - for (int64_t i = 0; i != kLogRotationIntervalInSeconds; ++i) { - if (!IsDir(pid_path) || Sleep(1)) - return; - } + int rc = + file_notify.WaitForFileDeletion(pid_path, + kLogRotationIntervalInSeconds * 1000); + if (rc == base::FileNotify::kOK) + return; } else { if (Sleep(kLogRotationIntervalInSeconds)) return; ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, SlashDot.org! http://sdm.link/slashdot _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel