diff --git a/daemon/fw/forwarder.cpp b/daemon/fw/forwarder.cpp index 89ce1667..4fc9c380 100644 --- a/daemon/fw/forwarder.cpp +++ b/daemon/fw/forwarder.cpp @@ -312,7 +312,7 @@ Forwarder::onInterestFinalize(const shared_ptr& pitEntry, bool isSat // PIT delete this->cancelUnsatisfyAndStragglerTimer(*pitEntry); - m_pit.erase(pitEntry); + m_pit.erase(pitEntry.get()); } void diff --git a/daemon/table/name-tree-entry.cpp b/daemon/table/name-tree-entry.cpp index 5721e22c..8d33a89c 100644 --- a/daemon/table/name-tree-entry.cpp +++ b/daemon/table/name-tree-entry.cpp @@ -95,17 +95,18 @@ Entry::insertPitEntry(shared_ptr pitEntry) } void -Entry::erasePitEntry(shared_ptr pitEntry) +Entry::erasePitEntry(pit::Entry* pitEntry) { BOOST_ASSERT(pitEntry != nullptr); BOOST_ASSERT(pitEntry->m_nameTreeEntry == this); - auto it = std::find(m_pitEntries.begin(), m_pitEntries.end(), pitEntry); + auto it = std::find_if(m_pitEntries.begin(), m_pitEntries.end(), + [pitEntry] (const shared_ptr& pitEntry2) { return pitEntry2.get() == pitEntry; }); BOOST_ASSERT(it != m_pitEntries.end()); - *it = m_pitEntries.back(); + pitEntry->m_nameTreeEntry = nullptr; // must be done before pitEntry is deallocated + *it = m_pitEntries.back(); // may deallocate pitEntry m_pitEntries.pop_back(); - pitEntry->m_nameTreeEntry = nullptr; } void diff --git a/daemon/table/name-tree-entry.hpp b/daemon/table/name-tree-entry.hpp index d481a5ef..b36aae96 100644 --- a/daemon/table/name-tree-entry.hpp +++ b/daemon/table/name-tree-entry.hpp @@ -132,7 +132,7 @@ public: // attached table entries insertPitEntry(shared_ptr pitEntry); void - erasePitEntry(shared_ptr pitEntry); + erasePitEntry(pit::Entry* pitEntry); measurements::Entry* getMeasurementsEntry() const diff --git a/daemon/table/pit.cpp b/daemon/table/pit.cpp index bf17e964..91bc5a85 100644 --- a/daemon/table/pit.cpp +++ b/daemon/table/pit.cpp @@ -100,7 +100,7 @@ Pit::findAllDataMatches(const Data& data) const } void -Pit::erase(shared_ptr entry, bool canDeleteNte) +Pit::erase(Entry* entry, bool canDeleteNte) { name_tree::Entry* nte = m_nameTree.getEntry(*entry); BOOST_ASSERT(nte != nullptr); diff --git a/daemon/table/pit.hpp b/daemon/table/pit.hpp index 1df3380a..8e6c9f12 100644 --- a/daemon/table/pit.hpp +++ b/daemon/table/pit.hpp @@ -84,10 +84,10 @@ public: DataMatchResult findAllDataMatches(const Data& data) const; - /** \brief erases a PIT Entry + /** \brief deletes an entry */ void - erase(shared_ptr entry) + erase(Entry* entry) { this->erase(entry, true); } @@ -118,10 +118,8 @@ public: // enumeration } private: - /** \brief erases a PIT Entry - */ void - erase(shared_ptr pitEntry, bool canDeleteNte); + erase(Entry* pitEntry, bool canDeleteNte); /** \brief finds or inserts a PIT entry for Interest * \param interest the Interest; must be created with make_shared if allowInsert diff --git a/tests/daemon/table/name-tree.t.cpp b/tests/daemon/table/name-tree.t.cpp index a839152c..127056d4 100644 --- a/tests/daemon/table/name-tree.t.cpp +++ b/tests/daemon/table/name-tree.t.cpp @@ -249,11 +249,15 @@ BOOST_AUTO_TEST_CASE(TableEntries) npe.insertPitEntry(pit2); BOOST_CHECK_EQUAL(npe.getPitEntries().size(), 2); - npe.erasePitEntry(pit1); + pit::Entry* pit1ptr = pit1.get(); + weak_ptr pit1weak(pit1); + pit1.reset(); + BOOST_CHECK_EQUAL(pit1weak.use_count(), 1); // npe is the sole owner of pit1 + npe.erasePitEntry(pit1ptr); BOOST_REQUIRE_EQUAL(npe.getPitEntries().size(), 1); BOOST_CHECK_EQUAL(npe.getPitEntries().front()->getInterest(), *interest2); - npe.erasePitEntry(pit2); + npe.erasePitEntry(pit2.get()); BOOST_CHECK_EQUAL(npe.hasPitEntries(), false); BOOST_CHECK_EQUAL(npe.getPitEntries().size(), 0); BOOST_CHECK_EQUAL(npe.hasTableEntries(), false); diff --git a/tests/daemon/table/pit.t.cpp b/tests/daemon/table/pit.t.cpp index 6135502d..e761ef87 100644 --- a/tests/daemon/table/pit.t.cpp +++ b/tests/daemon/table/pit.t.cpp @@ -344,7 +344,7 @@ BOOST_AUTO_TEST_CASE(Erase) BOOST_CHECK_EQUAL(pit.size(), 1); BOOST_CHECK(pit.find(*interest) != nullptr); - pit.erase(insertResult.first); + pit.erase(insertResult.first.get()); BOOST_CHECK_EQUAL(pit.size(), 0); BOOST_CHECK(pit.find(*interest) == nullptr); @@ -362,7 +362,7 @@ BOOST_AUTO_TEST_CASE(EraseNameTreeEntry) shared_ptr interest = makeInterest("/37xWVvQ2K"); shared_ptr entry = pit.insert(*interest).first; - pit.erase(entry); + pit.erase(entry.get()); BOOST_CHECK_EQUAL(nameTree.size(), nNameTreeEntriesBefore); } @@ -385,7 +385,7 @@ BOOST_AUTO_TEST_CASE(EraseWithFullName) shared_ptr pitEntry = pit.find(*interest); BOOST_REQUIRE(pitEntry != nullptr); - pit.erase(pitEntry); + pit.erase(pitEntry.get()); BOOST_CHECK_EQUAL(pit.size(), 0); BOOST_CHECK(pit.find(*interest) == nullptr); diff --git a/tests/other/pit-fib-benchmark.cpp b/tests/other/pit-fib-benchmark.cpp index c10d7f51..e6c907fc 100644 --- a/tests/other/pit-fib-benchmark.cpp +++ b/tests/other/pit-fib-benchmark.cpp @@ -128,7 +128,7 @@ BOOST_FIXTURE_TEST_CASE(SimpleExchanges, PitFibBenchmarkFixture) } if (i >= gap3 + gap4) { // delete PIT entry - m_pit.erase(pitEntries[i - gap3 - gap4]); + m_pit.erase(pitEntries[i - gap3 - gap4].get()); } }