From f5a7661c51e5de81bf8d646c74884849a8b040f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 2 Dec 2022 13:28:06 +0100 Subject: [PATCH] Add a NOOP state to reduce logspam after error --- Common/Serialize/SerializeFuncs.h | 3 ++- Common/Serialize/SerializeMap.h | 12 ++++++++---- Common/Serialize/Serializer.cpp | 11 +++++++---- Common/Serialize/Serializer.h | 7 ++++--- Core/Dialog/SavedataParam.cpp | 4 ++-- 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/Common/Serialize/SerializeFuncs.h b/Common/Serialize/SerializeFuncs.h index 0c89450c5d..c2919de799 100644 --- a/Common/Serialize/SerializeFuncs.h +++ b/Common/Serialize/SerializeFuncs.h @@ -85,7 +85,8 @@ template void DoVector(PointerWrap &p, std::vector &x, T &default_val) { u32 vec_size = (u32)x.size(); Do(p, vec_size); - x.resize(vec_size, default_val); + if (vec_size != x.size()) + x.resize(vec_size, default_val); if (vec_size > 0) DoArray(p, &x[0], vec_size); } diff --git a/Common/Serialize/SerializeMap.h b/Common/Serialize/SerializeMap.h index 9190f5067e..4e5619bdbe 100644 --- a/Common/Serialize/SerializeMap.h +++ b/Common/Serialize/SerializeMap.h @@ -38,8 +38,8 @@ void DoMap(PointerWrap &p, M &x, typename M::mapped_type &default_val) { x[first] = second; --number; } + break; } - break; case PointerWrap::MODE_WRITE: case PointerWrap::MODE_MEASURE: case PointerWrap::MODE_VERIFY: @@ -52,8 +52,10 @@ void DoMap(PointerWrap &p, M &x, typename M::mapped_type &default_val) { --number; ++itr; } + break; } - break; + case PointerWrap::MODE_NOOP: + break; } } @@ -109,8 +111,8 @@ void DoMultimap(PointerWrap &p, M &x, typename M::mapped_type &default_val) { x.insert(std::make_pair(first, second)); --number; } + break; } - break; case PointerWrap::MODE_WRITE: case PointerWrap::MODE_MEASURE: case PointerWrap::MODE_VERIFY: @@ -122,8 +124,10 @@ void DoMultimap(PointerWrap &p, M &x, typename M::mapped_type &default_val) { --number; ++itr; } + break; } - break; + case PointerWrap::MODE_NOOP: + break; } } diff --git a/Common/Serialize/Serializer.cpp b/Common/Serialize/Serializer.cpp index 54d47c0158..1070dd7a66 100644 --- a/Common/Serialize/Serializer.cpp +++ b/Common/Serialize/Serializer.cpp @@ -105,8 +105,10 @@ PointerWrapSection PointerWrap::Section(const char *title, int minVer, int ver) if (!firstBadSectionTitle_) { firstBadSectionTitle_ = title; } - WARN_LOG(SAVESTATE, "Savestate failure: wrong version %d found for section '%s'", foundVersion, title); - SetError(ERROR_FAILURE); + if (mode != MODE_NOOP) { + WARN_LOG(SAVESTATE, "Savestate failure: wrong version %d found for section '%s'", foundVersion, title); + SetError(ERROR_FAILURE); + } return PointerWrapSection(*this, -1, title); } return PointerWrapSection(*this, foundVersion, title); @@ -117,8 +119,9 @@ void PointerWrap::SetError(Error error_) { error = error_; } if (error > ERROR_WARNING) { - // For the rest of this run, just measure. - mode = PointerWrap::MODE_MEASURE; + // For the rest of this run, do nothing, to avoid running off the end of memory or something, + // and also not logspam like MEASURE will do in an error case. + mode = PointerWrap::MODE_NOOP; } } diff --git a/Common/Serialize/Serializer.h b/Common/Serialize/Serializer.h index 2c5a43ab4d..ab8500bf28 100644 --- a/Common/Serialize/Serializer.h +++ b/Common/Serialize/Serializer.h @@ -95,9 +95,10 @@ class PointerWrap public: enum Mode { MODE_READ = 1, // load - MODE_WRITE, // save - MODE_MEASURE, // calculate size - MODE_VERIFY, // compare + MODE_WRITE, // save + MODE_MEASURE, // calculate size + MODE_VERIFY, // compare + MODE_NOOP, // don't do anything. Useful to cleanly doing stuff once we've hit an error. }; enum Error { diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index 3c6c545baa..f2c7b1758c 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -1890,13 +1890,13 @@ void SavedataParam::DoState(PointerWrap &p) { Do(p, saveDataListCount); Do(p, saveNameListDataCount); if (p.mode == p.MODE_READ) { - if (saveDataList != NULL) + if (saveDataList) delete [] saveDataList; if (saveDataListCount != 0) { saveDataList = new SaveFileInfo[saveDataListCount]; DoArray(p, saveDataList, saveDataListCount); } else { - saveDataList = NULL; + saveDataList = nullptr; } } else