From e91a347a07c5e93e2b049b2b574f92c3e581773e Mon Sep 17 00:00:00 2001 From: "Admiral H. Curtiss" Date: Sat, 19 Dec 2020 18:06:15 +0100 Subject: [PATCH 1/2] Common/LinearDiskCache: Use unique_ptr instead of new/delete. --- Source/Core/Common/LinearDiskCache.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Source/Core/Common/LinearDiskCache.h b/Source/Core/Common/LinearDiskCache.h index 77feb0f473..4e9e136fa7 100644 --- a/Source/Core/Common/LinearDiskCache.h +++ b/Source/Core/Common/LinearDiskCache.h @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -72,7 +73,7 @@ public: // good header, read some key/value pairs K key; - V* value = nullptr; + std::unique_ptr value = nullptr; u32 value_size = 0; u32 entry_number = 0; @@ -82,14 +83,14 @@ public: if (next_extent > file_size) break; - delete[] value; - value = new V[value_size]; + // TODO: use make_unique_for_overwrite in C++20 + value = std::unique_ptr(new V[value_size]); // read key/value and pass to reader - if (m_file.ReadArray(&key, 1) && m_file.ReadArray(value, value_size) && + if (m_file.ReadArray(&key, 1) && m_file.ReadArray(value.get(), value_size) && m_file.ReadArray(&entry_number, 1) && entry_number == m_num_entries + 1) { - reader.Read(key, value, value_size); + reader.Read(key, value.get(), value_size); } else { @@ -100,7 +101,6 @@ public: } m_file.Clear(); - delete[] value; return m_num_entries; } From f5170dc69bc87ad8634895297a97ae1348c896ab Mon Sep 17 00:00:00 2001 From: "Admiral H. Curtiss" Date: Sat, 19 Dec 2020 18:19:40 +0100 Subject: [PATCH 2/2] Common/LinearDiskCache: Handle truncated shadercache files. --- Source/Core/Common/LinearDiskCache.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Source/Core/Common/LinearDiskCache.h b/Source/Core/Common/LinearDiskCache.h index 4e9e136fa7..43af78eb3d 100644 --- a/Source/Core/Common/LinearDiskCache.h +++ b/Source/Core/Common/LinearDiskCache.h @@ -76,6 +76,7 @@ public: std::unique_ptr value = nullptr; u32 value_size = 0; u32 entry_number = 0; + u64 last_valid_value_start = m_file.Tell(); while (m_file.ReadArray(&value_size, 1)) { @@ -90,6 +91,7 @@ public: if (m_file.ReadArray(&key, 1) && m_file.ReadArray(value.get(), value_size) && m_file.ReadArray(&entry_number, 1) && entry_number == m_num_entries + 1) { + last_valid_value_start = m_file.Tell(); reader.Read(key, value.get(), value_size); } else @@ -100,6 +102,7 @@ public: m_num_entries++; } m_file.Clear(); + m_file.Seek(last_valid_value_start, SEEK_SET); return m_num_entries; }