fib: implicitly delete empty Entry
Fib::removeNextHopFromAllEntries automatically deletes fib::Entry
if the last nexthop record is being removed.
refs #1341
Change-Id: I36d42fe8f9fc8f03d194f845020aff408cd70488
diff --git a/daemon/table/fib.cpp b/daemon/table/fib.cpp
index eea7641..7397c60 100644
--- a/daemon/table/fib.cpp
+++ b/daemon/table/fib.cpp
@@ -37,7 +37,7 @@
return std::make_pair(entry, false);
entry = make_shared<fib::Entry>(prefix);
nameTreeEntry->setFibEntry(entry);
- m_nItems++;
+ ++m_nItems;
return std::make_pair(entry, true);
}
@@ -79,19 +79,32 @@
shared_ptr<name_tree::Entry> nameTreeEntry = m_nameTree.findExactMatch(prefix);
if (static_cast<bool>(nameTreeEntry))
{
- nameTreeEntry->eraseFibEntry(nameTreeEntry->getFibEntry());
- m_nItems--;
+ nameTreeEntry->setFibEntry(shared_ptr<fib::Entry>());
+ --m_nItems;
+ }
+}
+
+void
+Fib::erase(const fib::Entry& entry)
+{
+ shared_ptr<name_tree::Entry> nameTreeEntry = m_nameTree.findExactMatch(entry);
+ if (static_cast<bool>(nameTreeEntry))
+ {
+ nameTreeEntry->setFibEntry(shared_ptr<fib::Entry>());
+ --m_nItems;
}
}
void
Fib::removeNextHopFromAllEntries(shared_ptr<Face> face)
{
- for (NameTree::const_iterator it =
- m_nameTree.fullEnumerate(&predicate_NameTreeEntry_hasFibEntry); it != m_nameTree.end(); it++)
- {
+ for (NameTree::const_iterator it = m_nameTree.fullEnumerate(
+ &predicate_NameTreeEntry_hasFibEntry); it != m_nameTree.end(); ++it) {
shared_ptr<fib::Entry> entry = it->getFibEntry();
entry->removeNextHop(face);
+ if (!entry->hasNextHops()) {
+ this->erase(*entry);
+ }
}
}