Meng Chen has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/50607 )

Change subject: base-stats: Revert "base-stats: Use std vector in vector stats"
......................................................................

base-stats: Revert "base-stats: Use std vector in vector stats"

The reverted commit mistaken `storage` as an element in a std::vector.
`storage` is a vector wrapper itself originally.
The commit produce duplicated entries and wrong statistics in stat.txt.

This reverts commit 70194795c3f41cc3f1e361b3cac24f839d86dd67.

Change-Id: I4350863a83671fc10cc02b5cb7d3b38e6cf4f565
---
M src/base/statistics.hh
1 file changed, 67 insertions(+), 37 deletions(-)



diff --git a/src/base/statistics.hh b/src/base/statistics.hh
index 7714ce4..e380a87 100644
--- a/src/base/statistics.hh
+++ b/src/base/statistics.hh
@@ -1,5 +1,4 @@
 /*
- * Copyright (c) 2020 Inria
  * Copyright (c) 2019-2020 Arm Limited
  * All rights reserved.
  *
@@ -929,7 +928,8 @@

   protected:
     /** The storage of this stat. */
-    std::vector<Storage*> storage;
+    Storage *storage;
+    size_type _size;

   protected:
     /**
@@ -937,22 +937,28 @@
      * @param index The vector index to access.
      * @return The storage object at the given index.
      */
-    Storage *data(off_type index) { return storage[index]; }
+    Storage *data(off_type index) { return &storage[index]; }

     /**
      * Retrieve a const pointer to the storage.
      * @param index The vector index to access.
      * @return A const pointer to the storage object at the given index.
      */
-    const Storage *data(off_type index) const { return storage[index]; }
+    const Storage *data(off_type index) const { return &storage[index]; }

     void
     doInit(size_type s)
     {
-        fatal_if(s <= 0, "Storage size must be positive");
-        fatal_if(check(), "Stat has already been initialized");
+        assert(s > 0 && "size must be positive!");
+        assert(!storage && "already initialized");
+        _size = s;

-        storage.resize(s, new Storage(this->info()->getStorageParams()));
+        char *ptr = new char[_size * sizeof(Storage)];
+        storage = reinterpret_cast<Storage *>(ptr);
+
+        for (off_type i = 0; i < _size; ++i)
+            new (&storage[i]) Storage(this->info()->storageParams);
+
         this->setInit();
     }

@@ -993,7 +999,7 @@
     /**
      * @return the number of elements in this vector.
      */
-    size_type size() const { return storage.size(); }
+    size_type size() const { return _size; }

     bool
     zero() const
@@ -1007,7 +1013,7 @@
     bool
     check() const
     {
-        return size() > 0;
+        return storage != NULL;
     }

   public:
@@ -1015,14 +1021,17 @@
                const units::Base *unit,
                const char *desc)
         : DataWrapVec<Derived, VectorInfoProxy>(parent, name, unit, desc),
-          storage()
+          storage(nullptr), _size(0)
     {}

     ~VectorBase()
     {
-        for (auto& stor : storage) {
-            delete stor;
-        }
+        if (!storage)
+            return;
+
+        for (off_type i = 0; i < _size; ++i)
+            data(i)->~Storage();
+        delete [] reinterpret_cast<char *>(storage);
     }

     /**
@@ -1143,32 +1152,36 @@
   protected:
     size_type x;
     size_type y;
-    std::vector<Storage*> storage;
+    size_type _size;
+    Storage *storage;

   protected:
-    Storage *data(off_type index) { return storage[index]; }
-    const Storage *data(off_type index) const { return storage[index]; }
+    Storage *data(off_type index) { return &storage[index]; }
+    const Storage *data(off_type index) const { return &storage[index]; }

   public:
     Vector2dBase(Group *parent, const char *name,
                  const units::Base *unit,
                  const char *desc)
: DataWrapVec2d<Derived, Vector2dInfoProxy>(parent, name, unit, desc),
-          x(0), y(0), storage()
+          x(0), y(0), _size(0), storage(nullptr)
     {}

     ~Vector2dBase()
     {
-        for (auto& stor : storage) {
-            delete stor;
-        }
+        if (!storage)
+            return;
+
+        for (off_type i = 0; i < _size; ++i)
+            data(i)->~Storage();
+        delete [] reinterpret_cast<char *>(storage);
     }

     Derived &
     init(size_type _x, size_type _y)
     {
-        fatal_if((_x <= 0) || (_y <= 0), "Storage sizes must be positive");
-        fatal_if(check(), "Stat has already been initialized");
+        assert(_x > 0 && _y > 0 && "sizes must be positive!");
+        assert(!storage && "already initialized");

         Derived &self = this->self();
         Info *info = this->info();
@@ -1177,8 +1190,14 @@
         y = _y;
         info->x = _x;
         info->y = _y;
+        _size = x * y;

-        storage.resize(x * y, new Storage(info->getStorageParams()));
+        char *ptr = new char[_size * sizeof(Storage)];
+        storage = reinterpret_cast<Storage *>(ptr);
+
+        for (off_type i = 0; i < _size; ++i)
+            new (&storage[i]) Storage(info->storageParams);
+
         this->setInit();

         return self;
@@ -1196,7 +1215,7 @@
     size_type
     size() const
     {
-        return storage.size();
+        return _size;
     }

     bool
@@ -1247,7 +1266,7 @@
     bool
     check() const
     {
-        return size() > 0;
+        return storage != NULL;
     }
 };

@@ -1366,28 +1385,36 @@
     friend class DataWrapVec<Derived, VectorDistInfoProxy>;

   protected:
-    std::vector<Storage*> storage;
+    Storage *storage;
+    size_type _size;

   protected:
     Storage *
     data(off_type index)
     {
-        return storage[index];
+        return &storage[index];
     }

     const Storage *
     data(off_type index) const
     {
-        return storage[index];
+        return &storage[index];
     }

     void
     doInit(size_type s)
     {
-        fatal_if(s <= 0, "Storage size must be positive");
-        fatal_if(check(), "Stat has already been initialized");
+        assert(s > 0 && "size must be positive!");
+        assert(!storage && "already initialized");
+        _size = s;

-        storage.resize(s, new Storage(this->info()->getStorageParams()));
+        char *ptr = new char[_size * sizeof(Storage)];
+        storage = reinterpret_cast<Storage *>(ptr);
+
+        Info *info = this->info();
+        for (off_type i = 0; i < _size; ++i)
+            new (&storage[i]) Storage(info->storageParams);
+
         this->setInit();
     }

@@ -1396,14 +1423,17 @@
                    const units::Base *unit,
                    const char *desc)
: DataWrapVec<Derived, VectorDistInfoProxy>(parent, name, unit, desc),
-          storage()
+          storage(NULL)
     {}

     ~VectorDistBase()
     {
-        for (auto& stor : storage) {
-            delete stor;
-        }
+        if (!storage)
+            return ;
+
+        for (off_type i = 0; i < _size; ++i)
+            data(i)->~Storage();
+        delete [] reinterpret_cast<char *>(storage);
     }

     Proxy operator[](off_type index)
@@ -1415,7 +1445,7 @@
     size_type
     size() const
     {
-        return storage.size();
+        return _size;
     }

     bool
@@ -1440,7 +1470,7 @@
     bool
     check() const
     {
-        return size() > 0;
+        return storage != NULL;
     }
 };


--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/50607
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I4350863a83671fc10cc02b5cb7d3b38e6cf4f565
Gerrit-Change-Number: 50607
Gerrit-PatchSet: 1
Gerrit-Owner: Meng Chen <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to