ruby: message buffer: refactor code
authorNilay Vaish <nilay@cs.wisc.edu>
Mon, 24 Feb 2014 01:16:15 +0000 (19:16 -0600)
committerNilay Vaish <nilay@cs.wisc.edu>
Mon, 24 Feb 2014 01:16:15 +0000 (19:16 -0600)
Code in two of the functions was exactly the same.  This patch moves
this code to a new function which is called from the two functions
mentioned initially.

src/mem/ruby/buffers/MessageBuffer.cc
src/mem/ruby/buffers/MessageBuffer.hh
src/mem/ruby/slicc_interface/AbstractController.hh

index 9475f151477b8eb223f876a618d89ebbf0a14651..0a7a78e8da9bd7611092b88ebdff0634d07337de 100644 (file)
@@ -281,6 +281,22 @@ MessageBuffer::recycle()
         scheduleEventAbsolute(m_receiver->clockEdge(m_recycle_latency));
 }
 
+void
+MessageBuffer::reanalyzeList(list<MsgPtr> &lt, Tick nextTick)
+{
+    while(!lt.empty()) {
+        m_msg_counter++;
+        MessageBufferNode msgNode(nextTick, m_msg_counter, lt.front());
+
+        m_prio_heap.push_back(msgNode);
+        push_heap(m_prio_heap.begin(), m_prio_heap.end(),
+                  greater<MessageBufferNode>());
+
+        m_consumer->scheduleEventAbsolute(nextTick);
+        lt.pop_front();
+    }
+}
+
 void
 MessageBuffer::reanalyzeMessages(const Address& addr)
 {
@@ -292,18 +308,7 @@ MessageBuffer::reanalyzeMessages(const Address& addr)
     // Put all stalled messages associated with this address back on the
     // prio heap
     //
-    while(!m_stall_msg_map[addr].empty()) {
-        m_msg_counter++;
-        MessageBufferNode msgNode(nextTick, m_msg_counter,
-                                  m_stall_msg_map[addr].front());
-
-        m_prio_heap.push_back(msgNode);
-        push_heap(m_prio_heap.begin(), m_prio_heap.end(),
-                  greater<MessageBufferNode>());
-
-        m_consumer->scheduleEventAbsolute(nextTick);
-        m_stall_msg_map[addr].pop_front();
-    }
+    reanalyzeList(m_stall_msg_map[addr], nextTick);
     m_stall_msg_map.erase(addr);
 }
 
@@ -318,21 +323,8 @@ MessageBuffer::reanalyzeAllMessages()
     // prio heap
     //
     for (StallMsgMapType::iterator map_iter = m_stall_msg_map.begin();
-         map_iter != m_stall_msg_map.end();
-         ++map_iter) {
-
-        while(!(map_iter->second).empty()) {
-            m_msg_counter++;
-            MessageBufferNode msgNode(nextTick, m_msg_counter,
-                                      (map_iter->second).front());
-
-            m_prio_heap.push_back(msgNode);
-            push_heap(m_prio_heap.begin(), m_prio_heap.end(),
-                      greater<MessageBufferNode>());
-
-            m_consumer->scheduleEventAbsolute(nextTick);
-            (map_iter->second).pop_front();
-        }
+         map_iter != m_stall_msg_map.end(); ++map_iter) {
+        reanalyzeList(map_iter->second, nextTick);
     }
     m_stall_msg_map.clear();
 }
index b1a9f000452a78c08f04178b2a6c3d882b14aa01..b65717e2dbd57cf8baf24e8b9c513f28ce327d91 100644 (file)
@@ -156,6 +156,9 @@ class MessageBuffer
     // This required for debugging the code.
     uint32_t functionalWrite(Packet *pkt);
 
+  private:
+    void reanalyzeList(std::list<MsgPtr> &, Tick);
+
   private:
     //added by SS
     Cycles m_recycle_latency;
@@ -172,7 +175,6 @@ class MessageBuffer
     // use a std::map for the stalled messages as this container is
     // sorted and ensures a well-defined iteration order
     typedef std::map< Address, std::list<MsgPtr> > StallMsgMapType;
-    typedef std::vector<MsgPtr>::iterator MsgListIter;
 
     StallMsgMapType m_stall_msg_map;
     std::string m_name;
index e3584fa8b8516ac88db2e5885654be68e5359fce..d6ba928fdadcccc75c7a7eec19afba051f638550 100644 (file)
@@ -137,9 +137,11 @@ class AbstractController : public ClockedObject, public Consumer
     Network* m_net_ptr;
     bool m_is_blocking;
     std::map<Address, MessageBuffer*> m_block_map;
+
     typedef std::vector<MessageBuffer*> MsgVecType;
     typedef std::map< Address, MsgVecType* > WaitingBufType;
     WaitingBufType m_waiting_buffers;
+
     unsigned int m_in_ports;
     unsigned int m_cur_in_port;
     int m_number_of_TBEs;