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 #ifndef COMMON_COMPONENTS_HEAP_COLLECTOR_COLLECTOR_PROXY_H 17 #define COMMON_COMPONENTS_HEAP_COLLECTOR_COLLECTOR_PROXY_H 18 19 #include "common_components/heap/ark_collector/ark_collector.h" 20 #include "common_components/heap/collector/collector.h" 21 #include "common_components/heap/collector/collector_resources.h" 22 23 namespace common { 24 // CollectorProxy is a special kind of collector, it is derived from Base class Collector, thus behaves like a real 25 // collector. However, it actually manages a set of collectors implemented yet, and delegate garbage-collecting to 26 // one of these collectors. 27 // CollectorProxy should inherit collector interfaces, but no datas 28 class CollectorProxy : public Collector { 29 public: CollectorProxy(Allocator & allocator,CollectorResources & resources)30 explicit CollectorProxy(Allocator& allocator, CollectorResources& resources) 31 : arkCollector_(allocator, resources) 32 { 33 collectorType_ = CollectorType::PROXY_COLLECTOR; 34 } 35 36 ~CollectorProxy() override = default; 37 38 void Init(const RuntimeParam& param) override; 39 void Fini() override; 40 GetGCPhase()41 GCPhase GetGCPhase() const override { return currentCollector_->GetGCPhase(); } 42 SetGCPhase(const GCPhase phase)43 void SetGCPhase(const GCPhase phase) override { currentCollector_->SetGCPhase(phase); } 44 45 // dispatch garbage collection to the right collector 46 PUBLIC_API void RunGarbageCollection(uint64_t gcIndex, GCReason reason, GCType gcType) override; 47 ShouldIgnoreRequest(GCRequest & request)48 bool ShouldIgnoreRequest(GCRequest& request) override { return currentCollector_->ShouldIgnoreRequest(request); } 49 GetCurrentCollector()50 MarkingCollector& GetCurrentCollector() const { return *currentCollector_; } 51 FindToVersion(BaseObject * obj)52 BaseObject* FindToVersion(BaseObject* obj) const override { return currentCollector_->FindToVersion(obj); } 53 IsOldPointer(RefField<> & ref)54 bool IsOldPointer(RefField<>& ref) const override { return currentCollector_->IsOldPointer(ref); } IsCurrentPointer(RefField<> & ref)55 bool IsCurrentPointer(RefField<>& ref) const override { return currentCollector_->IsCurrentPointer(ref); } 56 IsFromObject(BaseObject * obj)57 bool IsFromObject(BaseObject* obj) const override { return currentCollector_->IsFromObject(obj); } 58 59 // bool IsGhostFromObject(BaseObject* obj) const override { return currentCollector->IsGhostFromObject(obj); } 60 IsUnmovableFromObject(BaseObject * obj)61 bool IsUnmovableFromObject(BaseObject* obj) const override { return currentCollector_->IsUnmovableFromObject(obj); } 62 AddRawPointerObject(BaseObject * obj)63 void AddRawPointerObject(BaseObject* obj) override { return currentCollector_->AddRawPointerObject(obj); } RemoveRawPointerObject(BaseObject * obj)64 void RemoveRawPointerObject(BaseObject* obj) override { return currentCollector_->RemoveRawPointerObject(obj); } 65 ForwardObject(BaseObject * obj)66 BaseObject* ForwardObject(BaseObject* obj) override { return currentCollector_->ForwardObject(obj); } 67 TryUpdateRefField(BaseObject * obj,RefField<> & field,BaseObject * & toVersion)68 bool TryUpdateRefField(BaseObject* obj, RefField<>& field, BaseObject*& toVersion) const override 69 { 70 return currentCollector_->TryUpdateRefField(obj, field, toVersion); 71 } 72 TryForwardRefField(BaseObject * obj,RefField<> & field,BaseObject * & toVersion)73 bool TryForwardRefField(BaseObject* obj, RefField<>& field, BaseObject*& toVersion) const override 74 { 75 return currentCollector_->TryForwardRefField(obj, field, toVersion); 76 } 77 TryUntagRefField(BaseObject * obj,RefField<> & field,BaseObject * & target)78 bool TryUntagRefField(BaseObject* obj, RefField<>& field, BaseObject*& target) const override 79 { 80 return currentCollector_->TryUntagRefField(obj, field, target); 81 } 82 GetAndTryTagRefField(BaseObject * obj)83 RefField<> GetAndTryTagRefField(BaseObject* obj) const override 84 { 85 return currentCollector_->GetAndTryTagRefField(obj); 86 } 87 88 private: 89 // supported collector set 90 ArkCollector* currentCollector_ = nullptr; 91 ArkCollector arkCollector_; 92 }; 93 } // namespace common 94 95 #endif // COMMON_COMPONENTS_HEAP_COLLECTOR_COLLECTOR_PROXY_H 96