diff --git a/services/sandbox_manager/main/cpp/include/service/sandbox_manager_service.h b/services/sandbox_manager/main/cpp/include/service/sandbox_manager_service.h index 20f0ac42b31a4e183252d68bc56db0bde3dec6fc..57926702c77d6cf87d9e839c19c0e782b85f33c4 100644 --- a/services/sandbox_manager/main/cpp/include/service/sandbox_manager_service.h +++ b/services/sandbox_manager/main/cpp/include/service/sandbox_manager_service.h @@ -66,12 +66,15 @@ public: private: bool Initialize(); + bool InitDelayUnloadHandler(); void OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId) override; bool StartByEventAction(const SystemAbilityOnDemandReason& startReason); std::mutex stateMutex_; ServiceRunningState state_; + std::mutex unloadMutex_; std::shared_ptr unloadHandler_ = nullptr; + std::shared_ptr unloadRunner_ = nullptr; }; } // namespace SandboxManager } // namespace AccessControl diff --git a/services/sandbox_manager/main/cpp/src/service/sandbox_manager_service.cpp b/services/sandbox_manager/main/cpp/src/service/sandbox_manager_service.cpp index 3bcc3249762708e6832741ee1f34b627edeee2aa..c7c7f99eae4511fb09ca5940a813c3b46c06ad57 100644 --- a/services/sandbox_manager/main/cpp/src/service/sandbox_manager_service.cpp +++ b/services/sandbox_manager/main/cpp/src/service/sandbox_manager_service.cpp @@ -82,6 +82,7 @@ void SandboxManagerService::OnStart() SANDBOXMANAGER_LOG_ERROR(LABEL, "Failed to publish service! "); return; } + DelayUnloadService(); SANDBOXMANAGER_LOG_INFO(LABEL, "SandboxManagerService start successful."); } @@ -125,6 +126,8 @@ void SandboxManagerService::OnStart(const SystemAbilityOnDemandReason& startReas SANDBOXMANAGER_LOG_ERROR(LABEL, "Failed to publish service."); return; } + DelayUnloadService(); + SANDBOXMANAGER_LOG_INFO(LABEL, "SandboxManagerService start successful."); } int32_t SandboxManagerService::CleanPersistPolicyByPath(const std::vector& filePathList) @@ -330,7 +333,6 @@ int32_t SandboxManagerService::UnSetAllPolicyByToken(uint32_t tokenId) bool SandboxManagerService::Initialize() { - DelayUnloadService(); PolicyInfoManager::GetInstance().Init(); AddSystemAbilityListener(COMMON_EVENT_SERVICE_ID); return true; @@ -343,14 +345,31 @@ void SandboxManagerService::OnAddSystemAbility(int32_t systemAbilityId, const st } } -void SandboxManagerService::DelayUnloadService() +bool SandboxManagerService::InitDelayUnloadHandler() { + if ((unloadRunner_ != nullptr) && (unloadHandler_ != nullptr)) { + SANDBOXMANAGER_LOG_INFO(LABEL, "UnloadRunner_ and UnloadHandler_ already init."); + return true; + } + unloadRunner_ = EventRunner::Create(SA_ID_SANDBOX_MANAGER_SERVICE, AppExecFwk::ThreadMode::FFRT); + if (unloadRunner_ == nullptr) { + SANDBOXMANAGER_LOG_ERROR(LABEL, "UnloadRunner_ init failed."); + return false; + } + unloadHandler_ = std::make_shared(unloadRunner_); if (unloadHandler_ == nullptr) { - std::shared_ptr runner - = EventRunner::Create(SA_ID_SANDBOX_MANAGER_SERVICE); - unloadHandler_ = std::make_shared(runner); + SANDBOXMANAGER_LOG_ERROR(LABEL, "UnloadHandler_ init failed."); + return false; } + return true; +} +void SandboxManagerService::DelayUnloadService() +{ + std::lock_guard lock(unloadMutex_); + if (!InitDelayUnloadHandler()) { + return; + } auto task = [this]() { auto samgrProxy = OHOS::SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); if (samgrProxy == nullptr) { @@ -365,6 +384,7 @@ void SandboxManagerService::DelayUnloadService() }; unloadHandler_->RemoveTask("SandboxManagerUnload"); unloadHandler_->PostTask(task, "SandboxManagerUnload", SA_LIFE_TIME); + SANDBOXMANAGER_LOG_INFO(LABEL, "Delay unload task updated."); } bool SandboxManagerService::StartByEventAction(const SystemAbilityOnDemandReason& startReason) diff --git a/services/sandbox_manager/main/cpp/src/service/sandbox_manager_stub.cpp b/services/sandbox_manager/main/cpp/src/service/sandbox_manager_stub.cpp index 8e90e9e1d744eed73d1d43fa707f45675fe40298..6287dc5b9cdbaa7c1e6f70037b2ff2aaa9dab94d 100644 --- a/services/sandbox_manager/main/cpp/src/service/sandbox_manager_stub.cpp +++ b/services/sandbox_manager/main/cpp/src/service/sandbox_manager_stub.cpp @@ -53,11 +53,11 @@ int32_t SandboxManagerStub::OnRemoteRequest( SANDBOXMANAGER_LOG_ERROR(LABEL, "get unexpect descriptor: %{public}s", Str16ToStr8(descriptor).c_str()); return -1; } - DelayUnloadService(); auto itFunc = requestFuncMap_.find(code); if (itFunc != requestFuncMap_.end()) { auto requestFunc = itFunc->second; if (requestFunc != nullptr) { + DelayUnloadService(); return (this->*requestFunc)(data, reply); } else { // when valid code without any function to handle