1 /* 2 * Copyright (c) 2025 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #include "frameworks/core/pipeline/base/element_register_multi_thread.h" 17 18 #include "core/components_ng/base/ui_node.h" 19 #include "frameworks/core/pipeline/base/element_register.h" 20 21 namespace OHOS::Ace { GetInstance()22ElementRegisterMultiThread* ElementRegisterMultiThread::GetInstance() 23 { 24 static ElementRegisterMultiThread instance; 25 return &instance; 26 } 27 AddUINodeMultiThread(const RefPtr<NG::UINode> & node)28bool ElementRegisterMultiThread::AddUINodeMultiThread(const RefPtr<NG::UINode>& node) 29 { 30 if (!node || (node->GetId() == ElementRegister::UndefinedElementId)) { 31 return false; 32 } 33 return AddThreadSafeNode(node); 34 } 35 AddThreadSafeNode(const RefPtr<NG::UINode> & node)36bool ElementRegisterMultiThread::AddThreadSafeNode(const RefPtr<NG::UINode>& node) 37 { 38 std::unique_lock<std::shared_mutex> lock(threadSafeNodeMapMutex_); 39 auto result = threadSafeNodeMap_.emplace(node->GetId(), node); 40 if (!result.second) { 41 LOGE("Duplicate elmtId %{public}d error.", node->GetId()); 42 } 43 return result.second; 44 } 45 GetThreadSafeNodeById(ElementIdType elementId)46RefPtr<NG::UINode> ElementRegisterMultiThread::GetThreadSafeNodeById(ElementIdType elementId) 47 { 48 if (elementId == ElementRegister::UndefinedElementId) { 49 return nullptr; 50 } 51 std::shared_lock<std::shared_mutex> lock(threadSafeNodeMapMutex_); 52 auto iter = threadSafeNodeMap_.find(elementId); 53 return iter == threadSafeNodeMap_.end() ? nullptr : 54 AceType::DynamicCast<NG::UINode>(iter->second).Upgrade(); 55 } 56 RemoveThreadSafeNode(ElementIdType elementId)57bool ElementRegisterMultiThread::RemoveThreadSafeNode(ElementIdType elementId) 58 { 59 if (elementId == ElementRegister::UndefinedElementId) { 60 return false; 61 } 62 std::unique_lock<std::shared_mutex> lock(threadSafeNodeMapMutex_); 63 return threadSafeNodeMap_.erase(elementId); 64 } 65 } // namespace OHOS::Ace