From 400117e2f63aaa3523b77acb627236ec8fb9880b Mon Sep 17 00:00:00 2001 From: Yonas Habteab Date: Mon, 20 Jun 2022 14:55:18 +0200 Subject: [PATCH] ConfigItem: Don't add items to the new items vector before committing This also improves the performance a bit, as we longer have to iterate over the items and copy them into the new items vector. --- lib/config/configitem.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/lib/config/configitem.cpp b/lib/config/configitem.cpp index 6d93570ee84..d615094578a 100644 --- a/lib/config/configitem.cpp +++ b/lib/config/configitem.cpp @@ -433,11 +433,9 @@ bool ConfigItem::CommitNewItems(const ActivationContext::Ptr& context, WorkQueue << "Committing " << items.size() << " new items."; #endif /* I2_DEBUG */ - for (const auto& ip : items) - newItems.push_back(ip.first); - std::set types; std::set completed_types; + int itemsCount {0}; for (const Type::Ptr& type : Type::GetAllTypes()) { if (ConfigObject::TypeInstance->IsAssignableFrom(type)) @@ -464,7 +462,9 @@ bool ConfigItem::CommitNewItems(const ActivationContext::Ptr& context, WorkQueue continue; std::atomic committed_items(0); - upq.ParallelFor(items, [&type, &committed_items](const ItemPair& ip) { + std::mutex newItemsMutex; + + upq.ParallelFor(items, [&type, &committed_items, &newItems, &newItemsMutex](const ItemPair& ip) { const ConfigItem::Ptr& item = ip.first; if (item->m_Type != type) @@ -479,10 +479,15 @@ bool ConfigItem::CommitNewItems(const ActivationContext::Ptr& context, WorkQueue } committed_items++; + + std::unique_lock lock(newItemsMutex); + newItems.emplace_back(item); }); upq.Join(); + itemsCount += committed_items; + completed_types.insert(type); #ifdef I2_DEBUG @@ -498,7 +503,7 @@ bool ConfigItem::CommitNewItems(const ActivationContext::Ptr& context, WorkQueue #ifdef I2_DEBUG Log(LogDebug, "configitem") - << "Committed " << items.size() << " items."; + << "Committed " << itemsCount << " items."; #endif /* I2_DEBUG */ completed_types.clear();