18bf80f4bSopenharmony_ci/* 28bf80f4bSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 38bf80f4bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 48bf80f4bSopenharmony_ci * you may not use this file except in compliance with the License. 58bf80f4bSopenharmony_ci * You may obtain a copy of the License at 68bf80f4bSopenharmony_ci * 78bf80f4bSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 88bf80f4bSopenharmony_ci * 98bf80f4bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 108bf80f4bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 118bf80f4bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 128bf80f4bSopenharmony_ci * See the License for the specific language governing permissions and 138bf80f4bSopenharmony_ci * limitations under the License. 148bf80f4bSopenharmony_ci */ 158bf80f4bSopenharmony_ci 168bf80f4bSopenharmony_ci#ifndef META_SRC_STARTABLE_OBJECT_CONTROLLER_H 178bf80f4bSopenharmony_ci#define META_SRC_STARTABLE_OBJECT_CONTROLLER_H 188bf80f4bSopenharmony_ci 198bf80f4bSopenharmony_ci#include <shared_mutex> 208bf80f4bSopenharmony_ci 218bf80f4bSopenharmony_ci#include <base/containers/unordered_map.h> 228bf80f4bSopenharmony_ci 238bf80f4bSopenharmony_ci#include <meta/api/timer.h> 248bf80f4bSopenharmony_ci#include <meta/ext/attachment/attachment.h> 258bf80f4bSopenharmony_ci#include <meta/interface/builtin_objects.h> 268bf80f4bSopenharmony_ci#include <meta/interface/intf_object_hierarchy_observer.h> 278bf80f4bSopenharmony_ci#include <meta/interface/intf_startable_controller.h> 288bf80f4bSopenharmony_ci#include <meta/interface/intf_task_queue.h> 298bf80f4bSopenharmony_ci#include <meta/interface/intf_tickable_controller.h> 308bf80f4bSopenharmony_ci 318bf80f4bSopenharmony_ciMETA_BEGIN_NAMESPACE() 328bf80f4bSopenharmony_ci 338bf80f4bSopenharmony_ciclass IStartableObjectControllerInternal : public CORE_NS::IInterface { 348bf80f4bSopenharmony_ci META_INTERFACE(CORE_NS::IInterface, IStartableObjectControllerInternal, "fd5c13af-de72-4cc4-bed0-07cb6a751ac1") 358bf80f4bSopenharmony_cipublic: 368bf80f4bSopenharmony_ci /** 378bf80f4bSopenharmony_ci * @brief Run tasks with given queueId. 388bf80f4bSopenharmony_ci */ 398bf80f4bSopenharmony_ci virtual void RunTasks(const BASE_NS::Uid& queueId) = 0; 408bf80f4bSopenharmony_ci}; 418bf80f4bSopenharmony_ci 428bf80f4bSopenharmony_ciclass StartableObjectController 438bf80f4bSopenharmony_ci : public META_NS::MetaObjectFwd<StartableObjectController, ClassId::StartableObjectController, ClassId::MetaObject, 448bf80f4bSopenharmony_ci IStartableController, IObjectHierarchyObserver, IStartableObjectControllerInternal, ITickableController> { 458bf80f4bSopenharmony_cipublic: // ILifeCycle 468bf80f4bSopenharmony_ci bool Build(const IMetadata::Ptr& data) override; 478bf80f4bSopenharmony_ci void Destroy() override; 488bf80f4bSopenharmony_ci 498bf80f4bSopenharmony_cipublic: // IStartableController 508bf80f4bSopenharmony_ci META_IMPLEMENT_INTERFACE_PROPERTY( 518bf80f4bSopenharmony_ci IStartableController, META_NS::TraversalType, TraversalType, META_NS::TraversalType::DEPTH_FIRST_POST_ORDER) 528bf80f4bSopenharmony_ci META_IMPLEMENT_INTERFACE_PROPERTY( 538bf80f4bSopenharmony_ci IStartableController, META_NS::StartBehavior, StartBehavior, META_NS::StartBehavior::AUTOMATIC) 548bf80f4bSopenharmony_ci bool StartAll(ControlBehavior behavior) override; 558bf80f4bSopenharmony_ci bool StopAll(ControlBehavior behavior) override; 568bf80f4bSopenharmony_ci BASE_NS::vector<IStartable::Ptr> GetAllStartables() const override; 578bf80f4bSopenharmony_ci bool SetStartableQueueId( 588bf80f4bSopenharmony_ci const BASE_NS::Uid& startStartableQueueId, const BASE_NS::Uid& stopStartableQueueId) override; 598bf80f4bSopenharmony_ci 608bf80f4bSopenharmony_cipublic: // IObjectHierarchyObserver 618bf80f4bSopenharmony_ci void SetTarget(const IObject::Ptr& root, HierarchyChangeModeValue mode) override; 628bf80f4bSopenharmony_ci IObject::Ptr GetTarget() const override; 638bf80f4bSopenharmony_ci BASE_NS::vector<IObject::Ptr> GetAllObserved() const override; 648bf80f4bSopenharmony_ci META_FORWARD_EVENT(IOnHierarchyChanged, OnHierarchyChanged, observer_->EventOnHierarchyChanged()) 658bf80f4bSopenharmony_ci 668bf80f4bSopenharmony_cipublic: // ITickableController 678bf80f4bSopenharmony_ci BASE_NS::vector<ITickable::Ptr> GetTickables() const override; 688bf80f4bSopenharmony_ci void TickAll(const TimeSpan& time) override; 698bf80f4bSopenharmony_ci META_IMPLEMENT_INTERFACE_PROPERTY( 708bf80f4bSopenharmony_ci ITickableController, META_NS::TimeSpan, TickInterval, META_NS::TimeSpan::Infinite()) 718bf80f4bSopenharmony_ci META_IMPLEMENT_INTERFACE_PROPERTY( 728bf80f4bSopenharmony_ci ITickableController, META_NS::TraversalType, TickOrder, META_NS::TraversalType::DEPTH_FIRST_PRE_ORDER) 738bf80f4bSopenharmony_ci bool SetTickableQueueuId(const BASE_NS::Uid& queueId) override; 748bf80f4bSopenharmony_ci 758bf80f4bSopenharmony_ciprivate: 768bf80f4bSopenharmony_ci void StartHierarchy(const IObject::Ptr& root, ControlBehavior behavior); 778bf80f4bSopenharmony_ci void StopHierarchy(const IObject::Ptr& root, ControlBehavior behavior); 788bf80f4bSopenharmony_ci void StartStartable(IStartable* const startable, ControlBehavior behavior); 798bf80f4bSopenharmony_ci void StopStartable(IStartable* const startable, ControlBehavior behavior); 808bf80f4bSopenharmony_ci void HierarchyChanged(const HierarchyChangedInfo& info); 818bf80f4bSopenharmony_ci 828bf80f4bSopenharmony_ci IObject::WeakPtr target_; 838bf80f4bSopenharmony_ci IObjectHierarchyObserver::Ptr observer_; 848bf80f4bSopenharmony_ci 858bf80f4bSopenharmony_ciprivate: // IStartableObjectControllerInternal 868bf80f4bSopenharmony_ci void RunTasks(const BASE_NS::Uid& queueId) override; 878bf80f4bSopenharmony_ci 888bf80f4bSopenharmony_ciprivate: // Task queue handling 898bf80f4bSopenharmony_ci struct StartableOperation { 908bf80f4bSopenharmony_ci enum Operation { 918bf80f4bSopenharmony_ci /** Run StartHierarchy() for root_ */ 928bf80f4bSopenharmony_ci START, 938bf80f4bSopenharmony_ci /** Run StopHierarchy() for root_ */ 948bf80f4bSopenharmony_ci STOP, 958bf80f4bSopenharmony_ci }; 968bf80f4bSopenharmony_ci 978bf80f4bSopenharmony_ci Operation operation_; 988bf80f4bSopenharmony_ci IObject::WeakPtr root_; 998bf80f4bSopenharmony_ci }; 1008bf80f4bSopenharmony_ci 1018bf80f4bSopenharmony_ci BASE_NS::Uid startQueueId_; 1028bf80f4bSopenharmony_ci BASE_NS::Uid stopQueueId_; 1038bf80f4bSopenharmony_ci bool HasTasks(const BASE_NS::Uid& queueId) const; 1048bf80f4bSopenharmony_ci bool ProcessOps(const BASE_NS::Uid& queueId); 1058bf80f4bSopenharmony_ci bool AddOperation(StartableOperation&& operation, const BASE_NS::Uid& queue); 1068bf80f4bSopenharmony_ci BASE_NS::unordered_map<BASE_NS::Uid, BASE_NS::vector<StartableOperation>> operations_; 1078bf80f4bSopenharmony_ci mutable std::shared_mutex mutex_; 1088bf80f4bSopenharmony_ci std::size_t executingStart_ {}; 1098bf80f4bSopenharmony_ci 1108bf80f4bSopenharmony_ciprivate: // Tickables 1118bf80f4bSopenharmony_ci void InvalidateTickables(); 1128bf80f4bSopenharmony_ci void UpdateTicker(); 1138bf80f4bSopenharmony_ci mutable BASE_NS::vector<ITickable::WeakPtr> tickables_; 1148bf80f4bSopenharmony_ci mutable std::shared_mutex tickMutex_; 1158bf80f4bSopenharmony_ci mutable bool tickablesValid_ { false }; 1168bf80f4bSopenharmony_ci TimeSpan lastTick_ { TimeSpan::Infinite() }; 1178bf80f4bSopenharmony_ci IClock::Ptr clock_; 1188bf80f4bSopenharmony_ci BASE_NS::Uid tickQueueId_; 1198bf80f4bSopenharmony_ci ITaskQueue::Ptr tickerQueue_; 1208bf80f4bSopenharmony_ci ITaskQueue::Ptr defaultTickerQueue_; 1218bf80f4bSopenharmony_ci ITaskQueueTask::Ptr tickerTask_; 1228bf80f4bSopenharmony_ci ITaskQueue::Token tickerToken_ {}; 1238bf80f4bSopenharmony_ci}; 1248bf80f4bSopenharmony_ci 1258bf80f4bSopenharmony_ciMETA_END_NAMESPACE() 1268bf80f4bSopenharmony_ci 1278bf80f4bSopenharmony_ci#endif // META_SRC_STARTABLE_OBJECT_CONTROLLER_H 128