Ruby: Ensure order-dependent iteration uses an ordered map
This patch fixes a bug in Ruby that caused non-deterministic simulation when changing the underlying hash map implementation. The reason is order-dependent behaviour in combination with iteration over the hash map contents. The two locations where a sorted container is assumed are now changed to make use of a std::map instead of the unordered hash map. With this change, the stats changes slightly and the follow-on changeset will update the relevant statistics.
This commit is contained in:
parent
15ca4f2fc7
commit
c9634d9b38
3 changed files with 8 additions and 4 deletions
|
@ -162,7 +162,9 @@ class MessageBuffer
|
|||
Consumer* m_consumer_ptr; // Consumer to signal a wakeup(), can be NULL
|
||||
std::vector<MessageBufferNode> m_prio_heap;
|
||||
|
||||
typedef m5::hash_map< Address, std::list<MsgPtr> > StallMsgMapType;
|
||||
// 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;
|
||||
|
|
|
@ -33,7 +33,6 @@
|
|||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
#include "base/hashmap.hh"
|
||||
#include "mem/ruby/common/Address.hh"
|
||||
#include "mem/ruby/common/Global.hh"
|
||||
|
||||
|
@ -74,7 +73,10 @@ class TimerTable
|
|||
TimerTable& operator=(const TimerTable& obj);
|
||||
|
||||
// Data Members (m_prefix)
|
||||
typedef m5::hash_map<Address, Time> AddressMap;
|
||||
|
||||
// use a std::map for the address map as this container is sorted
|
||||
// and ensures a well-defined iteration order
|
||||
typedef std::map<Address, Time> AddressMap;
|
||||
AddressMap m_map;
|
||||
mutable bool m_next_valid;
|
||||
mutable Time m_next_time; // Only valid if m_next_valid is true
|
||||
|
|
|
@ -324,7 +324,7 @@ MachineID m_machineID;
|
|||
bool m_is_blocking;
|
||||
std::map<Address, MessageBuffer*> m_block_map;
|
||||
typedef std::vector<MessageBuffer*> MsgVecType;
|
||||
typedef m5::hash_map< Address, MsgVecType* > WaitingBufType;
|
||||
typedef std::map< Address, MsgVecType* > WaitingBufType;
|
||||
WaitingBufType m_waiting_buffers;
|
||||
int m_max_in_port_rank;
|
||||
int m_cur_in_port_rank;
|
||||
|
|
Loading…
Reference in a new issue