Daniel Carvalho has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/27085 )
Change subject: base: Use std vector in vector stats
......................................................................
base: Use std vector in vector stats
Use std::vector in vector based stats to avoid data management.
Change-Id: I6b341f03e4861a5b8f80fa8741373065b7c755bf
Signed-off-by: Daniel R. Carvalho <oda...@yahoo.com.br>
---
M src/base/statistics.hh
1 file changed, 41 insertions(+), 70 deletions(-)
diff --git a/src/base/statistics.hh b/src/base/statistics.hh
index c3f7ebc..89e80b2 100644
--- a/src/base/statistics.hh
+++ b/src/base/statistics.hh
@@ -1,4 +1,5 @@
/*
+ * Copyright (c) 2020 Inria
* Copyright (c) 2019 Arm Limited
* All rights reserved.
*
@@ -72,14 +73,15 @@
#include <string>
#include <vector>
+#include "base/cast.hh"
+#include "base/cprintf.hh"
+#include "base/intmath.hh"
+#include "base/logging.hh"
#include "base/stats/group.hh"
#include "base/stats/info.hh"
#include "base/stats/output.hh"
#include "base/stats/storage.hh"
#include "base/stats/types.hh"
-#include "base/cast.hh"
-#include "base/cprintf.hh"
-#include "base/intmath.hh"
#include "base/str.hh"
#include "base/types.hh"
@@ -865,8 +867,7 @@
protected:
/** The storage of this stat. */
- Storage *storage;
- size_type _size;
+ std::vector<Storage*> storage;
protected:
/**
@@ -874,28 +875,22 @@
* @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)
{
- assert(s > 0 && "size must be positive!");
- assert(!storage && "already initialized");
- _size = s;
+ fatal_if(s <= 0, "Storage size must be positive");
+ fatal_if(check(), "Stat has already been initialized");
- 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);
-
+ storage.resize(s, new Storage(this->info()->storageParams));
this->setInit();
}
@@ -936,7 +931,7 @@
/**
* @return the number of elements in this vector.
*/
- size_type size() const { return _size; }
+ size_type size() const { return storage.size(); }
bool
zero() const
@@ -950,23 +945,20 @@
bool
check() const
{
- return storage != NULL;
+ return size() > 0;
}
public:
VectorBase(Group *parent, const char *name, const char *desc)
: DataWrapVec<Derived, VectorInfoProxy>(parent, name, desc),
- storage(nullptr), _size(0)
+ storage()
{}
~VectorBase()
{
- if (!storage)
- return;
-
- for (off_type i = 0; i < _size; ++i)
- data(i)->~Storage();
- delete [] reinterpret_cast<char *>(storage);
+ for (auto& stor : storage) {
+ delete stor;
+ }
}
/**
@@ -1087,34 +1079,30 @@
protected:
size_type x;
size_type y;
- size_type _size;
- Storage *storage;
+ std::vector<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 char *desc)
: DataWrapVec2d<Derived, Vector2dInfoProxy>(parent, name, desc),
- x(0), y(0), _size(0), storage(nullptr)
+ x(0), y(0), storage()
{}
~Vector2dBase()
{
- if (!storage)
- return;
-
- for (off_type i = 0; i < _size; ++i)
- data(i)->~Storage();
- delete [] reinterpret_cast<char *>(storage);
+ for (auto& stor : storage) {
+ delete stor;
+ }
}
Derived &
init(size_type _x, size_type _y)
{
- assert(_x > 0 && _y > 0 && "sizes must be positive!");
- assert(!storage && "already initialized");
+ fatal_if((_x <= 0) || (_y <= 0), "Storage sizes must be positive");
+ fatal_if(check(), "Stat has already been initialized");
Derived &self = this->self();
Info *info = this->info();
@@ -1123,14 +1111,8 @@
y = _y;
info->x = _x;
info->y = _y;
- _size = x * y;
- 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);
-
+ storage.resize(x * y, new Storage(info->storageParams));
this->setInit();
return self;
@@ -1148,7 +1130,7 @@
size_type
size() const
{
- return _size;
+ return storage.size();
}
bool
@@ -1199,7 +1181,7 @@
bool
check() const
{
- return storage != NULL;
+ return size() > 0;
}
};
@@ -1316,53 +1298,42 @@
friend class DataWrapVec<Derived, VectorDistInfoProxy>;
protected:
- Storage *storage;
- size_type _size;
+ std::vector<Storage*> storage;
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)
{
- assert(s > 0 && "size must be positive!");
- assert(!storage && "already initialized");
- _size = s;
+ fatal_if(s <= 0, "Storage size must be positive");
+ fatal_if(check(), "Stat has already been initialized");
- 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);
-
+ storage.resize(s, new Storage(this->info()->storageParams));
this->setInit();
}
public:
VectorDistBase(Group *parent, const char *name, const char *desc)
: DataWrapVec<Derived, VectorDistInfoProxy>(parent, name, desc),
- storage(NULL)
+ storage()
{}
~VectorDistBase()
{
- if (!storage)
- return ;
-
- for (off_type i = 0; i < _size; ++i)
- data(i)->~Storage();
- delete [] reinterpret_cast<char *>(storage);
+ for (auto& stor : storage) {
+ delete stor;
+ }
}
Proxy operator[](off_type index)
@@ -1374,7 +1345,7 @@
size_type
size() const
{
- return _size;
+ return storage.size();
}
bool
@@ -1399,7 +1370,7 @@
bool
check() const
{
- return storage != NULL;
+ return size() > 0;
}
};
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/27085
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: I6b341f03e4861a5b8f80fa8741373065b7c755bf
Gerrit-Change-Number: 27085
Gerrit-PatchSet: 1
Gerrit-Owner: Daniel Carvalho <oda...@yahoo.com.br>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list
gem5-dev@gem5.org
http://m5sim.org/mailman/listinfo/gem5-dev