Skip to content

Commit a8e2799

Browse files
committed
update thread safe code
1 parent 3a23408 commit a8e2799

File tree

3 files changed

+88
-4
lines changed

3 files changed

+88
-4
lines changed

Include/SevenBit/DI/Details/Containers/Impl/ServiceInstancesMap.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ namespace sb::di::details
4242
{
4343
for (auto it = _constructionOrder.rbegin(); it != _constructionOrder.rend(); ++it)
4444
{
45-
if (const auto list = findInstances(*it))
45+
if (const auto listPtr = findInstances(*it))
4646
{
47-
list->clear();
47+
listPtr->clear();
4848
}
4949
}
5050
}

README.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
</p>
1818

1919
<h4>
20-
<a href="https://7bitDI.readthedocs.io/en/latest/index.html">Documentation & Examples</a>
20+
<a href="https://7bitDI.readthedocs.io">Documentation & Examples</a>
2121
</h4>
2222
</div>
2323

@@ -52,6 +52,10 @@ The library is officially supported on the following platforms:
5252
If you notice any problems/bugs, please file an issue on the repository GitHub Issue Tracker. Pull requests containing
5353
fixes are welcome!
5454

55+
## Documentation
56+
57+
https://7bitDI.readthedocs.io
58+
5559
## Installation
5660

5761
### There are a few ways of installation:
@@ -230,6 +234,6 @@ actionA, actionB executed.
230234
```
231235

232236
More examples and tutorials are available on the
233-
[Documentation & Examples](https://7bitDI.readthedocs.io/en/latest/index.html) page
237+
[Documentation & Examples](https://7bitDI.readthedocs.io) page
234238

235239
@7bitcoder Sylwester Dawida 2023
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
#include <gtest/gtest.h>
2+
#include <thread>
3+
4+
#include "../Helpers/Classes/Basic.hpp"
5+
#include "../Helpers/Classes/CirularDependency.hpp"
6+
#include "../Helpers/Classes/Complex.hpp"
7+
#include <SevenBit/DI/Exceptions.hpp>
8+
#include <SevenBit/DI/ServiceCollection.hpp>
9+
10+
class ThreadSafeTest : public testing::Test
11+
{
12+
protected:
13+
static void SetUpTestSuite() {}
14+
15+
ThreadSafeTest() {}
16+
17+
void SetUp() override {}
18+
19+
void TearDown() override {}
20+
21+
~ThreadSafeTest() override = default;
22+
23+
static void TearDownTestSuite() {}
24+
};
25+
26+
void getSafeServices(sb::di::ServiceProvider &provider)
27+
{
28+
auto &service1 = provider.getService<ITestComplexClass1>();
29+
auto &service2 = provider.getService<ITestComplexClass2>();
30+
auto service3 = provider.createService<ITestComplexClass3>();
31+
auto &service4 = provider.getService<ITestComplexClass4>();
32+
auto &service5 = provider.getService<ITestComplexClass5>();
33+
auto &service6 = provider.getService<ITestComplexClass6>();
34+
35+
EXPECT_EQ(service1.number(), 1);
36+
EXPECT_EQ(service2.number(), 2);
37+
EXPECT_EQ(service3->number(), 3);
38+
EXPECT_EQ(service4.number(), 4);
39+
EXPECT_EQ(service5.number(), 5);
40+
EXPECT_EQ(service6.number(), 6);
41+
EXPECT_EQ(service2.getOne(), &service1);
42+
EXPECT_EQ(service3->getOne(), &service1);
43+
EXPECT_EQ(service3->getTwo(), &service2);
44+
EXPECT_EQ(service4.getOne(), &service1);
45+
EXPECT_EQ(service4.getTwo(), &service2);
46+
EXPECT_NE(service4.getThree().get(), service3.get());
47+
EXPECT_EQ(service5.getOne(), &service1);
48+
EXPECT_EQ(service5.getTwo(), &service2);
49+
EXPECT_NE(service5.makeThree(), service3);
50+
EXPECT_EQ(&service6.getOne(), &service1);
51+
EXPECT_EQ(&service6.getTwo(), &service2);
52+
EXPECT_FALSE(service6.getNonExisting());
53+
EXPECT_NE(service6.makeThree(), service3);
54+
}
55+
56+
TEST_F(ThreadSafeTest, ShouldGetSafeServices)
57+
{
58+
sb::di::ServiceProviderOptions options;
59+
options.threadSafe = true;
60+
61+
auto provider = sb::di::ServiceCollection{}
62+
.addSingleton<ITestComplexClass1, TestComplexClass1>()
63+
.addSingleton<ITestComplexClass2, TestComplexClass2>()
64+
.addTransient<ITestComplexClass3, TestComplexClass3>()
65+
.addScoped<ITestComplexClass4, TestComplexClass4>()
66+
.addScoped<ITestComplexClass5, TestComplexClass5>()
67+
.addScoped<ITestComplexClass6, TestComplexClass6>()
68+
.buildServiceProvider(options);
69+
70+
std::vector<std::thread> threads;
71+
constexpr size_t maxThreads = 50;
72+
for (size_t i = 0; i < maxThreads; ++i)
73+
{
74+
threads.emplace_back(getSafeServices, std::ref(provider));
75+
}
76+
for (auto &th : threads)
77+
{
78+
th.join();
79+
}
80+
}

0 commit comments

Comments
 (0)