Ciro Santilli has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/36135 )
Change subject: sim: create SERIALIZE_MAP and UNSERIALIZE_MAP
......................................................................
sim: create SERIALIZE_MAP and UNSERIALIZE_MAP
The motivation for those new methods is to prevent checkpoints from
breaking when new map entries are added.
Change-Id: I0ff8681498bcf669492e6b876ad385fda4673d77
JIRA: https://gem5.atlassian.net/browse/GEM5-661
---
M src/sim/serialize.hh
1 file changed, 57 insertions(+), 0 deletions(-)
diff --git a/src/sim/serialize.hh b/src/sim/serialize.hh
index bbc91d7..6a78e05 100644
--- a/src/sim/serialize.hh
+++ b/src/sim/serialize.hh
@@ -52,6 +52,7 @@
#include <map>
#include <stack>
#include <set>
+#include <unordered_map>
#include <vector>
#include "base/bitunion.hh"
@@ -776,6 +777,46 @@
void
objParamIn(CheckpointIn &cp, const std::string &name, SimObject * ¶m);
+/**
+ * @param names array of keys
+ * @param param array of values
+ * @param size size o fthe names and param arrays
+ *
+ * @ingroup api_serialize
+ */
+template <class T>
+void
+mapParamOut(CheckpointOut &os, const char* base,
+ const char* const names[], const T *param, unsigned size)
+{
+ for (unsigned i = 0; i < size; ++i) {
+ paramOut(os, csprintf("%s.%d", base, names[i]), param[i]);
+ }
+}
+
+/**
+ * Restore a map structure. Keys missing from the checkpoint are ignored.
+ *
+ * @ingroup api_serialize
+ */
+template <class T>
+void
+mapParamIn(CheckpointIn &os, const char* base,
+ const char* const names[], T *param, unsigned size)
+{
+ std::unordered_map<std::string, size_t> name_to_index;
+ for (size_t i = 0; i < size; i++) {
+ name_to_index[names[i]] = i;
+ }
+ for (size_t i = 0; i < size; i++) {
+ auto& key = names[i];
+ T value;
+ if (optParamIn(os, csprintf("%s.%s", base, key), value)) {
+ param[name_to_index[key]] = value;
+ }
+ }
+}
+
//
// These macros are streamlined to use in serialize/unserialize
// functions. It's assumed that serialize() has a parameter 'os' for
@@ -907,4 +948,20 @@
objptr = dynamic_cast<decltype(objptr)>(sptr); \
} while (0)
+/**
+ * \def SERIALIZE_MAP(member, names, size)
+ *
+ * @ingroup api_serialize
+ */
+#define SERIALIZE_MAP(member, names, size) \
+ mapParamOut(cp, #member, names, member, size)
+
+/**
+ * \def UNSERIALIZE_MAP(member, names, size)
+ *
+ * @ingroup api_serialize
+ */
+#define UNSERIALIZE_MAP(member, names, size) \
+ mapParamIn(cp, #member, names, member, size)
+
#endif // __SERIALIZE_HH__
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/36135
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: I0ff8681498bcf669492e6b876ad385fda4673d77
Gerrit-Change-Number: 36135
Gerrit-PatchSet: 1
Gerrit-Owner: Ciro Santilli <ciro.santi...@arm.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s