From c668d9ff55616acdb34c7be80f8dbd4eae4fcbcb Mon Sep 17 00:00:00 2001 From: j21p3 Date: Fri, 6 Sep 2024 14:54:04 +0800 Subject: [PATCH] instance multithread safty Change-Id: I4d77c7b307b5d288e3eba051987797ce5d404f6b Signed-off-by: j21p3 --- .../sandbox_manager/src/sandbox_manager_client.cpp | 11 +++++++++-- .../main/cpp/src/database/sandbox_manager_db.cpp | 11 +++++++++-- .../main/cpp/src/service/policy_info_manager.cpp | 11 +++++++++-- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/interfaces/innerkits/sandbox_manager/src/sandbox_manager_client.cpp b/interfaces/innerkits/sandbox_manager/src/sandbox_manager_client.cpp index bce3393..8c85cc5 100644 --- a/interfaces/innerkits/sandbox_manager/src/sandbox_manager_client.cpp +++ b/interfaces/innerkits/sandbox_manager/src/sandbox_manager_client.cpp @@ -31,6 +31,7 @@ namespace { static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, ACCESSCONTROL_DOMAIN_SANDBOXMANAGER, "SandboxManagerClient" }; +static std::mutex g_instanceMutex; static const int32_t SANDBOX_MANAGER_LOAD_SA_TIMEOUT_SEC = 4; static const int32_t SANDBOX_MANAGER_LOAD_SA_TRY_TIMES = 2; static const int32_t SA_REQUEST_RETRY_TIMES = 1; @@ -42,8 +43,14 @@ static const std::vector RETRY_CODE_LIST = { SandboxManagerClient& SandboxManagerClient::GetInstance() { - static SandboxManagerClient instance; - return instance; + static SandboxManagerClient* instance = nullptr; + if (instance == nullptr) { + std::lock_guard lock(g_instanceMutex); + if (instance == nullptr) { + instance = new SandboxManagerClient(); + } + } + return *instance; } SandboxManagerClient::SandboxManagerClient() diff --git a/services/sandbox_manager/main/cpp/src/database/sandbox_manager_db.cpp b/services/sandbox_manager/main/cpp/src/database/sandbox_manager_db.cpp index 5b36200..265a845 100644 --- a/services/sandbox_manager/main/cpp/src/database/sandbox_manager_db.cpp +++ b/services/sandbox_manager/main/cpp/src/database/sandbox_manager_db.cpp @@ -28,6 +28,7 @@ static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, ACCESSCONTROL_DOMAIN_SANDBOXMANAGER, "SandboxManagerDb"}; static const std::string INTEGER_STR = " integer not null,"; static const std::string TEXT_STR = " text not null,"; +static std::mutex g_instanceMutex; } const std::string SandboxManagerDb::IGNORE = "ignore"; @@ -35,8 +36,14 @@ const std::string SandboxManagerDb::REPLACE = "replace"; SandboxManagerDb& SandboxManagerDb::GetInstance() { - static SandboxManagerDb instance; - return instance; + static SandboxManagerDb* instance = nullptr; + if (instance == nullptr) { + std::lock_guard lock(g_instanceMutex); + if (instance == nullptr) { + instance = new SandboxManagerDb(); + } + } + return *instance; } SandboxManagerDb::~SandboxManagerDb() diff --git a/services/sandbox_manager/main/cpp/src/service/policy_info_manager.cpp b/services/sandbox_manager/main/cpp/src/service/policy_info_manager.cpp index c755c4f..f5ef431 100644 --- a/services/sandbox_manager/main/cpp/src/service/policy_info_manager.cpp +++ b/services/sandbox_manager/main/cpp/src/service/policy_info_manager.cpp @@ -41,12 +41,19 @@ namespace { static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, ACCESSCONTROL_DOMAIN_SANDBOXMANAGER, "SandboxPolicyInfoManager" }; +static std::mutex g_instanceMutex; } PolicyInfoManager &PolicyInfoManager::GetInstance() { - static PolicyInfoManager instance; - return instance; + static PolicyInfoManager* instance = nullptr; + if (instance == nullptr) { + std::lock_guard lock(g_instanceMutex); + if (instance == nullptr) { + instance = new PolicyInfoManager(); + } + } + return *instance; } void PolicyInfoManager::Init() -- Gitee