• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 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 #ifndef META_SRC_OBJECT_REGISTRY_H
17 #define META_SRC_OBJECT_REGISTRY_H
18 
19 #include <atomic>
20 #include <shared_mutex>
21 
22 #include <base/containers/unordered_map.h>
23 
24 #include <meta/base/interface_macros.h>
25 #include <meta/base/namespace.h>
26 #include <meta/interface/animation/intf_interpolator.h>
27 #include <meta/interface/engine/intf_engine_data.h>
28 #include <meta/interface/intf_call_context.h>
29 #include <meta/interface/intf_metadata.h>
30 #include <meta/interface/intf_object_context.h>
31 #include <meta/interface/intf_object_registry.h>
32 #include <meta/interface/intf_task_queue_registry.h>
33 
34 #include "class_registry.h"
35 
META_BEGIN_NAMESPACE()36 META_BEGIN_NAMESPACE()
37 
38 class IRandom {
39 public:
40     virtual ~IRandom() = default;
41     virtual void Initialize(uint64_t seed) = 0;
42     virtual uint64_t GetRandom() = 0;
43 };
44 
45 class ObjectRegistry final : public IObjectRegistry,
46                              public ITaskQueueRegistry,
47                              public IPropertyRegister,
48                              public IGlobalSerializationData,
49                              public IEngineData {
50 public:
51     META_NO_COPY_MOVE(ObjectRegistry)
52 
53     ObjectRegistry();
54     ~ObjectRegistry() override;
55 
56     IClassRegistry& GetClassRegistry() override;
57 
58     bool RegisterObjectType(const IClassInfo::Ptr& classInfo) override;
59     bool UnregisterObjectType(const IClassInfo::Ptr& classInfo) override;
60 
61     IObject::Ptr Create(ObjectId uid, const CreateInfo& createInfo, const IMetadata::Ptr& data) const override;
62     IObject::Ptr Create(ObjectId uid, const CreateInfo& createInfo) const override;
63     IObject::Ptr Create(const ClassInfo& info, const CreateInfo& createInfo) const override;
64 
65     IObjectFactory::ConstPtr GetObjectFactory(const ObjectId& uid) const override;
66     BASE_NS::vector<ObjectCategoryItem> GetAllCategories() const override;
67     BASE_NS::vector<IClassInfo::ConstPtr> GetAllTypes(
68         ObjectCategoryBits category, bool strict, bool excludeDeprecated) const override;
69 
70     IObject::Ptr GetObjectInstanceByInstanceId(InstanceId uid) const override;
71     BASE_NS::vector<IObject::Ptr> GetAllObjectInstances() const override;
72     BASE_NS::vector<IObject::Ptr> GetAllSingletonObjectInstances() const override;
73     BASE_NS::vector<IObject::Ptr> GetObjectInstancesByCategory(ObjectCategoryBits category, bool strict) const override;
74 
75     BASE_NS::string ExportToString(const IObjectRegistryExporter::Ptr& exporter) const override;
76     IObjectContext::Ptr GetDefaultObjectContext() const override;
77 
78     void Purge() override;
79     void DisposeObject(const InstanceId&) const override;
80     ICallContext::Ptr ConstructDefaultCallContext() const override;
81 
82     const IInterface* GetInterface(const BASE_NS::Uid& uid) const override;
83     IInterface* GetInterface(const BASE_NS::Uid& uid) override;
84 
85     IPropertyRegister& GetPropertyRegister() override;
86     bool IsPropertyRegistered(const ObjectId& id) const override;
87     IProperty::Ptr Create(const ObjectId& object, BASE_NS::string_view name) const override;
88     IBind::Ptr CreateBind() const override;
89     IAny& InvalidAny() const override;
90     IAny::Ptr ConstructAny(const ObjectId& id) const override;
91     bool IsAnyRegistered(const ObjectId& id) const override;
92     void RegisterAny(BASE_NS::shared_ptr<AnyBuilder> builder) override;
93     void UnregisterAny(const ObjectId& id) override;
94 
95     // Interpolators
96     void RegisterInterpolator(TypeId propertyTypeUid, BASE_NS::Uid interpolatorClassUid) override;
97     void UnregisterInterpolator(TypeId propertyTypeUid) override;
98     bool HasInterpolator(TypeId propertyTypeUid) const override;
99     IInterpolator::Ptr CreateInterpolator(TypeId propertyTypeUid) override;
100 
101     IGlobalSerializationData& GetGlobalSerializationData() override;
102     SerializationSettings GetDefaultSettings() const override;
103     void SetDefaultSettings(const SerializationSettings& settings) override;
104     void RegisterGlobalObject(const IObject::Ptr& object) override;
105     void UnregisterGlobalObject(const IObject::Ptr& object) override;
106     IObject::Ptr GetGlobalObject(const InstanceId& id) const override;
107     void RegisterValueSerializer(const IValueSerializer::Ptr&) override;
108     void UnregisterValueSerializer(const TypeId& id) override;
109     IValueSerializer::Ptr GetValueSerializer(const TypeId& id) const override;
110 
111     IEngineInternalValueAccess::Ptr GetInternalValueAccess(const CORE_NS::PropertyTypeDecl& type) const override;
112     void RegisterInternalValueAccess(const CORE_NS::PropertyTypeDecl& type, IEngineInternalValueAccess::Ptr) override;
113     void UnregisterInternalValueAccess(const CORE_NS::PropertyTypeDecl& type) override;
114     IEngineData& GetEngineData() override;
115 
116     IObject::Ptr DefaultResolveObject(const IObjectInstance::Ptr& base, const RefUri& uri) const override;
117     IMetadata::Ptr ConstructObjectDataContainer() override;
118 
119 protected:
120     void Ref() override;
121     void Unref() override;
122 
123 protected: // ITaskQueueRegistry
124     ITaskQueue::Ptr GetTaskQueue(const BASE_NS::Uid& queueId) const override;
125     bool RegisterTaskQueue(const ITaskQueue::Ptr& queue, const BASE_NS::Uid& queueId) override;
126     bool UnregisterTaskQueue(const BASE_NS::Uid& queueId) override;
127     bool HasTaskQueue(const BASE_NS::Uid& queueId) const override;
128     bool UnregisterAllTaskQueues() override;
129     ITaskQueue::Ptr GetCurrentTaskQueue() const override;
130     ITaskQueue::WeakPtr SetCurrentTaskQueue(ITaskQueue::WeakPtr) override;
131     BASE_NS::shared_ptr<IPromise> ConstructPromise() override;
132     BASE_NS::shared_ptr<IFuture> ConstructFutureWithValue(const IAny::Ptr& value) override;
133 
134 private:
135     struct CreateResult {
136         bool successful;
137         uint64_t category;
138         bool singleton = false;
139     };
140 
141     CreateResult CreateInternal(const IObjectFactory::ConstPtr fac, BASE_NS::vector<IObject::Ptr>& classes) const;
142     CreateResult CreateInternal(BASE_NS::Uid uid, BASE_NS::vector<IObject::Ptr>& classes) const;
143     bool ConstructObjectInternal(const IObjectFactory::ConstPtr& fac, BASE_NS::vector<IObject::Ptr>& classes) const;
144     void SetObjectInstanceIds(const BASE_NS::vector<IObject::Ptr>& classes, InstanceId instid) const;
145     bool BuildObject(const BASE_NS::vector<IObject::Ptr>& classes, const IMetadata::Ptr& data) const;
146     bool PostCreate(const BASE_NS::Uid& uid, InstanceId instid, const CreateResult& t, const CreateInfo& createInfo,
147         const BASE_NS::vector<IObject::Ptr>& classes, const IMetadata::Ptr& data) const;
148 
149     BASE_NS::string GetClassName(BASE_NS::Uid uid) const;
150     IObject::Ptr FindSingleton(const BASE_NS::Uid uid) const;
151     void CheckGC() const;
152     void GC() const;
153     void DoDisposal(const BASE_NS::vector<InstanceId>& uids) const;
154 
155     struct ObjectInstance {
156         IObject::WeakPtr ptr;
157         uint64_t category {};
158     };
159 
160     mutable std::shared_mutex mutex_;
161     mutable std::shared_mutex disposalMutex_;
162 
163     BASE_NS::unique_ptr<IRandom> random_;
164 
165     // mutable so GC can clean up null objects. (GC is called from const methods)
166     mutable BASE_NS::unordered_map<InstanceId, IObject::WeakPtr> singletons_;
167     mutable BASE_NS::unordered_map<InstanceId, ObjectInstance> instancesByUid_;
168     mutable IObjectContext::Ptr defaultContext_;
169 
170     mutable std::atomic_flag disposalInProgress_ = ATOMIC_FLAG_INIT;
171     mutable std::atomic<size_t> purgeCounter_ {};
172     mutable BASE_NS::vector<InstanceId> disposals_;
173     mutable BASE_NS::vector<InstanceId> disposalsStorage_;
174 
175     BASE_NS::unordered_map<BASE_NS::Uid, ITaskQueue::Ptr> queues_;
176 
177     ClassRegistry classRegistry_;
178 
179     // Interpolator constructors.
180     BASE_NS::unordered_map<TypeId, BASE_NS::Uid> interpolatorConstructors_;
181 
182     SerializationSettings defaultSettings_;
183     mutable BASE_NS::unordered_map<InstanceId, IObject::WeakPtr> globalObjects_;
184     BASE_NS::unordered_map<TypeId, IValueSerializer::Ptr> valueSerializers_;
185 
186     BASE_NS::unordered_map<ObjectId, BASE_NS::shared_ptr<AnyBuilder>> anyBuilders_;
187     BASE_NS::unordered_map<CORE_NS::PropertyTypeDecl, IEngineInternalValueAccess::Ptr> engineInternalAccess_;
188 };
189 
190 META_END_NAMESPACE()
191 
192 #endif
193