diff --git a/src/main.cpp b/src/main.cpp index dfe54a7..ca0e8ec 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,6 @@ /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ /* - * Copyright (c) 2014-2023, The University of Memphis, + * Copyright (c) 2014-2025, The University of Memphis, * Regents of the University of California, * Arizona Board of Regents. * @@ -88,7 +88,6 @@ main(int argc, char** argv) face.processEvents(); } catch (const std::exception& e) { - nlsr.getFib().clean(); std::cerr << "FATAL: " << boost::diagnostic_information(e) << std::endl; return 1; } diff --git a/src/nlsr.cpp b/src/nlsr.cpp index 144f1d3..4d52fa0 100644 --- a/src/nlsr.cpp +++ b/src/nlsr.cpp @@ -78,6 +78,7 @@ Nlsr::Nlsr(ndn::Face& face, ndn::KeyChain& keyChain, ConfParameter& confParam) m_lsdb) , m_statsCollector(m_lsdb, m_helloProtocol) , m_faceMonitor(m_face) + , m_terminateSignals(face.getIoContext(), SIGINT, SIGTERM) { NLSR_LOG_DEBUG("Initializing Nlsr"); @@ -107,6 +108,10 @@ Nlsr::Nlsr(ndn::Face& face, ndn::KeyChain& keyChain, ConfParameter& confParam) neighbor.setLinkCost(0); } } + + m_terminateSignals.async_wait([this] (auto&&... args) { + terminate(std::forward(args)...); + }); } void @@ -365,4 +370,13 @@ Nlsr::enableIncomingFaceIdIndication() }); } +void +Nlsr::terminate(const boost::system::error_code& error, int signalNo) +{ + if (error) + return; + NLSR_LOG_INFO("Caught signal " << signalNo << " (" << ::strsignal(signalNo) << "), exiting..."); + m_face.getIoContext().stop(); +} + } // namespace nlsr diff --git a/src/nlsr.hpp b/src/nlsr.hpp index f375eca..891eda9 100644 --- a/src/nlsr.hpp +++ b/src/nlsr.hpp @@ -48,6 +48,7 @@ #include #include +#include namespace nlsr { class Nlsr @@ -157,6 +158,9 @@ class Nlsr void enableIncomingFaceIdIndication(); + void + terminate(const boost::system::error_code& error, int signalNo); + public: static inline const ndn::Name LOCALHOST_PREFIX{"/localhost/nlsr"}; @@ -196,6 +200,7 @@ class Nlsr private: ndn::nfd::FaceMonitor m_faceMonitor; + boost::asio::signal_set m_terminateSignals; }; } // namespace nlsr diff --git a/src/route/fib.cpp b/src/route/fib.cpp index 7f3f076..76affde 100644 --- a/src/route/fib.cpp +++ b/src/route/fib.cpp @@ -153,17 +153,6 @@ Fib::update(const ndn::Name& name, const NexthopList& allHops) } } -void -Fib::clean() -{ - NLSR_LOG_DEBUG("Clean called"); - for (const auto& it : m_table) { - for (const auto& hop : it.second.nexthopSet) { - unregisterPrefix(it.second.name, hop.getConnectingFaceUri()); - } - } -} - unsigned int Fib::getNumberOfFacesForName(const NexthopList& nextHopList) { diff --git a/src/route/fib.hpp b/src/route/fib.hpp index 8c53125..7be0001 100644 --- a/src/route/fib.hpp +++ b/src/route/fib.hpp @@ -1,6 +1,6 @@ /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ /* - * Copyright (c) 2014-2023, The University of Memphis, + * Copyright (c) 2014-2025, The University of Memphis, * Regents of the University of California, * Arizona Board of Regents. * @@ -90,17 +90,6 @@ class Fib void update(const ndn::Name& name, const NexthopList& allHops); - /*! \brief Remove all entries from the FIB. - * - * This method is called before terminating NLSR to minimize the - * time NFD spends routing on now-invalid information. This is not - * strictly necessary, because eventually those prefix registrations - * will expire, but cleaning up after ourselves improves - * performance. - */ - void - clean(); - void setEntryRefreshTime(int32_t fert) { diff --git a/src/sequencing-manager.cpp b/src/sequencing-manager.cpp index ae0c8b5..6046b10 100644 --- a/src/sequencing-manager.cpp +++ b/src/sequencing-manager.cpp @@ -1,6 +1,6 @@ /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ -/** - * Copyright (c) 2014-2020, The University of Memphis, +/* + * Copyright (c) 2014-2025, The University of Memphis, * Regents of the University of California, * Arizona Board of Regents. * @@ -17,7 +17,7 @@ * * You should have received a copy of the GNU General Public License along with * NLSR, e.g., in COPYING.md file. If not, see . - **/ + */ #include "sequencing-manager.hpp" #include "logger.hpp" @@ -43,13 +43,13 @@ void SequencingManager::writeSeqNoToFile() const { writeLog(); - std::ofstream outputFile(m_seqFileNameWithPath.c_str()); - std::ostringstream os; - os << "NameLsaSeq " << std::to_string(m_nameLsaSeq) << "\n" - << "AdjLsaSeq " << std::to_string(m_adjLsaSeq) << "\n" - << "CorLsaSeq " << std::to_string(m_corLsaSeq); - outputFile << os.str(); + std::string tempPath = m_seqFileNameWithPath + ".tmp"; + std::ofstream outputFile(tempPath.c_str()); + outputFile << "NameLsaSeq " << m_nameLsaSeq << "\n" + << "AdjLsaSeq " << m_adjLsaSeq << "\n" + << "CorLsaSeq " << m_corLsaSeq; outputFile.close(); + std::filesystem::rename(tempPath, m_seqFileNameWithPath); } void