summaryrefslogtreecommitdiff
path: root/src/mem/ruby/network/MessageBuffer.cc
diff options
context:
space:
mode:
authorNilay Vaish <nilay@cs.wisc.edu>2015-07-04 10:43:46 -0500
committerNilay Vaish <nilay@cs.wisc.edu>2015-07-04 10:43:46 -0500
commitb4efb48a71c42085134e57840aa9562884404d11 (patch)
tree0626bf3d54745737f3553fcf0a6a931813e441e6 /src/mem/ruby/network/MessageBuffer.cc
parent25e1b1c1f5f4e0ad3976c88998161700135f4aae (diff)
downloadgem5-b4efb48a71c42085134e57840aa9562884404d11.tar.xz
ruby: remove message buffer node
This structure's only purpose was to provide a comparison function for ordering messages in the MessageBuffer. The comparison function is now being moved to the Message class itself. So we no longer require this structure.
Diffstat (limited to 'src/mem/ruby/network/MessageBuffer.cc')
-rw-r--r--src/mem/ruby/network/MessageBuffer.cc43
1 files changed, 21 insertions, 22 deletions
diff --git a/src/mem/ruby/network/MessageBuffer.cc b/src/mem/ruby/network/MessageBuffer.cc
index 99879a1b6..7353c51c5 100644
--- a/src/mem/ruby/network/MessageBuffer.cc
+++ b/src/mem/ruby/network/MessageBuffer.cc
@@ -122,7 +122,7 @@ MessageBuffer::peek() const
DPRINTF(RubyQueue, "Peeking at head of queue.\n");
assert(isReady());
- const Message* msg_ptr = m_prio_heap.front().m_msgptr.get();
+ const Message* msg_ptr = m_prio_heap.front().get();
assert(msg_ptr);
DPRINTF(RubyQueue, "Message: %s\n", (*msg_ptr));
@@ -204,12 +204,11 @@ MessageBuffer::enqueue(MsgPtr message, Cycles delta)
msg_ptr->updateDelayedTicks(m_sender->clockEdge());
msg_ptr->setLastEnqueueTime(arrival_time);
+ msg_ptr->setMsgCounter(m_msg_counter);
// Insert the message into the priority heap
- MessageBufferNode thisNode(arrival_time, m_msg_counter, message);
- m_prio_heap.push_back(thisNode);
- push_heap(m_prio_heap.begin(), m_prio_heap.end(),
- greater<MessageBufferNode>());
+ m_prio_heap.push_back(message);
+ push_heap(m_prio_heap.begin(), m_prio_heap.end(), greater<MsgPtr>());
DPRINTF(RubyQueue, "Enqueue arrival_time: %lld, Message: %s\n",
arrival_time, *(message.get()));
@@ -227,7 +226,7 @@ MessageBuffer::dequeue()
assert(isReady());
// get MsgPtr of the message about to be dequeued
- MsgPtr message = m_prio_heap.front().m_msgptr;
+ MsgPtr message = m_prio_heap.front();
// get the delay cycles
message->updateDelayedTicks(m_receiver->clockEdge());
@@ -242,7 +241,7 @@ MessageBuffer::dequeue()
}
pop_heap(m_prio_heap.begin(), m_prio_heap.end(),
- greater<MessageBufferNode>());
+ greater<MsgPtr>());
m_prio_heap.pop_back();
return delayCycles;
@@ -265,14 +264,12 @@ MessageBuffer::recycle()
{
DPRINTF(RubyQueue, "Recycling.\n");
assert(isReady());
- MessageBufferNode node = m_prio_heap.front();
- pop_heap(m_prio_heap.begin(), m_prio_heap.end(),
- greater<MessageBufferNode>());
+ MsgPtr node = m_prio_heap.front();
+ pop_heap(m_prio_heap.begin(), m_prio_heap.end(), greater<MsgPtr>());
- node.m_time = m_receiver->clockEdge(m_recycle_latency);
+ node->setLastEnqueueTime(m_receiver->clockEdge(m_recycle_latency));
m_prio_heap.back() = node;
- push_heap(m_prio_heap.begin(), m_prio_heap.end(),
- greater<MessageBufferNode>());
+ push_heap(m_prio_heap.begin(), m_prio_heap.end(), greater<MsgPtr>());
m_consumer->
scheduleEventAbsolute(m_receiver->clockEdge(m_recycle_latency));
}
@@ -282,11 +279,13 @@ MessageBuffer::reanalyzeList(list<MsgPtr> &lt, Tick nextTick)
{
while(!lt.empty()) {
m_msg_counter++;
- MessageBufferNode msgNode(nextTick, m_msg_counter, lt.front());
+ MsgPtr m = lt.front();
+ m->setLastEnqueueTime(nextTick);
+ m->setMsgCounter(m_msg_counter);
- m_prio_heap.push_back(msgNode);
+ m_prio_heap.push_back(m);
push_heap(m_prio_heap.begin(), m_prio_heap.end(),
- greater<MessageBufferNode>());
+ greater<MsgPtr>());
m_consumer->scheduleEventAbsolute(nextTick);
lt.pop_front();
@@ -331,7 +330,7 @@ MessageBuffer::stallMessage(const Address& addr)
DPRINTF(RubyQueue, "Stalling due to %s\n", addr);
assert(isReady());
assert(addr.getOffset() == 0);
- MsgPtr message = m_prio_heap.front().m_msgptr;
+ MsgPtr message = m_prio_heap.front();
dequeue();
@@ -351,8 +350,8 @@ MessageBuffer::print(ostream& out) const
ccprintf(out, " consumer-yes ");
}
- vector<MessageBufferNode> copy(m_prio_heap);
- sort_heap(copy.begin(), copy.end(), greater<MessageBufferNode>());
+ vector<MsgPtr> copy(m_prio_heap);
+ sort_heap(copy.begin(), copy.end(), greater<MsgPtr>());
ccprintf(out, "%s] %s", copy, m_name);
}
@@ -360,7 +359,7 @@ bool
MessageBuffer::isReady() const
{
return ((m_prio_heap.size() > 0) &&
- (m_prio_heap.front().m_time <= m_receiver->clockEdge()));
+ (m_prio_heap.front()->getLastEnqueueTime() <= m_receiver->clockEdge()));
}
bool
@@ -369,7 +368,7 @@ MessageBuffer::functionalRead(Packet *pkt)
// Check the priority heap and read any messages that may
// correspond to the address in the packet.
for (unsigned int i = 0; i < m_prio_heap.size(); ++i) {
- Message *msg = m_prio_heap[i].m_msgptr.get();
+ Message *msg = m_prio_heap[i].get();
if (msg->functionalRead(pkt)) return true;
}
@@ -397,7 +396,7 @@ MessageBuffer::functionalWrite(Packet *pkt)
// Check the priority heap and write any messages that may
// correspond to the address in the packet.
for (unsigned int i = 0; i < m_prio_heap.size(); ++i) {
- Message *msg = m_prio_heap[i].m_msgptr.get();
+ Message *msg = m_prio_heap[i].get();
if (msg->functionalWrite(pkt)) {
num_functional_writes++;
}