From 874adaa6b1ca85afcf239193b105362ff0a1b23d Mon Sep 17 00:00:00 2001 From: Caoruihong Date: Fri, 10 Nov 2023 02:55:02 +0800 Subject: [PATCH] feat: unify the container id allocation Signed-off-by: Caoruihong --- adapter/ohos/entrance/ace_ability.cpp | 3 +- adapter/ohos/entrance/ace_data_ability.cpp | 7 +++- adapter/ohos/entrance/ace_data_ability.h | 9 +---- adapter/ohos/entrance/ace_form_ability.cpp | 3 +- adapter/ohos/entrance/ace_form_ability.h | 2 +- adapter/ohos/entrance/ace_service_ability.cpp | 7 +++- adapter/ohos/entrance/ace_service_ability.h | 9 +---- adapter/ohos/entrance/ui_content_impl.cpp | 13 +++---- frameworks/core/common/container.cpp | 18 +++++++++ frameworks/core/common/container.h | 37 +++++++++++++++++-- frameworks/core/common/container_scope.cpp | 21 ++--------- frameworks/core/common/container_scope.h | 20 ++++------ frameworks/core/common/plugin_manager.cpp | 2 +- frameworks/core/common/plugin_manager.h | 2 +- .../common/plugin/plugin_manager_test.cpp | 2 +- 15 files changed, 91 insertions(+), 64 deletions(-) diff --git a/adapter/ohos/entrance/ace_ability.cpp b/adapter/ohos/entrance/ace_ability.cpp index 06593c3ea29..26478f91189 100644 --- a/adapter/ohos/entrance/ace_ability.cpp +++ b/adapter/ohos/entrance/ace_ability.cpp @@ -60,7 +60,6 @@ const std::string LOCAL_BUNDLE_CODE_PATH = "/data/storage/el1/bundle/"; const std::string FILE_SEPARATOR = "/"; const std::string ACTION_VIEWDATA = "ohos.want.action.viewData"; constexpr int32_t PLATFORM_VERSION_TEN = 10; -static int32_t g_instanceId = 0; FrontendType GetFrontendType(const std::string& frontendType) { @@ -212,7 +211,7 @@ AceAbility::AceAbility() = default; void AceAbility::OnStart(const Want& want, sptr sessionInfo) { Ability::OnStart(want, sessionInfo); - abilityId_ = g_instanceId++; + abilityId_ = Container::GenerateId(); static std::once_flag onceFlag; auto abilityContext = GetAbilityContext(); auto cacheDir = abilityContext->GetCacheDir(); diff --git a/adapter/ohos/entrance/ace_data_ability.cpp b/adapter/ohos/entrance/ace_data_ability.cpp index ceef01b1c9a..01453c15d0a 100644 --- a/adapter/ohos/entrance/ace_data_ability.cpp +++ b/adapter/ohos/entrance/ace_data_ability.cpp @@ -57,11 +57,16 @@ private: DataPlatformFinish onFinish_; }; -int32_t AceDataAbility::instanceId_ = 200000; const std::string AceDataAbility::START_PARAMS_KEY = "__startParams"; const std::string AceDataAbility::URI = "url"; REGISTER_AA(AceDataAbility) + +AceDataAbility::AceDataAbility() +{ + abilityId_ = Container::GenerateId(); +} + void AceDataAbility::OnStart(const OHOS::AAFwk::Want& want, sptr sessionInfo) { Ability::OnStart(want, sessionInfo); diff --git a/adapter/ohos/entrance/ace_data_ability.h b/adapter/ohos/entrance/ace_data_ability.h index 5d81690e275..ea70422814f 100644 --- a/adapter/ohos/entrance/ace_data_ability.h +++ b/adapter/ohos/entrance/ace_data_ability.h @@ -28,11 +28,7 @@ namespace OHOS::Ace { class AceDataAbility final : public OHOS::AppExecFwk::Ability { public: - AceDataAbility() - { - abilityId_ = instanceId_; - instanceId_++; - } + AceDataAbility(); virtual ~AceDataAbility() = default; void OnStart(const OHOS::AAFwk::Want& want, sptr sessionInfo = nullptr) override; @@ -57,9 +53,8 @@ public: const Uri& uri, const std::string& method, const std::string& arg, const AppExecFwk::PacMap& pacMap) override; private: - int32_t abilityId_ = 200000; + int32_t abilityId_; - static int32_t instanceId_; static const std::string START_PARAMS_KEY; static const std::string URI; }; diff --git a/adapter/ohos/entrance/ace_form_ability.cpp b/adapter/ohos/entrance/ace_form_ability.cpp index c08cb54ddc2..b04b89e3111 100644 --- a/adapter/ohos/entrance/ace_form_ability.cpp +++ b/adapter/ohos/entrance/ace_form_ability.cpp @@ -54,7 +54,6 @@ private: FormPlatformFinish onFinish_; }; -int32_t AceFormAbility::instanceId_ = 300000; const std::string AceFormAbility::START_PARAMS_KEY = "__startParams"; const std::string AceFormAbility::URI = "url"; @@ -62,7 +61,7 @@ REGISTER_AA(AceFormAbility) AceFormAbility::AceFormAbility() { - instanceId_++; + instanceId_ = Container::GenerateId(); } void AceFormAbility::LoadFormEnv(const OHOS::AAFwk::Want& want) diff --git a/adapter/ohos/entrance/ace_form_ability.h b/adapter/ohos/entrance/ace_form_ability.h index 09deb23862b..664dd0e3884 100644 --- a/adapter/ohos/entrance/ace_form_ability.h +++ b/adapter/ohos/entrance/ace_form_ability.h @@ -116,7 +116,7 @@ public: private: void LoadFormEnv(const OHOS::AAFwk::Want& want); - static int32_t instanceId_; + int32_t instanceId_; static const std::string START_PARAMS_KEY; static const std::string URI; sptr formProviderRemoteObject_; diff --git a/adapter/ohos/entrance/ace_service_ability.cpp b/adapter/ohos/entrance/ace_service_ability.cpp index aa0513fad32..cca28da39fc 100644 --- a/adapter/ohos/entrance/ace_service_ability.cpp +++ b/adapter/ohos/entrance/ace_service_ability.cpp @@ -57,11 +57,16 @@ private: ServicePlatformFinish onFinish_; }; -int32_t AceServiceAbility::instanceId_ = 100000; const std::string AceServiceAbility::START_PARAMS_KEY = "__startParams"; const std::string AceServiceAbility::URI = "url"; REGISTER_AA(AceServiceAbility) + +AceServiceAbility::AceServiceAbility() +{ + abilityId_ = Container::GenerateId(); +} + void AceServiceAbility::OnStart(const OHOS::AAFwk::Want& want, sptr sessionInfo) { Ability::OnStart(want, sessionInfo); diff --git a/adapter/ohos/entrance/ace_service_ability.h b/adapter/ohos/entrance/ace_service_ability.h index 5bfc94e71e2..d22e2805ccf 100644 --- a/adapter/ohos/entrance/ace_service_ability.h +++ b/adapter/ohos/entrance/ace_service_ability.h @@ -30,11 +30,7 @@ namespace OHOS::Ace { class AceServiceAbility final : public OHOS::AppExecFwk::Ability { public: - AceServiceAbility() - { - abilityId_ = instanceId_; - instanceId_++; - } + AceServiceAbility(); virtual ~AceServiceAbility() = default; void OnStart(const OHOS::AAFwk::Want& want, sptr sessionInfo = nullptr) override; @@ -44,9 +40,8 @@ public: void OnCommand(const AAFwk::Want &want, bool restart, int startId) override; private: - int32_t abilityId_ = 100000; + int32_t abilityId_; - static int32_t instanceId_; static const std::string START_PARAMS_KEY; static const std::string URI; }; diff --git a/adapter/ohos/entrance/ui_content_impl.cpp b/adapter/ohos/entrance/ui_content_impl.cpp index 679c6c65a93..e3492cfc99a 100644 --- a/adapter/ohos/entrance/ui_content_impl.cpp +++ b/adapter/ohos/entrance/ui_content_impl.cpp @@ -89,9 +89,6 @@ const std::string ACTION_VIEWDATA = "ohos.want.action.viewData"; } // namespace -static std::atomic gInstanceId = 0; -static std::atomic gSubWindowInstanceId = 100000; -static std::atomic gSubInstanceId = 1000000; const std::string SUBWINDOW_PREFIX = "ARK_APP_SUBWINDOW_"; const std::string SUBWINDOW_TOAST_DIALOG_PREFIX = "ARK_APP_SUBWINDOW_TOAST_DIALOG_"; const int32_t REQUEST_CODE = -1; @@ -641,9 +638,9 @@ void UIContentImpl::CommonInitializeForm( #endif // create container if (runtime_) { - instanceId_ = gInstanceId.fetch_add(1, std::memory_order_relaxed); + instanceId_ = Container::GenerateId(); } else { - instanceId_ = gSubWindowInstanceId.fetch_add(1, std::memory_order_relaxed); + instanceId_ = Container::GenerateId(); } #ifdef FORM_SUPPORTED auto formUtils = std::make_shared(); @@ -1101,9 +1098,9 @@ void UIContentImpl::CommonInitialize(OHOS::Rosen::Window* window, const std::str #endif // create container if (runtime_) { - instanceId_ = gInstanceId.fetch_add(1, std::memory_order_relaxed); + instanceId_ = Container::GenerateId(); } else { - instanceId_ = gSubWindowInstanceId.fetch_add(1, std::memory_order_relaxed); + instanceId_ = Container::GenerateId(); } #ifdef FORM_SUPPORTED auto formUtils = std::make_shared(); @@ -1634,7 +1631,7 @@ void UIContentImpl::InitializeSubWindow(OHOS::Rosen::Window* window, bool isDial LOGI("The window name is %{public}s", window->GetWindowName().c_str()); CHECK_NULL_VOID(window_); RefPtr container; - instanceId_ = gSubInstanceId.fetch_add(1, std::memory_order_relaxed); + instanceId_ = Container::GenerateId(); std::weak_ptr abilityInfo; std::weak_ptr runtimeContext; diff --git a/frameworks/core/common/container.cpp b/frameworks/core/common/container.cpp index c493d7dc107..857c323cd0e 100644 --- a/frameworks/core/common/container.cpp +++ b/frameworks/core/common/container.cpp @@ -18,6 +18,9 @@ #include "base/utils/utils.h" #include "core/common/ace_engine.h" #include "core/common/container_scope.h" +#ifdef PLUGIN_COMPONENT_SUPPORTED +#include "core/common/plugin_manager.h" +#endif namespace OHOS::Ace { @@ -85,4 +88,19 @@ bool Container::Dump(const std::vector& params, std::vector +int32_t Container::GenerateId() +{ +#ifdef PLUGIN_COMPONENT_SUPPORTED + return PluginManager::GetInstance().GetPluginSubContainerId(); +#else + return INSTANCE_ID_UNDEFINED; +#endif +} + } // namespace OHOS::Ace diff --git a/frameworks/core/common/container.h b/frameworks/core/common/container.h index 82f25e7eada..a5bdaca320d 100755 --- a/frameworks/core/common/container.h +++ b/frameworks/core/common/container.h @@ -19,6 +19,7 @@ #include #include #include +#include #include "interfaces/inner_api/ace/ace_forward_compatibility.h" @@ -51,9 +52,19 @@ using CardViewPositionCallBack = std::function; using StopDragCallback = std::function; -constexpr int32_t INSTANCE_ID_UNDEFINED = -1; -constexpr int32_t INSTANCE_ID_PLATFORM = -2; -constexpr int32_t MIN_PLUGIN_SUBCONTAINER_ID = 2000000; +enum ContainerType { + STAGE_CONTAINER = 1, + FA_CONTAINER, + PA_SERVICE_CONTAINER, + PA_DATA_CONTAINER, + PA_FORM_CONTAINER, + FA_SUBWINDOW_CONTAINER, + COMPONENT_SUBWINDOW_CONTAINER, + PLUGIN_SUBCONTAINER = 20, +}; + +constexpr int32_t CONTAINER_ID_DIVIDE_SIZE = 100000; +constexpr int32_t MIN_PLUGIN_SUBCONTAINER_ID = PLUGIN_SUBCONTAINER * CONTAINER_ID_DIVIDE_SIZE; class ACE_FORCE_EXPORT Container : public virtual AceType { DECLARE_ACE_TYPE(Container, AceType); @@ -380,6 +391,12 @@ public: return appBar_; } + template + static int32_t GenerateId(); + +private: + static bool IsIdAvailable(int32_t id); + protected: std::chrono::time_point createTime_; bool firstUpdateData_ = true; @@ -403,6 +420,20 @@ private: ACE_DISALLOW_COPY_AND_MOVE(Container); }; +template +int32_t Container::GenerateId() +{ + static std::atomic gInstanceId; + int32_t id; + do { + id = type * CONTAINER_ID_DIVIDE_SIZE + gInstanceId.fetch_add(1) % CONTAINER_ID_DIVIDE_SIZE; + } while (!IsIdAvailable(id)); + return id; +} + +template<> +int32_t Container::GenerateId(); + } // namespace OHOS::Ace #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMMON_CONTAINER_H diff --git a/frameworks/core/common/container_scope.cpp b/frameworks/core/common/container_scope.cpp index fbcf4895cb3..15daa87a94f 100644 --- a/frameworks/core/common/container_scope.cpp +++ b/frameworks/core/common/container_scope.cpp @@ -14,21 +14,17 @@ */ #include "core/common/container_scope.h" - -#include - #include "base/utils/utils.h" namespace OHOS::Ace { - +namespace { // preview not support multi-instance, always using default instance id 0. #if defined(PREVIEW) -thread_local int32_t ContainerScope::currentId_ = 0; +thread_local int32_t currentId_ = 0; #else -thread_local int32_t ContainerScope::currentId_ = -1; +thread_local int32_t currentId_ = INSTANCE_ID_UNDEFINED; #endif -std::function ContainerScope::updateScopeNotify_; -std::shared_mutex ContainerScope::scopeLock_; +} int32_t ContainerScope::CurrentId() { @@ -38,15 +34,6 @@ int32_t ContainerScope::CurrentId() void ContainerScope::UpdateCurrent(int32_t id) { currentId_ = id; - std::shared_lock readLock(scopeLock_); - CHECK_NULL_VOID(updateScopeNotify_); - updateScopeNotify_(id); -} - -void ContainerScope::SetScopeNotify(std::function&& notify) -{ - std::unique_lock writeLock(scopeLock_); - updateScopeNotify_ = std::move(notify); } } // namespace OHOS::Ace diff --git a/frameworks/core/common/container_scope.h b/frameworks/core/common/container_scope.h index 927192b8072..0bf416e920f 100644 --- a/frameworks/core/common/container_scope.h +++ b/frameworks/core/common/container_scope.h @@ -16,39 +16,35 @@ #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMMON_CONTAINER_SCOPE_H #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMMON_CONTAINER_SCOPE_H -#include -#include -#include +#include #include "base/utils/macros.h" #include "base/utils/noncopyable.h" namespace OHOS::Ace { +constexpr int32_t INSTANCE_ID_UNDEFINED = -1; +constexpr int32_t INSTANCE_ID_PLATFORM = -2; + class ACE_EXPORT ContainerScope { public: explicit ContainerScope(int32_t id) { - restoreId_ = ContainerScope::CurrentId(); - ContainerScope::UpdateCurrent(id); + restoreId_ = CurrentId(); + UpdateCurrent(id); } ~ContainerScope() { - ContainerScope::UpdateCurrent(restoreId_); + UpdateCurrent(restoreId_); } static int32_t CurrentId(); static void UpdateCurrent(int32_t id); - static void SetScopeNotify(std::function&& notify); - private: - static thread_local int32_t currentId_; - int32_t restoreId_ = -1; - static std::function updateScopeNotify_; - static std::shared_mutex scopeLock_; + int32_t restoreId_ = INSTANCE_ID_UNDEFINED; ACE_DISALLOW_COPY_AND_MOVE(ContainerScope); }; diff --git a/frameworks/core/common/plugin_manager.cpp b/frameworks/core/common/plugin_manager.cpp index 1c844707726..2de7a6c316e 100755 --- a/frameworks/core/common/plugin_manager.cpp +++ b/frameworks/core/common/plugin_manager.cpp @@ -127,7 +127,7 @@ void PluginManager::RemovePluginParentContainer(int64_t pluginId) parentContainerMap_.erase(pluginId); } -int64_t PluginManager::GetPluginParentContainerId(int64_t pluginId) +int32_t PluginManager::GetPluginParentContainerId(int64_t pluginId) { std::lock_guard lock(parentContainerMutex_); auto result = parentContainerMap_.find(pluginId); diff --git a/frameworks/core/common/plugin_manager.h b/frameworks/core/common/plugin_manager.h index d1a70e78244..b5bd8750d22 100644 --- a/frameworks/core/common/plugin_manager.h +++ b/frameworks/core/common/plugin_manager.h @@ -39,7 +39,7 @@ public: RefPtr GetPluginSubContainer(int64_t pluginId); RefPtr MatchPluginSubContainerWithPluginId(int64_t pluginId, const std::string& pluginKey); int64_t GetPluginSubContainerId(); - int64_t GetPluginParentContainerId(int64_t pluginId); + int32_t GetPluginParentContainerId(int64_t pluginId); void SetJsEngineLoader(Framework::JsEngineLoader* jsEngineLoader) { jsEngineLoader_ = jsEngineLoader; diff --git a/test/unittest/core/common/plugin/plugin_manager_test.cpp b/test/unittest/core/common/plugin/plugin_manager_test.cpp index 772e5b971e5..2189777e1c0 100644 --- a/test/unittest/core/common/plugin/plugin_manager_test.cpp +++ b/test/unittest/core/common/plugin/plugin_manager_test.cpp @@ -30,7 +30,7 @@ using namespace testing::ext; namespace OHOS::Ace { namespace { const int64_t PLUGIN_ID = 10000; -const int64_t PARENT_ID = 1000; +const int32_t PARENT_ID = 1000; } // namespace class PluginManagerTest : public testing::Test { public: -- Gitee