stats: track if the stats have been enabled and prevent requesting master id
authorAli Saidi <Ali.Saidi@ARM.com>
Thu, 10 May 2012 23:04:26 +0000 (18:04 -0500)
committerAli Saidi <Ali.Saidi@ARM.com>
Thu, 10 May 2012 23:04:26 +0000 (18:04 -0500)
Track the point in the initialization where statistics have been registered.
After this point registering new masterIds can no longer work as some
SimObjects may have sized stats vectors based on the previous value. If someone
tries to register a masterId after this point the simulator executes fatal().

src/base/statistics.cc
src/base/statistics.hh
src/python/m5/stats/__init__.py
src/python/swig/stats.i
src/sim/system.cc

index e3f3ad78b3c06eef0db056cea28df1488e826ad5..545d08cabeb89a8d5417f72cdf75067faa95dd29 100644 (file)
@@ -441,6 +441,23 @@ registerResetCallback(Callback *cb)
     resetQueue.add(cb);
 }
 
+bool _enabled = false;
+
+bool
+enabled()
+{
+    return _enabled;
+}
+
+void
+enable()
+{
+    if (_enabled)
+        fatal("Stats are already enabled");
+
+    _enabled = true;
+}
+
 } // namespace Stats
 
 void
index 1f8a5932643a4a14435ff5160dfde4266df8d147..cb63af7082b5e193040ea949e727fbf0ac0efc5f 100644 (file)
@@ -3126,6 +3126,8 @@ sum(Temp val)
 /** Dump all statistics data to the registered outputs */
 void dump();
 void reset();
+void enable();
+bool enabled();
 
 /**
  * Register a callback that should be called whenever statistics are
index 9b5af84fbae3a5e6450e0cf81ca54852b9ef2aa0..1d7e3bc5d2284bb9ed832f9032f6c75459dd003e 100644 (file)
@@ -82,6 +82,8 @@ def enable():
         stats_dict[stat.name] = stat
         stat.enable()
 
+    internal.stats.enable();
+
 def prepare():
     '''Prepare all stats for data access.  This must be done before
     dumping and serialization.'''
index 87810d305887195172953a4161b9d26848e6547a..14a6966b127a3d07c6ba7f1bb0990bb1d92150b6 100644 (file)
@@ -146,6 +146,8 @@ void schedStatEvent(bool dump, bool reset,
                     Tick when = curTick(), Tick repeat = 0);
 
 void processResetQueue();
+void enable();
+bool enabled();
 
 std::list<Info *> &statsList();
 
index 40f5ea0ced10d697cedee042a057a72d6266479f..815a4cf1cd60a635386385475cb3c5f6a7e4c5de 100644 (file)
@@ -410,10 +410,11 @@ System::getMasterId(std::string master_name)
         }
     }
 
-    // todo: Check if stats are enabled yet
-    // I just don't know a good way to do it
+    // Verify that the statistics haven't been enabled yet
+    // Otherwise objects will have sized their stat buckets and
+    // they will be too small
 
-    if (false)
+    if (Stats::enabled())
         fatal("Can't request a masterId after regStats(). \
                 You must do so in init().\n");