fw: FaceTable signals use Face& instead of shared_ptr
refs #3205
Change-Id: I53ecd0d6a13d379eb1dfb872041bdde8501f05e7
diff --git a/daemon/fw/access-strategy.cpp b/daemon/fw/access-strategy.cpp
index 90feaff..69c1a39 100644
--- a/daemon/fw/access-strategy.cpp
+++ b/daemon/fw/access-strategy.cpp
@@ -272,9 +272,9 @@
}
void
-AccessStrategy::removeFaceInfo(shared_ptr<Face> face)
+AccessStrategy::removeFaceInfo(const Face& face)
{
- m_fit.erase(face->getId());
+ m_fit.erase(face.getId());
}
} // namespace fw
diff --git a/daemon/fw/access-strategy.hpp b/daemon/fw/access-strategy.hpp
index ca7a2e3..02a7965 100644
--- a/daemon/fw/access-strategy.hpp
+++ b/daemon/fw/access-strategy.hpp
@@ -123,7 +123,7 @@
typedef std::unordered_map<FaceId, FaceInfo> FaceInfoTable;
void
- removeFaceInfo(shared_ptr<Face> face);
+ removeFaceInfo(const Face& face);
private: // forwarding procedures
void
diff --git a/daemon/fw/face-table.cpp b/daemon/fw/face-table.cpp
index 2d40bbc..ef5b916 100644
--- a/daemon/fw/face-table.cpp
+++ b/daemon/fw/face-table.cpp
@@ -93,26 +93,29 @@
face->afterReceiveInterest.connect(bind(&Forwarder::startProcessInterest, &m_forwarder, ref(*face), _1));
face->afterReceiveData.connect(bind(&Forwarder::startProcessData, &m_forwarder, ref(*face), _1));
face->afterReceiveNack.connect(bind(&Forwarder::startProcessNack, &m_forwarder, ref(*face), _1));
- connectFaceClosedSignal(*face, bind(&FaceTable::remove, this, face));
+ connectFaceClosedSignal(*face, bind(&FaceTable::remove, this, faceId));
- this->afterAdd(face);
+ this->afterAdd(*face);
}
void
-FaceTable::remove(shared_ptr<Face> face)
+FaceTable::remove(FaceId faceId)
{
- this->beforeRemove(face);
+ auto i = m_faces.find(faceId);
+ BOOST_ASSERT(i != m_faces.end());
+ shared_ptr<Face> face = i->second;
- FaceId faceId = face->getId();
- m_faces.erase(faceId);
+ this->beforeRemove(*face);
+
+ m_forwarder.getFib().removeNextHopFromAllEntries(*face);
+
+ m_faces.erase(i);
face->setId(face::INVALID_FACEID);
NFD_LOG_INFO("Removed face id=" << faceId <<
" remote=" << face->getRemoteUri() <<
" local=" << face->getLocalUri());
- m_forwarder.getFib().removeNextHopFromAllEntries(*face);
-
// defer Face deallocation, so that Transport isn't deallocated during afterStateChange signal
getGlobalIoService().post([face] {});
}
diff --git a/daemon/fw/face-table.hpp b/daemon/fw/face-table.hpp
index c8f93d0..7da4aff 100644
--- a/daemon/fw/face-table.hpp
+++ b/daemon/fw/face-table.hpp
@@ -53,7 +53,7 @@
VIRTUAL_WITH_TESTS void
add(shared_ptr<Face> face);
- /** \brief add a special Face with a reserved FaceId
+ /** \brief add a special face with a reserved FaceId
*/
VIRTUAL_WITH_TESTS void
addReserved(shared_ptr<Face> face, FaceId faceId);
@@ -86,22 +86,22 @@
end() const;
public: // signals
- /** \brief fires after a Face is added
+ /** \brief fires after a face is added
*/
- signal::Signal<FaceTable, shared_ptr<Face>> afterAdd;
+ signal::Signal<FaceTable, Face&> afterAdd;
- /** \brief fires before a Face is removed
+ /** \brief fires before a face is removed
*
- * FaceId is valid when this event is fired
+ * When this signal is emitted, face is still in FaceTable and has valid FaceId.
*/
- signal::Signal<FaceTable, shared_ptr<Face>> beforeRemove;
+ signal::Signal<FaceTable, Face&> beforeRemove;
private:
void
addImpl(shared_ptr<Face> face, FaceId faceId);
void
- remove(shared_ptr<Face> face);
+ remove(FaceId faceId);
ForwardRange
getForwardRange() const;
diff --git a/daemon/fw/strategy.hpp b/daemon/fw/strategy.hpp
index bc8c348..4f51f3b 100644
--- a/daemon/fw/strategy.hpp
+++ b/daemon/fw/strategy.hpp
@@ -178,8 +178,8 @@
getFaceTable() const;
protected: // accessors
- signal::Signal<FaceTable, shared_ptr<Face>>& afterAddFace;
- signal::Signal<FaceTable, shared_ptr<Face>>& beforeRemoveFace;
+ signal::Signal<FaceTable, Face&>& afterAddFace;
+ signal::Signal<FaceTable, Face&>& beforeRemoveFace;
private:
Name m_name;