Checkpoint #2
diff --git a/utils/ndn-pit-queue.cc b/utils/ndn-pit-queue.cc
index 4d6c064..29551a8 100644
--- a/utils/ndn-pit-queue.cc
+++ b/utils/ndn-pit-queue.cc
@@ -26,6 +26,7 @@
#include "ns3/assert.h"
using namespace std;
+using namespace boost;
namespace ns3 {
namespace ndn {
@@ -65,10 +66,19 @@
if (queue->second->size () >= m_maxQueueSize)
return false;
- queue->second->push_back (pitEntry);
+ Queue::iterator itemIterator = queue->second->insert (queue->second->end (), pitEntry);
+
+ shared_ptr<fw::PitQueueTag> tag = pitEntry->GetFwTag<fw::PitQueueTag> ();
+ if (tag == shared_ptr<fw::PitQueueTag> ())
+ {
+ tag = make_shared<fw::PitQueueTag> ();
+ pitEntry->AddFwTag (tag);
+ }
+ tag->InsertQueue (queue->second, itemIterator);
return true;
}
+
Ptr<pit::Entry>
PitQueue::Pop ()
{
@@ -93,8 +103,17 @@
NS_ASSERT_MSG (queue->second->size () != 0, "Logic error");
Ptr<pit::Entry> entry = *queue->second->begin ();
- queue->second->pop_front ();
+ shared_ptr<fw::PitQueueTag> tag = entry->GetFwTag<fw::PitQueueTag> ();
+ NS_ASSERT (tag != shared_ptr<fw::PitQueueTag> ());
+#ifdef NS3_LOG_ENABLE
+ size_t queueSize = queue->second->size ();
+#endif
+ tag->RemoveFromQueue (queue->second);
+#ifdef NS3_LOG_ENABLE
+ NS_ASSERT_MSG (queue->second->size () == queueSize-1, "Queue size should be reduced by one");
+#endif
+
m_lastQueue = queue;
return entry;
}
@@ -107,14 +126,63 @@
m_lastQueue++;
}
- m_queues.erase (face);
+ PerInFaceQueue::iterator queue = m_queues.find (face);
+ if (queue == m_queues.end ())
+ return;
+
+ for (Queue::iterator pitEntry = queue->second->begin ();
+ pitEntry != queue->second->end ();
+ pitEntry ++)
+ {
+ shared_ptr<fw::PitQueueTag> tag = (*pitEntry)->GetFwTag<fw::PitQueueTag> ();
+ NS_ASSERT (tag != shared_ptr<fw::PitQueueTag> ());
+
+ tag->RemoveFromQueue (queue->second);
+ }
+
+ NS_ASSERT_MSG (queue->second->size () == 0, "Queue size should be 0 by now");
+ m_queues.erase (queue);
}
void
PitQueue::Remove (Ptr<pit::Entry> entry)
{
+ shared_ptr<fw::PitQueueTag> tag = entry->GetFwTag<fw::PitQueueTag> ();
+ if (tag == shared_ptr<fw::PitQueueTag> ())
+ return;
+
+ tag->RemoveFromAllQueues ();
}
+void
+fw::PitQueueTag::InsertQueue (boost::shared_ptr<PitQueue::Queue> queue, PitQueue::Queue::iterator iterator)
+{
+ pair<MapOfItems::iterator, bool> item = m_items.insert (make_pair (queue, iterator));
+ NS_ASSERT (item.second == true);
+}
+
+void
+fw::PitQueueTag::RemoveFromAllQueues ()
+{
+ for (MapOfItems::iterator item = m_items.begin ();
+ item != m_items.end ();
+ item ++)
+ {
+ item->first->erase (item->second);
+ }
+ m_items.clear ();
+}
+
+void
+fw::PitQueueTag::RemoveFromQueue (boost::shared_ptr<PitQueue::Queue> queue)
+{
+ MapOfItems::iterator item = m_items.find (queue);
+ if (item == m_items.end ())
+ return;
+
+ item->first->erase (item->second);
+ m_items.erase (item);
+}
} // namespace ndn
} // namespace ns3