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();