Fix a bunch of memory leak type bugs, and add some better
authorNathan Binkert <binkertn@umich.edu>
Sat, 20 Dec 2003 21:25:48 +0000 (16:25 -0500)
committerNathan Binkert <binkertn@umich.edu>
Sat, 20 Dec 2003 21:25:48 +0000 (16:25 -0500)
checking in places to make sure stuff is behaving properly.

base/statistics.cc:
    separate the per stat check from the general stats check.
    We always want the general stuff to happen
base/statistics.hh:
    -  separate the per stat check from the general stats check.
    we always want the general stuff to happen
    -  make every stat check that its bin is at least initialized
    -  set the vector2d x and y coordinates in init to prevent an
    uninitialized memory access
test/Makefile:
    don't need sim_time.o to test stats
test/stattest.cc:
    don't make x and y the same on the 2d test so that we make
    sure that the two dimensions are correct

--HG--
extra : convert_revision : 81320325056ac1c09f6842474fb6ee3bcc030a8e

base/statistics.cc
base/statistics.hh
test/Makefile
test/stattest.cc

index 726ea3c60bc892a4c6c8da6ed8f117ae5a4c0244..81b8856ca54cc22ad0fb1d97bec3f0c1c7a6e913 100644 (file)
@@ -344,7 +344,7 @@ StatData::less(StatData *stat1, StatData *stat2)
 }
 
 bool
-StatData::check() const
+StatData::baseCheck() const
 {
     if (!init) {
 #ifdef STAT_DEBUG
index ed3278e4a98fc5f7671b7c6755bb9206dcea9396..3fc019edc521acc587cac27eb0dc8f4a6d5b3fd3 100644 (file)
@@ -184,7 +184,8 @@ struct StatData
      * use
      * @return true for success
      */
-    virtual bool check() const;
+    virtual bool check() const = 0;
+    bool baseCheck() const;
 
     /**
      * Checks if the first stat's name is alphabetically less than the second.
@@ -215,6 +216,7 @@ class ScalarData : public ScalarDataBase
     ScalarData(T &stat) : s(stat) {}
 
     virtual bool binned() const { return s.binned(); }
+    virtual bool check() const { return s.check(); }
     virtual result_t val() const { return s.val(); }
     virtual result_t total() const { return s.total(); }
     virtual void reset() { s.reset(); }
@@ -254,6 +256,7 @@ class VectorData : public VectorDataBase
     VectorData(T &stat) : s(stat) {}
 
     virtual bool binned() const { return s.binned(); }
+    virtual bool check() const { return s.check(); }
     virtual bool zero() const { return s.zero(); }
     virtual void reset() { s.reset(); }
 
@@ -309,6 +312,7 @@ class DistData : public DistDataBase
     DistData(T &stat) : s(stat) {}
 
     virtual bool binned() const { return s.binned(); }
+    virtual bool check() const { return s.check(); }
     virtual void reset() { s.reset(); }
     virtual bool zero() const { return s.zero(); }
     virtual void update() { return s.update(this); }
@@ -348,6 +352,7 @@ class VectorDistData : public VectorDistDataBase
     VectorDistData(T &stat) : s(stat) {}
 
     virtual bool binned() const { return T::bin_t::binned; }
+    virtual bool check() const { return s.check(); }
     virtual void reset() { s.reset(); }
     virtual size_t size() const { return s.size(); }
     virtual bool zero() const { return s.zero(); }
@@ -388,12 +393,13 @@ class Vector2dData : public Vector2dDataBase
     Vector2dData(T &stat) : s(stat) {}
 
     virtual bool binned() const { return T::bin_t::binned; }
+    virtual bool check() const { return s.check(); }
     virtual void reset() { s.reset(); }
     virtual bool zero() const { return s.zero(); }
     virtual void update()
     {
         Vector2dDataBase::update();
-        return s.update(this);
+        s.update(this);
     }
 };
 
@@ -854,6 +860,8 @@ class ScalarBase : public DataAccess
      */
     bool binned() const { return bin_t::binned; }
 
+    bool check() const { return bin.initialized(); }
+
     /**
      * Reset stat value to default
      */
@@ -963,7 +971,7 @@ class VectorBase : public DataAccess
         return false;
     }
 
-    bool check() const { return true; }
+    bool check() const { return bin.initialized(); }
     void reset() { bin.reset(); }
 
   public:
@@ -1167,8 +1175,6 @@ class Vector2dBase : public DataAccess
 
     void update(Vector2dDataBase *data)
     {
-        data->x = x;
-        data->y = y;
         int size = this->size();
         data->vec.resize(size);
         for (int i = 0; i < size; ++i)
@@ -1188,7 +1194,7 @@ class Vector2dBase : public DataAccess
      */
     void reset() { bin.reset(); }
 
-    bool check() { return true; }
+    bool check() { return bin.initialized(); }
 };
 
 template <typename T, template <typename T> class Storage, class Bin>
@@ -1665,7 +1671,7 @@ class DistBase : public DataAccess
         bin.reset();
     }
 
-    bool check() { return true; }
+    bool check() { return bin.initialized(); }
 };
 
 template <typename T, template <typename T> class Storage, class Bin>
@@ -1718,7 +1724,7 @@ class VectorDistBase : public DataAccess
      */
     void reset() { bin.reset(); }
 
-    bool check() { return true; }
+    bool check() { return bin.initialized(); }
     void update(VectorDistDataBase *base)
     {
         int size = this->size();
@@ -2509,8 +2515,8 @@ class Vector2d : public WrapVec2d<Vector2d<T, Bin>, Vector2dBase<T, StatStor, Bi
 {
   public:
     Vector2d &init(size_t _x, size_t _y) {
-        x = _x;
-        y = _y;
+        statData()->x = x = _x;
+        statData()->y = y = _y;
         bin.init(x * y, params);
         setInit();
 
@@ -2732,6 +2738,8 @@ class FormulaBase : public DataAccess
      */
     bool binned() const;
 
+    bool check() const { return true; }
+
     /**
      * Formulas don't need to be reset
      */
index 29d252df4d1984d940fd648078f81483f4dcd9aa..ceb3c9a1c9aca0444bceb43f265a3fba16192cca 100644 (file)
@@ -52,7 +52,7 @@ offtest: offtest.o
 rangetest: rangetest.o str.o
        $(CXX) $(LFLAGS) -o $@ $^
 
-stattest: cprintf.o hostinfo.o misc.o sim_time.o statistics.o stattest.o str.o
+stattest: cprintf.o hostinfo.o misc.o statistics.o stattest.o str.o
        $(CXX) $(LFLAGS) -o $@ $^
 
 strnumtest: strnumtest.o str.o
index dea5295cc968cbf5f6b0308ffa387bbeacca1217..7c171be80060fffeabcab4132d51ba4821075310 100644 (file)
@@ -115,7 +115,7 @@ main(int argc, char *argv[])
     s13.init(4, 0, 99, 10);
     s14.init(9);
     s15.init(10);
-    s16.init(2, 2);
+    s16.init(2, 9);
 
     s1
         .name("Stat01")
@@ -271,6 +271,11 @@ main(int argc, char *argv[])
     s16[0][0] = 2;
     s16[1][1] = 9;
     s16[1][1] += 9;
+    s16[1][8] += 8;
+    s16[1][7] += 7;
+    s16[1][6] += 6;
+    s16[1][5] += 5;
+    s16[1][4] += 4;
 
     s11 = 1;
     s3 = 9;