Skip to content

Commit

Permalink
Fix race condition when concurrently adding to SCRExtensionRegistry (#…
Browse files Browse the repository at this point in the history
…870)

* Fix race condition when concurrently adding to SCRExtensionRegistry

Fixed a race that can happen when multiple threads are trying to add to the extension registry container.

Fixed a bug with the tests for SCRExtensionRegsitry class never being compiled and run.

Signed-off-by: The MathWorks, Inc. <jdicleme@mathworks.com>
  • Loading branch information
jeffdiclemente committed Jun 21, 2023
1 parent f244220 commit 44e1481
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 110 deletions.
10 changes: 6 additions & 4 deletions compendium/DeclarativeServices/src/SCRExtensionRegistry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ namespace cppmicroservices
{
namespace scrimpl
{
SCRExtensionRegistry::SCRExtensionRegistry(std::shared_ptr<SCRLogger> logger)
SCRExtensionRegistry::SCRExtensionRegistry(std::shared_ptr<cppmicroservices::logservice::LogService> logger)
: logger(std::move(logger))
{
if (!(this->logger))
Expand All @@ -49,11 +49,13 @@ namespace cppmicroservices
void
SCRExtensionRegistry::Add(long bundleId, std::shared_ptr<SCRBundleExtension> extension)
{
if (!extension) {
if (!extension)
{
throw std::invalid_argument("SCRExtensionRegistry::Add invalid extension");
}
if (extensionRegistry.find(bundleId) == extensionRegistry.end()){
std::lock_guard<std::mutex> l(extensionRegMutex);
std::lock_guard<std::mutex> l(extensionRegMutex);
if (extensionRegistry.find(bundleId) == extensionRegistry.end())
{
extensionRegistry.insert(std::make_pair(bundleId, std::move(extension)));
}
}
Expand Down
6 changes: 3 additions & 3 deletions compendium/DeclarativeServices/src/SCRExtensionRegistry.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
#define __CPPMICROSERVICES_SCRIMPL_SCREXTENSIONREGISTRY_HPP__

#include "SCRBundleExtension.hpp"
#include "SCRLogger.hpp"
#include "cppmicroservices/logservice/LogService.hpp"

#include <map>
#include <memory>
Expand All @@ -46,7 +46,7 @@ namespace cppmicroservices
/**
* @throws std::invalid_argument exception if any of the params is a nullptr
*/
SCRExtensionRegistry(std::shared_ptr<SCRLogger> logger);
SCRExtensionRegistry(std::shared_ptr<cppmicroservices::logservice::LogService> logger);

SCRExtensionRegistry(SCRExtensionRegistry const&) = delete;
SCRExtensionRegistry(SCRExtensionRegistry&&) = delete;
Expand Down Expand Up @@ -93,7 +93,7 @@ namespace cppmicroservices
void Clear();

private:
std::shared_ptr<SCRLogger> logger;
std::shared_ptr<cppmicroservices::logservice::LogService> logger;
std::mutex extensionRegMutex; //protects the extensionRegistry
std::unordered_map<long,std::shared_ptr<SCRBundleExtension>> extensionRegistry;
};
Expand Down
1 change: 1 addition & 0 deletions compendium/DeclarativeServices/test/gtest/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ set(_declarativeservices_tests
TestReferenceSelfSatisfyDeadLock.cpp
TestRegistrationManager.cpp
TestSCRBundleExtension.cpp
TestSCRExtensionRegistry.cpp
TestServiceComponentRuntimeImpl.cpp
TestServiceMetadataParserV1.cpp
TestSetConfiguration.cpp
Expand Down
140 changes: 37 additions & 103 deletions compendium/DeclarativeServices/test/gtest/TestSCRExtensionRegistry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#include <cppmicroservices/Framework.h>
#include <cppmicroservices/FrameworkEvent.h>
#include <cppmicroservices/FrameworkFactory.h>
#include "ConcurrencyTestUtil.hpp"
#include "gmock/gmock.h"
#include "Mocks.hpp"

Expand Down Expand Up @@ -73,66 +74,6 @@ namespace cppmicroservices
return framework;
}

void
ConcurrentInvoke(std::vector<cppmicroservices::Bundle> allBundles, bool addOperation)
{
std::promise<void> go;
std::shared_future<void> ready(go.get_future());
int numCalls = allBundles.size();
std::vector<std::promise<void>> readies(numCalls);
std::vector<std::future<void>> bundle_result(numCalls);
try
{
if (addOperation)
{
for (int i = 0; i < numCalls; i++)
{

bundle_result[i]
= std::async(std::launch::async,
[&readies, &ready, &allBundles, this, i]()
{
readies[i].set_value();
ready.wait();
auto ba = std::make_shared<SCRBundleExtension>(allBundles[i],
this->fakeRegistry,
this->logger,
this->notifier);
extRegistry->Add(allBundles[i].GetBundleId(), ba);
});
}
}
else // remove operation
{
for (int i = 0; i < numCalls; i++)
{
bundle_result[i] = std::async(std::launch::async,
[&readies, &ready, &allBundles, this, i]()
{
readies[i].set_value();
ready.wait();
this->extRegistry->Remove(allBundles[i].GetBundleId());
});
}
}

for (int i = 0; i < numCalls; i++)
{
readies[i].get_future().wait();
}
go.set_value();
for (int i = 0; i < numCalls; i++)
{
bundle_result[i].wait();
}
}
catch (std::exception const& e)
{
EXPECT_TRUE(false) << "Error: exception received ... " << e.what() << std::endl;
go.set_value();
throw std::current_exception();
}
}
protected:
cppmicroservices::Framework framework;
std::shared_ptr<ComponentRegistry> fakeRegistry;
Expand Down Expand Up @@ -185,78 +126,71 @@ namespace cppmicroservices
asyncWorkService->StopTracking();
fakeRegistry->Clear();
}
// Test to test concurrent additions of bundle extensions to the SCRExtensionRegistry and
// Test concurrent additions of bundle extensions to the SCRExtensionRegistry and
// concurrent removals.
TEST_F(SCRExtensionRegistryTest, VerifyConcurrentAddRemove)
{
int count = 4;
test::InstallAndStartBundle(GetFramework().GetBundleContext(), "TestBundleDSTOI1");
test::InstallAndStartBundle(GetFramework().GetBundleContext(), "TestBundleDSTOI2");
test::InstallAndStartBundle(GetFramework().GetBundleContext(), "TestBundleDSTOI3");
test::InstallAndStartBundle(GetFramework().GetBundleContext(), "TestBundleDSTOI5");

constexpr int fakeBundleCount{100};
auto bundleContext = GetFramework().GetBundleContext();
auto allBundles = bundleContext.GetBundles();
ASSERT_TRUE(allBundles.size() > count) << "All bundles not installed.";
// This test doesn't require unique or even functional Bundle objects. Use the
// same bundle object for the purpose of testing thread safety of the SCRExtensionRegistry
// methods.
const auto bundle = test::InstallAndStartBundle(bundleContext, "TestBundleDSTOI1");

// Add a bundle extension object for each bundle in the allBundles vector to the
// extension registry
ConcurrentInvoke(allBundles, true);
for (auto const& item : allBundles) {
ASSERT_TRUE(extRegistry->Find(item.GetBundleId()))
<< "bundle " << item.GetSymbolicName() << " not found.";
}
std::function<bool()> addFunc = [&]() -> bool {
for(int fakeBundleId = 0; fakeBundleId <= fakeBundleCount; ++fakeBundleId)
{
extRegistry->Add(fakeBundleId, std::make_shared<SCRBundleExtension>(bundle, fakeRegistry, logger, notifier));
}
return true;
};

ASSERT_NO_THROW((void)ConcurrentInvoke(std::move(addFunc)));

// Remove the bundle extension for all bundles in the allBundles vector from
// the extension registry.
ConcurrentInvoke(allBundles, false);
for (auto const& item : allBundles)
{
ASSERT_TRUE(!extRegistry->Find(item.GetBundleId()))
<< "bundle " << item.GetSymbolicName() << " should have been removed.";
}
std::function<bool()> removeFunc = [&]() -> bool {
for(int fakeBundleId = 0; fakeBundleId <= fakeBundleCount; ++fakeBundleId)
{
extRegistry->Remove(fakeBundleId);
}
return true;
};

ASSERT_NO_THROW((void)ConcurrentInvoke(std::move(removeFunc)));

asyncWorkService->StopTracking();
fakeRegistry->Clear();

}

//Mock SCRExtensionRegistry class used by the testException class
class MockSCRExtensionRegistry : public cppmicroservices::scrimpl::SCRExtensionRegistry
{
public:
MockSCRExtensionRegistry(std::shared_ptr<SCRLogger> const& logger)
: cppmicroservices::scrimpl::SCRExtensionRegistry (logger)
{
}
virtual ~MockSCRExtensionRegistry() = default;
MOCK_METHOD1(Find, std::shared_ptr<SCRBundleExtension>(long bundleId));
};

// Tests the CreateFactoryComponent method of the ConfigurationNotifier class. If the bundle extension
// cannot be found in the SCRExtensionRegistry when creating a factory component then an
// exception will be logged.
TEST_F(SCRExtensionRegistryTest, testException)
TEST_F(SCRExtensionRegistryTest, testCreateFactoryComponentFailure)
{
auto bundle = test::InstallAndStartBundle(GetFramework().GetBundleContext(), "TestBundleDSTOI1");
ASSERT_TRUE(static_cast<bool>(bundle));
auto mockExtRegistry = std::make_shared<MockSCRExtensionRegistry>(logger);
auto mockLogger = std::make_shared<MockLogger>();
auto notifier = std::make_shared<ConfigurationNotifier>(GetFramework().GetBundleContext(),
mockLogger,
asyncWorkService,
mockExtRegistry);

EXPECT_CALL(*mockExtRegistry, Find (bundle.GetBundleId())).Times(1).WillOnce(::testing::Return(nullptr));
EXPECT_CALL(*(mockLogger.get()),
Log(cppmicroservices::logservice::SeverityLevel::LOG_ERROR, testing::_, testing::_))
extRegistry);

EXPECT_CALL(*mockLogger, Log(cppmicroservices::logservice::SeverityLevel::LOG_ERROR, testing::_))
.Times(1);
auto mockMetadata = std::make_shared<metadata::ComponentMetadata>();

auto mockMetadata = std::make_shared<metadata::ComponentMetadata>();

std::shared_ptr<ComponentConfigurationImpl> compConfigImpl
= std::make_shared<SingletonComponentConfigurationImpl>(mockMetadata, bundle, fakeRegistry, logger, notifier);
= std::make_shared<SingletonComponentConfigurationImpl>(mockMetadata, bundle, fakeRegistry, mockLogger, notifier);
std::string pid { 123 };
EXPECT_NO_THROW({ notifier->CreateFactoryComponent(pid, compConfigImpl); });
EXPECT_NO_THROW({ notifier->CreateFactoryComponent(pid, compConfigImpl); });

asyncWorkService->StopTracking();
fakeRegistry->Clear();
compConfigImpl->Deactivate();
}
} // namespace scrimpl
} // namespace cppmicroservices

1 comment on commit 44e1481

@github-actions
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Performance Alert ⚠️

Possible performance regression was detected for benchmark 'C++ Benchmark'.
Benchmark result of this commit is worse than the previous benchmark result exceeding threshold 0.20.

Benchmark suite Current: 44e1481 Previous: f244220 Ratio
ServiceRegistryFixture/RegisterServices/1/1/manual_time 38958.495821726916 ns/iter 40367.9997820514 ns/iter 0.97
ServiceRegistryFixture/RegisterServices/4/1/manual_time 158990.25547445132 ns/iter 164083.43476607115 ns/iter 0.97
ServiceRegistryFixture/RegisterServices/16/1/manual_time 619080.8999999908 ns/iter 637736.0999999989 ns/iter 0.97
ServiceRegistryFixture/RegisterServices/64/1/manual_time 2527069.470404957 ns/iter 2643710.5431309845 ns/iter 0.96
ServiceRegistryFixture/RegisterServices/256/1/manual_time 10090295.50561785 ns/iter 10586079.069767388 ns/iter 0.95
ServiceRegistryFixture/RegisterServices/1000/1/manual_time 38819442.10526305 ns/iter 40364210.526315436 ns/iter 0.96
ServiceRegistryFixture/RegisterServices/1/4/manual_time 116188.1972111562 ns/iter 118707.16587189071 ns/iter 0.98
ServiceRegistryFixture/RegisterServices/4/4/manual_time 454376.1266747901 ns/iter 476555.79078455555 ns/iter 0.95
ServiceRegistryFixture/RegisterServices/16/4/manual_time 1849808.9519650752 ns/iter 1902899.5535714303 ns/iter 0.97
ServiceRegistryFixture/RegisterServices/64/4/manual_time 7500978.195488751 ns/iter 7804428.244274839 ns/iter 0.96
ServiceRegistryFixture/RegisterServices/256/4/manual_time 29122018.5185187 ns/iter 30012453.846153878 ns/iter 0.97
ServiceRegistryFixture/RegisterServices/1000/4/manual_time 116220862.5000008 ns/iter 119869262.49999976 ns/iter 0.97
ServiceRegistryFixture/RegisterServices/1/16/manual_time 371085.5999999993 ns/iter 377180.3701899659 ns/iter 0.98
ServiceRegistryFixture/RegisterServices/4/16/manual_time 1516497.7272727268 ns/iter 1563666.6101694945 ns/iter 0.97
ServiceRegistryFixture/RegisterServices/16/16/manual_time 5717932.000000004 ns/iter 5860870.000000001 ns/iter 0.98
ServiceRegistryFixture/RegisterServices/64/16/manual_time 23972427.77777776 ns/iter 24711414.28571431 ns/iter 0.97
ServiceRegistryFixture/RegisterServices/256/16/manual_time 99090518.18181829 ns/iter 101214910.00000013 ns/iter 0.98
ServiceRegistryFixture/RegisterServices/1000/16/manual_time 366140150.00000066 ns/iter 376371550.00000036 ns/iter 0.97
ServiceRegistryFixture/RegisterServices/1/64/manual_time 1271474.2682926846 ns/iter 1289533.906633907 ns/iter 0.99
ServiceRegistryFixture/RegisterServices/4/64/manual_time 4856941.666666664 ns/iter 4892706.622516554 ns/iter 0.99
ServiceRegistryFixture/RegisterServices/16/64/manual_time 20074727.659574468 ns/iter 20533365.2173913 ns/iter 0.98
ServiceRegistryFixture/RegisterServices/64/64/manual_time 78153489.99999987 ns/iter 79595489.99999997 ns/iter 0.98
ServiceRegistryFixture/RegisterServices/256/64/manual_time 321945766.6666661 ns/iter 333108633.3333333 ns/iter 0.97
ServiceRegistryFixture/RegisterServices/1000/64/manual_time 1300326899.9999993 ns/iter 1330749700.000001 ns/iter 0.98
ServiceRegistryFixture/RegisterServices/1/256/manual_time 4001317.8743961337 ns/iter 4029456.0975609766 ns/iter 0.99
ServiceRegistryFixture/RegisterServices/4/256/manual_time 16713274.626865683 ns/iter 16939763.636363626 ns/iter 0.99
ServiceRegistryFixture/RegisterServices/16/256/manual_time 60285729.999999985 ns/iter 62028909.99999998 ns/iter 0.97
ServiceRegistryFixture/RegisterServices/64/256/manual_time 264365700.0000002 ns/iter 273287675.00000006 ns/iter 0.97
ServiceRegistryFixture/RegisterServices/256/256/manual_time 1066207400.0000001 ns/iter 1074680799.9999995 ns/iter 0.99
ServiceRegistryFixture/RegisterServices/1000/256/manual_time 5282447500.000001 ns/iter 5421647300.000003 ns/iter 0.97
ServiceRegistryFixture/RegisterServices/1/1000/manual_time 13976131.578947367 ns/iter 14118452.63157895 ns/iter 0.99
ServiceRegistryFixture/RegisterServices/4/1000/manual_time 47585847.05882353 ns/iter 48447982.35294117 ns/iter 0.98
ServiceRegistryFixture/RegisterServices/16/1000/manual_time 210639083.33333334 ns/iter 216429316.6666666 ns/iter 0.97
ServiceRegistryFixture/RegisterServices/64/1000/manual_time 792503900.0000001 ns/iter 759603199.9999999 ns/iter 1.04
ServiceRegistryFixture/RegisterServices/256/1000/manual_time 4137595900.000001 ns/iter 4219284200.0000005 ns/iter 0.98
ServiceRegistryFixture/RegisterServices/1000/1000/manual_time 20990515499.99997 ns/iter 21637633399.999973 ns/iter 0.97
ServiceRegistryFixture/RegisterServicesWithRank/1/1/manual_time 39265.56007823609 ns/iter 39535.82704553927 ns/iter 0.99
ServiceRegistryFixture/RegisterServicesWithRank/4/1/manual_time 213078.35267262688 ns/iter 208177.04541099982 ns/iter 1.02
ServiceRegistryFixture/RegisterServicesWithRank/16/1/manual_time 827626.2000000045 ns/iter 806631.6999999972 ns/iter 1.03
ServiceRegistryFixture/RegisterServicesWithRank/64/1/manual_time 3629955.925925919 ns/iter 3518361.7647058633 ns/iter 1.03
ServiceRegistryFixture/RegisterServicesWithRank/256/1/manual_time 16245797.647058869 ns/iter 16173182.352941057 ns/iter 1.00
ServiceRegistryFixture/RegisterServicesWithRank/1000/1/manual_time 52985686.66666677 ns/iter 52854920.000000246 ns/iter 1.00
ServiceRegistryFixture/RegisterServicesWithRank/1/4/manual_time 117501.31263410354 ns/iter 117393.1104100947 ns/iter 1.00
ServiceRegistryFixture/RegisterServicesWithRank/4/4/manual_time 504975.8509955058 ns/iter 499928.9340101539 ns/iter 1.01
ServiceRegistryFixture/RegisterServicesWithRank/16/4/manual_time 2214318.281938328 ns/iter 2179569.4690265544 ns/iter 1.02
ServiceRegistryFixture/RegisterServicesWithRank/64/4/manual_time 9676908.270676697 ns/iter 9424244.029850775 ns/iter 1.03
ServiceRegistryFixture/RegisterServicesWithRank/256/4/manual_time 35572679.99999998 ns/iter 34806964.00000019 ns/iter 1.02
ServiceRegistryFixture/RegisterServicesWithRank/1000/4/manual_time 143948150.0000001 ns/iter 141461324.99999976 ns/iter 1.02
ServiceRegistryFixture/RegisterServicesWithRank/1/16/manual_time 373827.10235463694 ns/iter 374561.371318204 ns/iter 1.00
ServiceRegistryFixture/RegisterServicesWithRank/4/16/manual_time 1575279.7856049018 ns/iter 1566370.4160246542 ns/iter 1.01
ServiceRegistryFixture/RegisterServicesWithRank/16/16/manual_time 5898539 ns/iter 5901519.999999995 ns/iter 1.00
ServiceRegistryFixture/RegisterServicesWithRank/64/16/manual_time 25607488.571428515 ns/iter 25772263.888888866 ns/iter 0.99
ServiceRegistryFixture/RegisterServicesWithRank/256/16/manual_time 105325359.99999999 ns/iter 104503480 ns/iter 1.01
ServiceRegistryFixture/RegisterServicesWithRank/1000/16/manual_time 379069600.00000006 ns/iter 377003549.9999998 ns/iter 1.01
ServiceRegistryFixture/RegisterServicesWithRank/1/64/manual_time 1296344.3509615383 ns/iter 1297373.0531520396 ns/iter 1.00
ServiceRegistryFixture/RegisterServicesWithRank/4/64/manual_time 4693042.168674694 ns/iter 4682429.090909092 ns/iter 1.00
ServiceRegistryFixture/RegisterServicesWithRank/16/64/manual_time 20082273.469387766 ns/iter 20149583.673469387 ns/iter 1.00
ServiceRegistryFixture/RegisterServicesWithRank/64/64/manual_time 78099599.99999994 ns/iter 77824679.99999999 ns/iter 1.00
ServiceRegistryFixture/RegisterServicesWithRank/256/64/manual_time 324137500.00000006 ns/iter 325731699.9999997 ns/iter 1.00
ServiceRegistryFixture/RegisterServicesWithRank/1000/64/manual_time 1314609000.0000007 ns/iter 1323395800 ns/iter 0.99
ServiceRegistryFixture/RegisterServicesWithRank/1/256/manual_time 4038526.2135922317 ns/iter 4041011.650485437 ns/iter 1.00
ServiceRegistryFixture/RegisterServicesWithRank/4/256/manual_time 16011098.66666667 ns/iter 16002544.000000006 ns/iter 1.00
ServiceRegistryFixture/RegisterServicesWithRank/16/256/manual_time 58123669.999999985 ns/iter 57959860.00000002 ns/iter 1.00
ServiceRegistryFixture/RegisterServicesWithRank/64/256/manual_time 260105475.00000003 ns/iter 260404525 ns/iter 1.00
ServiceRegistryFixture/RegisterServicesWithRank/256/256/manual_time 1055749799.9999999 ns/iter 1078395699.9999995 ns/iter 0.98
ServiceRegistryFixture/RegisterServicesWithRank/1000/256/manual_time 5311489999.999989 ns/iter 5382951199.999995 ns/iter 0.99
ServiceRegistryFixture/RegisterServicesWithRank/1/1000/manual_time 14155503.53982301 ns/iter 13686506.140350873 ns/iter 1.03
ServiceRegistryFixture/RegisterServicesWithRank/4/1000/manual_time 46745336.84210527 ns/iter 43992342.10526315 ns/iter 1.06
ServiceRegistryFixture/RegisterServicesWithRank/16/1000/manual_time 203828666.66666663 ns/iter 198531216.66666672 ns/iter 1.03
ServiceRegistryFixture/RegisterServicesWithRank/64/1000/manual_time 764563899.9999999 ns/iter 744170300 ns/iter 1.03
ServiceRegistryFixture/RegisterServicesWithRank/256/1000/manual_time 4241209299.9999995 ns/iter 4215293599.999997 ns/iter 1.01
ServiceRegistryFixture/RegisterServicesWithRank/1000/1000/manual_time 21127945399.999996 ns/iter 21304223899.99999 ns/iter 0.99
ServiceRegistryFixture/FindServices/1/1 2569.0210714287787 ns/iter 2525.689772283136 ns/iter 1.02
ServiceRegistryFixture/FindServices/4/1 4736.621510316502 ns/iter 4704.261616654897 ns/iter 1.01
ServiceRegistryFixture/FindServices/16/1 13613.21428571419 ns/iter 13455.329663709917 ns/iter 1.01
ServiceRegistryFixture/FindServices/64/1 48812.026017156946 ns/iter 49244.644339884784 ns/iter 0.99
ServiceRegistryFixture/FindServices/256/1 179913.74907933423 ns/iter 180650.76346098393 ns/iter 1.00
ServiceRegistryFixture/FindServices/1000/1 678928.5714284736 ns/iter 686007.1428570384 ns/iter 0.99
ServiceRegistryFixture/FindServices/1/4 10274.276454124412 ns/iter 10759.854687499626 ns/iter 0.95
ServiceRegistryFixture/FindServices/4/4 18906.782203415125 ns/iter 18832.189077822943 ns/iter 1.00
ServiceRegistryFixture/FindServices/16/4 53466.30357144428 ns/iter 54594.249999991014 ns/iter 0.98
ServiceRegistryFixture/FindServices/64/4 195526.4934368888 ns/iter 196037.08647707896 ns/iter 1.00
ServiceRegistryFixture/FindServices/256/4 720051.1160715248 ns/iter 726635.4910712941 ns/iter 0.99
ServiceRegistryFixture/FindServices/1000/4 2736185.984848348 ns/iter 2737652.272727611 ns/iter 1.00
ServiceRegistryFixture/FindServices/1/16 41229.47014102412 ns/iter 40705.29858975409 ns/iter 1.01
ServiceRegistryFixture/FindServices/4/16 76138.09151786807 ns/iter 75956.58482143974 ns/iter 1.00
ServiceRegistryFixture/FindServices/16/16 216298.87499997835 ns/iter 218361.56249996464 ns/iter 0.99
ServiceRegistryFixture/FindServices/64/16 777546.0937501525 ns/iter 788809.1517858393 ns/iter 0.99
ServiceRegistryFixture/FindServices/256/16 2874625.0000001625 ns/iter 2909487.1485949443 ns/iter 0.99
ServiceRegistryFixture/FindServices/1000/16 10876696.875001812 ns/iter 10913595.312498359 ns/iter 1.00
ServiceRegistryFixture/FindServices/1/64 166293.57142855992 ns/iter 162522.39135770017 ns/iter 1.02
ServiceRegistryFixture/FindServices/4/64 305051.3570822364 ns/iter 307314.5038168048 ns/iter 0.99
ServiceRegistryFixture/FindServices/16/64 865510.0446429539 ns/iter 866382.1428570425 ns/iter 1.00
ServiceRegistryFixture/FindServices/64/64 3142199.107143386 ns/iter 3156883.4821423967 ns/iter 1.00
ServiceRegistryFixture/FindServices/256/64 11532329.687501175 ns/iter 11588173.437502291 ns/iter 1.00
ServiceRegistryFixture/FindServices/1000/64 43824237.50000442 ns/iter 43923574.99999378 ns/iter 1.00
ServiceRegistryFixture/FindServices/1/256 681850.4464286081 ns/iter 674818.392857089 ns/iter 1.01
ServiceRegistryFixture/FindServices/4/256 1276576.6071428938 ns/iter 1268763.5714286217 ns/iter 1.01
ServiceRegistryFixture/FindServices/16/256 3650505.347593176 ns/iter 3640484.102563791 ns/iter 1.00
ServiceRegistryFixture/FindServices/64/256 13286087.49999814 ns/iter 13339179.999998124 ns/iter 1.00
ServiceRegistryFixture/FindServices/256/256 49524999.99999417 ns/iter 49120209.09091553 ns/iter 1.01
ServiceRegistryFixture/FindServices/1000/256 184941850.0000297 ns/iter 190825249.99998894 ns/iter 0.97
ServiceRegistryFixture/FindServices/1/1000 2695827.651515194 ns/iter 2704565.909090551 ns/iter 1.00
ServiceRegistryFixture/FindServices/4/1000 5088189.000000511 ns/iter 5085130.357142833 ns/iter 1.00
ServiceRegistryFixture/FindServices/16/1000 14615037.777780851 ns/iter 14547867.999999652 ns/iter 1.00
ServiceRegistryFixture/FindServices/64/1000 53074519.999995574 ns/iter 53672127.27273082 ns/iter 0.99
ServiceRegistryFixture/FindServices/256/1000 196826533.33332685 ns/iter 196460066.66660774 ns/iter 1.00
ServiceRegistryFixture/FindServices/1000/1000 750301399.9998984 ns/iter 757681399.9999104 ns/iter 0.99
ServiceRegistryFixture/UnregisterServices/1/1/manual_time 3048.8141118633043 ns/iter 3059.749356869324 ns/iter 1.00
ServiceRegistryFixture/UnregisterServices/4/1/manual_time 12179.036115528079 ns/iter 16007.030335530852 ns/iter 0.76
ServiceRegistryFixture/UnregisterServices/16/1/manual_time 49936.20886155046 ns/iter 50103.639999844694 ns/iter 1.00
ServiceRegistryFixture/UnregisterServices/64/1/manual_time 217115.63275422686 ns/iter 216597.83950605246 ns/iter 1.00
ServiceRegistryFixture/UnregisterServices/256/1/manual_time 1136114.7487843018 ns/iter 1138596.9105689323 ns/iter 1.00
ServiceRegistryFixture/UnregisterServices/1000/1/manual_time 8433343.373494113 ns/iter 8704653.086419731 ns/iter 0.97
ServiceRegistryFixture/UnregisterServices/1/4/manual_time 3631.282597401945 ns/iter 3622.1529146620737 ns/iter 1.00
ServiceRegistryFixture/UnregisterServices/4/4/manual_time 13765.35326354123 ns/iter 14004.02962011869 ns/iter 0.98
ServiceRegistryFixture/UnregisterServices/16/4/manual_time 92644.86166004845 ns/iter 58082.97413794374 ns/iter 1.60
ServiceRegistryFixture/UnregisterServices/64/4/manual_time 271457.55813955306 ns/iter 271395.56765166257 ns/iter 1.00
ServiceRegistryFixture/UnregisterServices/256/4/manual_time 1740387.8712871121 ns/iter 1729617.6616915348 ns/iter 1.01
ServiceRegistryFixture/UnregisterServices/1000/4/manual_time 16221511.627906965 ns/iter 16573211.363636559 ns/iter 0.98
ServiceRegistryFixture/UnregisterServices/1/16/manual_time 5883.304623896521 ns/iter 5965.560205193061 ns/iter 0.99
ServiceRegistryFixture/UnregisterServices/4/16/manual_time 20476.05439784281 ns/iter 21297.668025976403 ns/iter 0.96
ServiceRegistryFixture/UnregisterServices/16/16/manual_time 90773.23506592738 ns/iter 92314.63350437696 ns/iter 0.98
ServiceRegistryFixture/UnregisterServices/64/16/manual_time 502000.6999999713 ns/iter 505080.6637806526 ns/iter 0.99
ServiceRegistryFixture/UnregisterServices/256/16/manual_time 4210162.048192764 ns/iter 4245118.787878769 ns/iter 0.99
ServiceRegistryFixture/UnregisterServices/1000/16/manual_time 48231814.285714455 ns/iter 48597900.00000011 ns/iter 0.99
ServiceRegistryFixture/UnregisterServices/1/64/manual_time 15268.527009913549 ns/iter 15709.127975799824 ns/iter 0.97
ServiceRegistryFixture/UnregisterServices/4/64/manual_time 47866.100307070796 ns/iter 49093.53958143781 ns/iter 0.97
ServiceRegistryFixture/UnregisterServices/16/64/manual_time 255887.72270812327 ns/iter 226568.50291639706 ns/iter 1.13
ServiceRegistryFixture/UnregisterServices/64/64/manual_time 1441964.6817248503 ns/iter 1482882.758620685 ns/iter 0.97
ServiceRegistryFixture/UnregisterServices/256/64/manual_time 14407487.755101983 ns/iter 14199302.000000017 ns/iter 1.01
ServiceRegistryFixture/UnregisterServices/1000/64/manual_time 179476425.00000012 ns/iter 173221600.0000002 ns/iter 1.04
ServiceRegistryFixture/UnregisterServices/1/256/manual_time 92491.13210022161 ns/iter 92748.84408602117 ns/iter 1.00
ServiceRegistryFixture/UnregisterServices/4/256/manual_time 299357.7825159931 ns/iter 305422.0728534255 ns/iter 0.98
ServiceRegistryFixture/UnregisterServices/16/256/manual_time 1302686.2962962927 ns/iter 1345026.705653018 ns/iter 0.97
ServiceRegistryFixture/UnregisterServices/64/256/manual_time 7756381.521739131 ns/iter 8056822.352941192 ns/iter 0.96
ServiceRegistryFixture/UnregisterServices/256/256/manual_time 66645590.0000002 ns/iter 65060845.45454555 ns/iter 1.02
ServiceRegistryFixture/UnregisterServices/1000/256/manual_time 733210600.0000012 ns/iter 742679100.0000005 ns/iter 0.99
ServiceRegistryFixture/UnregisterServices/1/1000/manual_time 411109.7246631526 ns/iter 425901.5393724097 ns/iter 0.97
ServiceRegistryFixture/UnregisterServices/4/1000/manual_time 1400861.4457831348 ns/iter 1467036.401673637 ns/iter 0.95
ServiceRegistryFixture/UnregisterServices/16/1000/manual_time 6474520.90909089 ns/iter 7248973.913043483 ns/iter 0.89
ServiceRegistryFixture/UnregisterServices/64/1000/manual_time 39122238.88888883 ns/iter 38818027.77777776 ns/iter 1.01
ServiceRegistryFixture/UnregisterServices/256/1000/manual_time 298656750.00000024 ns/iter 288464449.99999994 ns/iter 1.04
ServiceRegistryFixture/UnregisterServices/1000/1000/manual_time 3075494300.000001 ns/iter 3165692999.9999986 ns/iter 0.97
ServiceRegistryFixture/ModifyServices/1/1/manual_time 5986.253069266801 ns/iter 6191.207763564417 ns/iter 0.97
ServiceRegistryFixture/ModifyServices/4/1/manual_time 23959.44124666953 ns/iter 24915.368698939834 ns/iter 0.96
ServiceRegistryFixture/ModifyServices/16/1/manual_time 96793.6931974643 ns/iter 99566.63366336591 ns/iter 0.97
ServiceRegistryFixture/ModifyServices/64/1/manual_time 405316.3288940348 ns/iter 418866.72453703725 ns/iter 0.97
ServiceRegistryFixture/ModifyServices/256/1/manual_time 1559403.8031319913 ns/iter 1703482.4940047965 ns/iter 0.92
ServiceRegistryFixture/ModifyServices/1000/1/manual_time 6177121.739130436 ns/iter 6396647.272727276 ns/iter 0.97
ServiceRegistryFixture/ModifyServices/1/4/manual_time 6157.210838018907 ns/iter 6323.451642244552 ns/iter 0.97
ServiceRegistryFixture/ModifyServices/4/4/manual_time 25221.964387873133 ns/iter 25644.112811893632 ns/iter 0.98
ServiceRegistryFixture/ModifyServices/16/4/manual_time 100340.05361173688 ns/iter 107887.86999419787 ns/iter 0.93
ServiceRegistryFixture/ModifyServices/64/4/manual_time 417152.34285714326 ns/iter 422572.2399489471 ns/iter 0.99
ServiceRegistryFixture/ModifyServices/256/4/manual_time 1606859.4405594405 ns/iter 1734876.2962962957 ns/iter 0.93
ServiceRegistryFixture/ModifyServices/1000/4/manual_time 6356731.481481476 ns/iter 6706436.79245283 ns/iter 0.95
ServiceRegistryFixture/ModifyServices/1/16/manual_time 6884.451307790708 ns/iter 7091.558169261763 ns/iter 0.97
ServiceRegistryFixture/ModifyServices/4/16/manual_time 27352.674674595237 ns/iter 28714.56350174631 ns/iter 0.95
ServiceRegistryFixture/ModifyServices/16/16/manual_time 110039.39441236015 ns/iter 113855.65049170014 ns/iter 0.97
ServiceRegistryFixture/ModifyServices/64/16/manual_time 438771.6540404039 ns/iter 472060.1604278092 ns/iter 0.93
ServiceRegistryFixture/ModifyServices/256/16/manual_time 1810491.755319149 ns/iter 1997552.659574469 ns/iter 0.91
ServiceRegistryFixture/ModifyServices/1000/16/manual_time 7074639.6039603995 ns/iter 7394988.764044944 ns/iter 0.96
ServiceRegistryFixture/ModifyServices/1/64/manual_time 9408.078236987922 ns/iter 9954.228253309217 ns/iter 0.95
ServiceRegistryFixture/ModifyServices/4/64/manual_time 37413.48478307836 ns/iter 39692.16384181132 ns/iter 0.94
ServiceRegistryFixture/ModifyServices/16/64/manual_time 151005.77672003602 ns/iter 155497.56701959684 ns/iter 0.97
ServiceRegistryFixture/ModifyServices/64/64/manual_time 608054.6781115878 ns/iter 631908.0500894458 ns/iter 0.96
ServiceRegistryFixture/ModifyServices/256/64/manual_time 2571077.2241992867 ns/iter 2593148.1060606046 ns/iter 0.99
ServiceRegistryFixture/ModifyServices/1000/64/manual_time 9804390.140845068 ns/iter 10344567.647058818 ns/iter 0.95
ServiceRegistryFixture/ModifyServices/1/256/manual_time 43806.902566659606 ns/iter 44911.62584646677 ns/iter 0.98
ServiceRegistryFixture/ModifyServices/4/256/manual_time 177832.7720532823 ns/iter 182759.41872981747 ns/iter 0.97
ServiceRegistryFixture/ModifyServices/16/256/manual_time 714645.4728370234 ns/iter 721056.5439672793 ns/iter 0.99
ServiceRegistryFixture/ModifyServices/64/256/manual_time 2928506.250000002 ns/iter 2997684.549356223 ns/iter 0.98
ServiceRegistryFixture/ModifyServices/256/256/manual_time 12047959.322033899 ns/iter 12596367.857142864 ns/iter 0.96
ServiceRegistryFixture/ModifyServices/1000/256/manual_time 48409249.99999999 ns/iter 50092999.99999999 ns/iter 0.97
ServiceRegistryFixture/ModifyServices/1/1000/manual_time 195541.67828268665 ns/iter 197078.65041111517 ns/iter 0.99
ServiceRegistryFixture/ModifyServices/4/1000/manual_time 791903.5874439459 ns/iter 799492.2285714298 ns/iter 0.99
ServiceRegistryFixture/ModifyServices/16/1000/manual_time 3195335.3211009186 ns/iter 3213872.248803828 ns/iter 0.99
ServiceRegistryFixture/ModifyServices/64/1000/manual_time 12883990.566037735 ns/iter 13376518.518518519 ns/iter 0.96
ServiceRegistryFixture/ModifyServices/256/1000/manual_time 53492107.692307696 ns/iter 55189846.15384615 ns/iter 0.97
ServiceRegistryFixture/ModifyServices/1000/1000/manual_time 225189300 ns/iter 224263799.99999997 ns/iter 1.00
ServiceTrackerFixture/OpenServiceTrackerWithSvcRef/manual_time 6614.5090353332125 ns/iter 6832.125417394069 ns/iter 0.97
ServiceTrackerFixture/OpenServiceTrackerWithBundleContext/manual_time 8306.0303764569 ns/iter 8753.579065772914 ns/iter 0.95
ServiceTrackerFixture/OpenServiceTrackerWithInterfaceName/manual_time 8285.143978291633 ns/iter 8371.977501411091 ns/iter 0.99
CloseServiceTracker/1000 8842.265625002961 ns/iter 6990.444196429532 ns/iter 1.26
CloseServiceTracker/1024 7306.640625002509 ns/iter 6990.2330357162355 ns/iter 1.05
CloseServiceTracker/2048 7360.402901786601 ns/iter 7335.383928571153 ns/iter 1.00
CloseServiceTracker/4096 7380.628348216638 ns/iter 7468.276785717519 ns/iter 0.99
CloseServiceTracker/8192 7468.699776786992 ns/iter 7156.512500001457 ns/iter 1.04
CloseServiceTracker/16384 7469.320535713157 ns/iter 7182.816964282373 ns/iter 1.04
CloseServiceTracker/32768 7568.738839286279 ns/iter 7320.784598212933 ns/iter 1.03
CloseServiceTracker/65536 7960.421875000837 ns/iter 7540.611607141605 ns/iter 1.06
CloseServiceTracker/131072 7901.319196424846 ns/iter 7741.549107141818 ns/iter 1.02
CloseServiceTracker/262144 8092.197544640506 ns/iter 7750.279017858678 ns/iter 1.04
CloseServiceTracker/524288 8017.712053570238 ns/iter 8062.055803570445 ns/iter 0.99
CloseServiceTracker/1000000 8683.887125502286 ns/iter 8092.979910715923 ns/iter 1.07
ServiceTrackerFixture/ServiceTrackerScalability/1 47566.61056447703 ns/iter 46251.88124998658 ns/iter 1.03
ServiceTrackerFixture/ServiceTrackerScalability/4000 28274266.666661184 ns/iter 24713632.142850526 ns/iter 1.14
ServiceTrackerFixture/ServiceTrackerScalability/10000 78785755.5556002 ns/iter 75260066.66668966 ns/iter 1.05
ServiceTrackerFixture/MultipleImplOneInterfaceServiceTrackerScalability/1 47037.4374999949 ns/iter 46643.768749987656 ns/iter 1.01
ServiceTrackerFixture/MultipleImplOneInterfaceServiceTrackerScalability/4000 189408025.00003427 ns/iter 194983649.99992645 ns/iter 0.97
ServiceTrackerFixture/MultipleImplOneInterfaceServiceTrackerScalability/10000 487730849.99993443 ns/iter 478794750.0001337 ns/iter 1.02
ServiceTrackerFixture/ServiceTrackerScalabilityWithLDAPFilter/1 42373.962053560936 ns/iter 42104.28571429503 ns/iter 1.01
ServiceTrackerFixture/ServiceTrackerScalabilityWithLDAPFilter/4000 3475594.3589726277 ns/iter 3417004.4117645905 ns/iter 1.02
ServiceTrackerFixture/ServiceTrackerScalabilityWithLDAPFilter/10000 11316179.687504757 ns/iter 9616230.666670162 ns/iter 1.18
AnyMapPerfTestFixture/HappyPath/1 448.1105987203038 ns/iter 450.72532346631516 ns/iter 0.99
AnyMapPerfTestFixture/HappyPath/3 1321.3211511962463 ns/iter 1369.416486867497 ns/iter 0.96
AnyMapPerfTestFixture/HappyPath/7 3011.359308532933 ns/iter 3011.335558487595 ns/iter 1.00
AnyMapPerfTestFixture/HappyPath/11 4744.032494670807 ns/iter 4801.265603807524 ns/iter 0.99
AnyMapPerfTestFixture/HappyPath/15 6533.472098218292 ns/iter 6728.759821425812 ns/iter 0.97
AnyMapPerfTestFixture/HappyPath/18 7774.554687500768 ns/iter 7833.338169643664 ns/iter 0.99
AnyMapPerfTestFixture/HappyPath/20 8665.121651785868 ns/iter 8548.401785713875 ns/iter 1.01
AnyMapPerfTestFixture/ErrorPath/1 5815.596428569896 ns/iter 5821.641964286885 ns/iter 1.00
AnyMapPerfTestFixture/ErrorPath/3 8461.178298313047 ns/iter 8240.96053142833 ns/iter 1.03
AnyMapPerfTestFixture/ErrorPath/7 12836.807142857002 ns/iter 12908.771428564187 ns/iter 0.99
AnyMapPerfTestFixture/ErrorPath/11 17624.13877770855 ns/iter 17644.140250933007 ns/iter 1.00
AnyMapPerfTestFixture/ErrorPath/15 22462.171874991556 ns/iter 22359.790625003483 ns/iter 1.00
AnyMapPerfTestFixture/ErrorPath/18 25933.15714286096 ns/iter 26128.153571432576 ns/iter 0.99
AnyMapPerfTestFixture/ErrorPath/20 28748.577123706596 ns/iter 28788.669693438398 ns/iter 1.00
AnyMapPerfTestFixture/HappyPath_NoThrowOverload/1 698.0789062497803 ns/iter 694.2646205355833 ns/iter 1.01
AnyMapPerfTestFixture/HappyPath_NoThrowOverload/3 1890.389544990793 ns/iter 1891.5813298900193 ns/iter 1.00
AnyMapPerfTestFixture/HappyPath_NoThrowOverload/7 4258.247500001744 ns/iter 4169.881754517804 ns/iter 1.02
AnyMapPerfTestFixture/HappyPath_NoThrowOverload/11 6619.706249998509 ns/iter 6528.9508928572095 ns/iter 1.01
AnyMapPerfTestFixture/HappyPath_NoThrowOverload/15 8948.818085631761 ns/iter 9044.857835456965 ns/iter 0.99
AnyMapPerfTestFixture/HappyPath_NoThrowOverload/18 10710.06334793243 ns/iter 10638.076562500486 ns/iter 1.01
AnyMapPerfTestFixture/HappyPath_NoThrowOverload/20 12146.341071432484 ns/iter 11956.514285714093 ns/iter 1.02
AnyMapPerfTestFixture/ErrorPath_NoThrowOverload/1 453.1219009493659 ns/iter 449.50797111393535 ns/iter 1.01
AnyMapPerfTestFixture/ErrorPath_NoThrowOverload/3 1666.5959821427884 ns/iter 1670.2328124996566 ns/iter 1.00
AnyMapPerfTestFixture/ErrorPath_NoThrowOverload/7 4023.2304942314195 ns/iter 3930.6764630776192 ns/iter 1.02
AnyMapPerfTestFixture/ErrorPath_NoThrowOverload/11 6428.309821428358 ns/iter 6299.292857144272 ns/iter 1.02
AnyMapPerfTestFixture/ErrorPath_NoThrowOverload/15 8928.269516652119 ns/iter 8615.88787550146 ns/iter 1.04
AnyMapPerfTestFixture/ErrorPath_NoThrowOverload/18 10705.107812505334 ns/iter 10658.72812500146 ns/iter 1.00
AnyMapPerfTestFixture/ErrorPath_NoThrowOverload/20 11775.589062501978 ns/iter 11527.57968750251 ns/iter 1.02
BundleInstallFixture/BundleInstallCppFramework/manual_time 250433.57271095147 ns/iter 245579.78835978862 ns/iter 1.02
BundleInstallFixture/LargeBundleInstallCppFramework/manual_time 244966.39575971765 ns/iter 241092.06016089662 ns/iter 1.02
ConstructFilterFromString 653.5991964284449 ns/iter 666.3123883932088 ns/iter 0.98
ConstructNonTrivialFilterFromString 1025.5285937496694 ns/iter 1054.4429687499246 ns/iter 0.97
MatchFilterWithAnyMap/Simple 431.4550624999924 ns/iter 436.71897453964476 ns/iter 0.99
MatchFilterWithAnyMap/Complex 482.87927781060915 ns/iter 480.6536787173109 ns/iter 1.00
MatchFilterWithBundle/Simple 206.9912720092227 ns/iter 211.50034375011728 ns/iter 0.98
MatchFilterWithBundle/Complex 342.17305943327125 ns/iter 349.1105981745401 ns/iter 0.98
MatchFilterWithServiceReference/Simple 207.06001530969354 ns/iter 205.41978124995808 ns/iter 1.01
MatchFilterWithServiceReference/Complex 255.3191428570959 ns/iter 255.4740714284825 ns/iter 1.00
ConstructFilterIncremental 2363.890888515468 ns/iter 2287.351799831327 ns/iter 1.03
ConstructFilterNotOperator 1024.8212389190646 ns/iter 1003.0932129046523 ns/iter 1.02
ServiceFixture/GetServiceReferenceByInterface 1582.293940428108 ns/iter 1571.2959821436405 ns/iter 1.01
ServiceFixture/GetServiceReferenceByClassName 1385.2418146244027 ns/iter 1387.3899609866894 ns/iter 1.00
ServiceFixture/GetAllServiceReferencesByInterface 1405.5319196424016 ns/iter 1411.4028743738377 ns/iter 1.00
ServiceFixture/GetAllServiceReferencesByClassName 1088.1087500003161 ns/iter 1075.3756249997082 ns/iter 1.01
ServiceFixture/GetAllServiceReferencesByClassNameAndLDAPFilter 746.60959821417 ns/iter 757.5232142857301 ns/iter 0.99
ServiceFixture/GetAllServiceReferencesByInterfaceAndLDAPFilter 690.3908928571972 ns/iter 737.4518973212016 ns/iter 0.94

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.