fw: invoke FaceTable::remove upon Face::onFail
refs #1358
Change-Id: Ic19a88f0aea5adefbd3179de09f9f4e049922ff8
diff --git a/daemon/fw/face-table.cpp b/daemon/fw/face-table.cpp
index a3013f6..1ed79ad 100644
--- a/daemon/fw/face-table.cpp
+++ b/daemon/fw/face-table.cpp
@@ -31,9 +31,11 @@
NFD_LOG_INFO("addFace id=" << faceId);
face->onReceiveInterest += bind(&Forwarder::onInterest,
- &m_forwarder, boost::ref(*face), _1);
+ &m_forwarder, boost::ref(*face), _1);
face->onReceiveData += bind(&Forwarder::onData,
- &m_forwarder, boost::ref(*face), _1);
+ &m_forwarder, boost::ref(*face), _1);
+ face->onFail += bind(&FaceTable::remove,
+ this, face);
}
void
@@ -48,6 +50,7 @@
// does not support only removing Forwarder's subscription
face->onReceiveInterest.clear();
face->onReceiveData .clear();
+ // don't clear onFail because other functions may need to execute
m_forwarder.getFib().removeNextHopFromAllEntries(face);
}
diff --git a/daemon/fw/face-table.hpp b/daemon/fw/face-table.hpp
index 2415568..2af2b6b 100644
--- a/daemon/fw/face-table.hpp
+++ b/daemon/fw/face-table.hpp
@@ -29,9 +29,6 @@
VIRTUAL_WITH_TESTS void
add(shared_ptr<Face> face);
- VIRTUAL_WITH_TESTS void
- remove(shared_ptr<Face> face);
-
VIRTUAL_WITH_TESTS shared_ptr<Face>
get(FaceId id) const;
@@ -52,6 +49,12 @@
end() const;
private:
+ // remove is private because it's a subscriber of face.onFail event.
+ // face->close() closes a face and would trigger .remove(face)
+ void
+ remove(shared_ptr<Face> face);
+
+private:
Forwarder& m_forwarder;
FaceId m_lastFaceId;
FaceMap m_faces;
diff --git a/daemon/fw/forwarder.hpp b/daemon/fw/forwarder.hpp
index 2d4d325..62612f2 100644
--- a/daemon/fw/forwarder.hpp
+++ b/daemon/fw/forwarder.hpp
@@ -53,13 +53,6 @@
void
addFace(shared_ptr<Face> face);
- /** \brief remove existing Face
- *
- * shortcut to .getFaceTable().remove(face)
- */
- void
- removeFace(shared_ptr<Face> face);
-
public: // forwarding entrypoints and tables
void
onInterest(Face& face, const Interest& interest);
@@ -188,12 +181,6 @@
}
inline void
-Forwarder::removeFace(shared_ptr<Face> face)
-{
- m_faceTable.remove(face);
-}
-
-inline void
Forwarder::onInterest(Face& face, const Interest& interest)
{
this->onIncomingInterest(face, interest);
diff --git a/daemon/mgmt/face-manager.cpp b/daemon/mgmt/face-manager.cpp
index bf31a10..6407237 100644
--- a/daemon/mgmt/face-manager.cpp
+++ b/daemon/mgmt/face-manager.cpp
@@ -632,7 +632,7 @@
shared_ptr<Face> target = m_faceTable.get(options.getFaceId());
if (target)
{
- m_faceTable.remove(target);
+ // don't call m_faceTable.remove(target): it's called by target->close() via onFail
target->close();
}
sendResponse(requestName, 200, "Success");