ruby: Statically allocate stats in SimpleNetwork, Switch, Throttle
authorJoel Hestness <jthestness@gmail.com>
Wed, 11 Sep 2013 20:33:27 +0000 (15:33 -0500)
committerJoel Hestness <jthestness@gmail.com>
Wed, 11 Sep 2013 20:33:27 +0000 (15:33 -0500)
The previous changeset (9863:9483739f83ee) used STL vector containers to
dynamically allocate stats in the Ruby SimpleNetwork, Switch and Throttle. For
gcc versions before at least 4.6.3, this causes the standard vector allocator
to call Stats copy constructors (a no-no, since stats should be allocated in
the body of each SimObject instance). Since the size of these stats arrays is
known at compile time (NOTE: after code generation), this patch changes their
allocation to be static rather than using an STL vector.

src/mem/ruby/network/simple/SimpleNetwork.cc
src/mem/ruby/network/simple/SimpleNetwork.hh
src/mem/ruby/network/simple/Switch.cc
src/mem/ruby/network/simple/Switch.hh
src/mem/ruby/network/simple/Throttle.cc
src/mem/ruby/network/simple/Throttle.hh

index 41f587d4738b9d85b2a680bbb4e73b9bc9da2663..a3848a8e325f841496973b31d43c8e6704b5944c 100644 (file)
@@ -208,9 +208,6 @@ SimpleNetwork::getThrottles(NodeID id) const
 void
 SimpleNetwork::regStats()
 {
-    m_msg_counts.resize(MessageSizeType_NUM);
-    m_msg_bytes.resize(MessageSizeType_NUM);
-
     for (MessageSizeType type = MessageSizeType_FIRST;
          type < MessageSizeType_NUM; ++type) {
         m_msg_counts[(unsigned int) type]
index 06db20c0b7a66a8abddb77d852b55cfbf68e86c2..69aeeffb70e894f206086c421aeb08aeada57d28 100644 (file)
@@ -111,8 +111,8 @@ class SimpleNetwork : public Network
     bool m_adaptive_routing;    
 
     //Statistical variables
-    std::vector<Stats::Formula> m_msg_counts;
-    std::vector<Stats::Formula> m_msg_bytes;
+    Stats::Formula m_msg_counts[MessageSizeType_NUM];
+    Stats::Formula m_msg_bytes[MessageSizeType_NUM];
 };
 
 inline std::ostream&
index c28bbdd86cb960d1653ce00e1737a0db8c85dd3f..d5c32016e7c9de1062687761ead787b6780cb46c 100644 (file)
@@ -30,7 +30,6 @@
 
 #include "base/cast.hh"
 #include "base/stl_helpers.hh"
-#include "mem/protocol/MessageSizeType.hh"
 #include "mem/ruby/buffers/MessageBuffer.hh"
 #include "mem/ruby/network/simple/PerfectSwitch.hh"
 #include "mem/ruby/network/simple/SimpleNetwork.hh"
@@ -44,8 +43,6 @@ using m5::stl_helpers::operator<<;
 Switch::Switch(const Params *p) : BasicRouter(p)
 {
     m_perfect_switch = new PerfectSwitch(m_id, this, p->virt_nets);
-    m_msg_counts.resize(MessageSizeType_NUM);
-    m_msg_bytes.resize(MessageSizeType_NUM);
 }
 
 Switch::~Switch()
index 47f4c08588c1e50fe9d7dc62cb360b47209c6c05..85f1b6d6f19b3892beac1972c5fb87ec3beeecd7 100644 (file)
@@ -43,6 +43,7 @@
 #include <vector>
 
 #include "mem/packet.hh"
+#include "mem/protocol/MessageSizeType.hh"
 #include "mem/ruby/common/TypeDefines.hh"
 #include "mem/ruby/network/BasicRouter.hh"
 #include "params/Switch.hh"
@@ -92,8 +93,8 @@ class Switch : public BasicRouter
 
     // Statistical variables
     Stats::Formula m_avg_utilization;
-    std::vector<Stats::Formula> m_msg_counts;
-    std::vector<Stats::Formula> m_msg_bytes;
+    Stats::Formula m_msg_counts[MessageSizeType_NUM];
+    Stats::Formula m_msg_bytes[MessageSizeType_NUM];
 };
 
 inline std::ostream&
index 4a5616153a631f2bcc0f45c822d97495313b6750..88b46e2528d9b30280f7557254020369f2fae035 100644 (file)
@@ -80,9 +80,6 @@ Throttle::init(NodeID node, Cycles link_latency,
 
     m_wakeups_wo_switch = 0;
 
-    m_msg_counts.resize(MessageSizeType_NUM);
-    m_msg_bytes.resize(MessageSizeType_NUM);
-
     m_link_utilization_proxy = 0;
 }
 
index b21af4d64673f8eb8df83b9bf08f6eb0b66f3259..cdc627bb79eccc538d03c9b6d8d4cf59d83d5770 100644 (file)
@@ -104,8 +104,8 @@ class Throttle : public Consumer
 
     // Statistical variables
     Stats::Scalar m_link_utilization;
-    std::vector<Stats::Vector> m_msg_counts;
-    std::vector<Stats::Formula> m_msg_bytes;
+    Stats::Vector m_msg_counts[MessageSizeType_NUM];
+    Stats::Formula m_msg_bytes[MessageSizeType_NUM];
 
     double m_link_utilization_proxy;
 };