From b41f6bde71bf32a2faf11830d302d3eb53cb68e6 Mon Sep 17 00:00:00 2001 From: arch1t3cht Date: Thu, 1 Jun 2023 23:35:20 +0200 Subject: [PATCH] Don't immediately delete unused extradata entries Instead, count how many consecutive times the entry has been found to be unused and delete it once that count exceeds a limit. This will prevent excessive reallocating of extradata ID's in applications like folding. --- src/ass_file.cpp | 10 ++++++++-- src/ass_file.h | 1 + src/ass_parser.cpp | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/ass_file.cpp b/src/ass_file.cpp index 6d36d37a5..e39e9fc1a 100644 --- a/src/ass_file.cpp +++ b/src/ass_file.cpp @@ -236,7 +236,7 @@ uint32_t AssFile::AddExtradata(std::string const& key, std::string const& value) return data.id; } } - Extradata.push_back(ExtradataEntry{next_extradata_id, key, value}); + Extradata.push_back(ExtradataEntry{next_extradata_id, 0, key, value}); return next_extradata_id++; // return old value, then post-increment } @@ -334,10 +334,16 @@ void AssFile::CleanExtradata() { } } + for (ExtradataEntry &e : Extradata) { + if (ids_used.count(e.id)) + e.expiration_counter = 0; + else + e.expiration_counter++; + } if (ids_used.size() != Extradata.size()) { // Erase all no-longer-used extradata entries Extradata.erase(std::remove_if(begin(Extradata), end(Extradata), [&](ExtradataEntry const& e) { - return !ids_used.count(e.id); + return e.expiration_counter >= 10; }), end(Extradata)); } } diff --git a/src/ass_file.h b/src/ass_file.h index 1ccbf627b..de0165148 100644 --- a/src/ass_file.h +++ b/src/ass_file.h @@ -50,6 +50,7 @@ using EntryList = typename boost::intrusive::make_listnext_extradata_id = std::max(id+1, target->next_extradata_id); - target->Extradata.push_back(ExtradataEntry{id, std::move(key), std::move(value)}); + target->Extradata.push_back(ExtradataEntry{id, 0, std::move(key), std::move(value)}); } }