From b33eb30bb6da23fe0ba818fcfc9a5c9c3334b66b Mon Sep 17 00:00:00 2001 From: wujianlin Date: Fri, 5 Jan 2024 03:09:21 +0000 Subject: [PATCH] Remove non thread safe interfaces,Add new read interface with lock to safemap Issue:https://gitee.com/openharmony/commonlibrary_c_utils/issues/I8TSVB?from=project-issue Signed-off-by: wujianlin --- base/include/safe_map.h | 10 +++++++++- .../unittest/common/utils_safe_map_test.cpp | 18 +++++++++--------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/base/include/safe_map.h b/base/include/safe_map.h index d35608c..5effe43 100644 --- a/base/include/safe_map.h +++ b/base/include/safe_map.h @@ -42,11 +42,19 @@ public: return *this; } - V& operator[](const K& key) + V ReadVal(const K& key) { + std::lock_guard lock(mutex_); return map_[key]; } + template + void ChangeValueByLambda(const K& key, LambdaCallback callback) + { + std::lock_guard lock(mutex_); + callback(map_[key]); + } + // when multithread calling size() return a tmp status, some threads may insert just after size() call int Size() { diff --git a/base/test/unittest/common/utils_safe_map_test.cpp b/base/test/unittest/common/utils_safe_map_test.cpp index a06b2ba..0b90909 100644 --- a/base/test/unittest/common/utils_safe_map_test.cpp +++ b/base/test/unittest/common/utils_safe_map_test.cpp @@ -63,19 +63,19 @@ HWTEST_F(UtilsSafeMap, testUtilsoperator001, TestSize.Level0) demoData.Insert("A", 1); ASSERT_FALSE(demoData.IsEmpty()); ASSERT_EQ(demoData.Size(), 1); - ASSERT_EQ(demoData["A"], 1); + ASSERT_EQ(demoData.ReadVal("A"), 1); SafeMap newdemo = demoData; - ASSERT_EQ(newdemo["A"], 1); + ASSERT_EQ(newdemo.ReadVal("A"), 1); int tar = -1; - newdemo["B"] = 6; + newdemo.Insert("B", 6); ASSERT_TRUE(newdemo.Find("B", tar)); ASSERT_EQ(6, tar); SafeMap newdemo2; newdemo2 = newdemo; - ASSERT_EQ(newdemo2["A"], 1); + ASSERT_EQ(newdemo2.ReadVal("A"), 1); } /* @@ -216,10 +216,10 @@ HWTEST_F(UtilsSafeMap, testUtilsNormalFeatureIterate001, TestSize.Level0) demoData.Iterate(callback); ASSERT_EQ(demoData.Size(), 4); - ASSERT_EQ(demoData["A"], 2); - ASSERT_EQ(demoData["B"], 3); - ASSERT_EQ(demoData["C"], 4); - ASSERT_EQ(demoData["D"], 5); + ASSERT_EQ(demoData.ReadVal("A"), 2); + ASSERT_EQ(demoData.ReadVal("B"), 3); + ASSERT_EQ(demoData.ReadVal("C"), 4); + ASSERT_EQ(demoData.ReadVal("D"), 5); } /* @@ -261,7 +261,7 @@ HWTEST_F(UtilsSafeMap, testUtilsConcurrentIterate001, TestSize.Level0) } for (int i = 0; i < DATA_NUM - 1; i++) { - ASSERT_EQ(demoData["A" + std::to_string(i)], demoData["A" + std::to_string(i + 1)]); + ASSERT_EQ(demoData.ReadVal("A" + std::to_string(i)), demoData.ReadVal("A" + std::to_string(i + 1))); } }); } -- Gitee