@@ -58,7 +58,7 @@ TEST(Common_WeakValueHashMap, GetOrInsert)
5858 auto Handle1 = Map.GetOrInsert (1 , " Value" );
5959
6060 // Release map while the handle is still alive
61- Map = {};
61+ Map = WeakValueHashMap< int , std::string> {};
6262
6363 EXPECT_TRUE (Handle1);
6464 EXPECT_STREQ (Handle1->c_str (), " Value" );
@@ -71,7 +71,7 @@ TEST(Common_WeakValueHashMap, GetOrInsert)
7171 auto Handle1 = Map.GetOrInsert (1 , " Value" );
7272
7373 // Release map while the handle is still alive
74- Map = {};
74+ Map = WeakValueHashMap< int , std::string> {};
7575
7676 WeakValueHashMap<int , std::string>::ValueHandle Handle2{std::move (Handle1)};
7777 EXPECT_FALSE (Handle1);
@@ -86,7 +86,7 @@ TEST(Common_WeakValueHashMap, GetOrInsert)
8686 auto Handle1 = Map.GetOrInsert (1 , " Value" );
8787
8888 // Release map while the handle is still alive
89- Map = {};
89+ Map = WeakValueHashMap< int , std::string> {};
9090
9191 WeakValueHashMap<int , std::string>::ValueHandle Handle2;
9292 Handle2 = std::move (Handle1);
@@ -207,72 +207,78 @@ static constexpr int kNumParallelKeys = 16384;
207207// Test that multiple threads can concurrently get or insert values into the map
208208TEST (Common_WeakValueHashMap, ParallelGetOrInsert1)
209209{
210- std::vector<std::thread> Threads (kNumThreads );
211-
212- Threading::Signal StartSignal;
213-
214- WeakValueHashMap<int , std::string> Map;
215- for (size_t t = 0 ; t < kNumThreads ; ++t)
210+ for (size_t NumShards : {1 , 2 , 4 })
216211 {
217- Threads[t] = std::thread{
218- [&Map, &StartSignal]() //
219- {
220- StartSignal.Wait (true , kNumThreads );
212+ std::vector<std::thread> Threads (kNumThreads );
221213
222- for (int k = 0 ; k < kNumParallelKeys ; ++k)
214+ Threading::Signal StartSignal;
215+
216+ WeakValueHashMap<int , std::string> Map{NumShards};
217+ for (size_t t = 0 ; t < kNumThreads ; ++t)
218+ {
219+ Threads[t] = std::thread{
220+ [&Map, &StartSignal]() //
223221 {
224- std::string Value = " Value " + std::to_string (k );
222+ StartSignal. Wait ( true , kNumThreads );
225223
226- auto Handle = Map.GetOrInsert (k, Value);
227- EXPECT_TRUE (Handle);
228- EXPECT_EQ (*Handle, Value);
229- }
230- }};
231- }
224+ for (int k = 0 ; k < kNumParallelKeys ; ++k)
225+ {
226+ std::string Value = " Value" + std::to_string (k);
232227
233- StartSignal.Trigger (true );
234- for (auto & Thread : Threads)
235- {
236- Thread.join ();
228+ auto Handle = Map.GetOrInsert (k, Value);
229+ EXPECT_TRUE (Handle);
230+ EXPECT_EQ (*Handle, Value);
231+ }
232+ }};
233+ }
234+
235+ StartSignal.Trigger (true );
236+ for (auto & Thread : Threads)
237+ {
238+ Thread.join ();
239+ }
237240 }
238241}
239242
240243// Similar to the previous test, but all values are kept alive
241244TEST (Common_WeakValueHashMap, ParallelGetOrInsert2)
242245{
243- std::vector<std::thread> Threads ( kNumThreads );
244-
245- Threading::Signal StartSignal ;
246+ for ( size_t NumShards : { 1 , 2 , 4 })
247+ {
248+ std::vector<std::thread> Threads ( kNumThreads ) ;
246249
247- std::vector<WeakValueHashMap< int , std::string>::ValueHandle> Handles ( kNumThreads * kNumParallelKeys ) ;
250+ Threading::Signal StartSignal ;
248251
249- WeakValueHashMap<int , std::string> Map;
250- for (size_t t = 0 ; t < kNumThreads ; ++t)
251- {
252- Threads[t] = std::thread{
253- [&Map, &StartSignal, &Handles](size_t ThreadId) //
254- {
255- StartSignal.Wait (true , kNumThreads );
252+ std::vector<WeakValueHashMap<int , std::string>::ValueHandle> Handles (kNumThreads * kNumParallelKeys );
256253
257- for (int k = 0 ; k < kNumParallelKeys ; ++k)
254+ WeakValueHashMap<int , std::string> Map{NumShards};
255+ for (size_t t = 0 ; t < kNumThreads ; ++t)
256+ {
257+ Threads[t] = std::thread{
258+ [&Map, &StartSignal, &Handles](size_t ThreadId) //
258259 {
259- std::string Value = " Value " + std::to_string (k );
260+ StartSignal. Wait ( true , kNumThreads );
260261
261- auto Handle = Map. GetOrInsert (k, Value);
262- EXPECT_TRUE (Handle);
263- EXPECT_EQ (*Handle, Value);
262+ for ( int k = 0 ; k < kNumParallelKeys ; ++k)
263+ {
264+ std::string Value = " Value " + std::to_string (k );
264265
265- Handles[ThreadId * kNumParallelKeys + k] = std::move (Handle);
266- }
267- },
268- t,
269- };
270- }
266+ auto Handle = Map.GetOrInsert (k, Value);
267+ EXPECT_TRUE (Handle);
268+ EXPECT_EQ (*Handle, Value);
271269
272- StartSignal.Trigger (true );
273- for (auto & Thread : Threads)
274- {
275- Thread.join ();
270+ Handles[ThreadId * kNumParallelKeys + k] = std::move (Handle);
271+ }
272+ },
273+ t,
274+ };
275+ }
276+
277+ StartSignal.Trigger (true );
278+ for (auto & Thread : Threads)
279+ {
280+ Thread.join ();
281+ }
276282 }
277283}
278284
0 commit comments