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");