1 /** 2 * Copyright (c) 2021-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 "runtime/include/panda_vm.h" 17 #include "runtime/mem/gc/lang/gc_lang.h" 18 #include "runtime/mem/object_helpers-inl.h" 19 #include "runtime/mem/gc/dynamic/gc_dynamic_data.h" 20 21 namespace ark::mem { 22 23 template <class LanguageConfig> GCLang(ObjectAllocatorBase * objectAllocator,const GCSettings & settings)24GCLang<LanguageConfig>::GCLang(ObjectAllocatorBase *objectAllocator, const GCSettings &settings) 25 : GC(objectAllocator, settings) 26 { 27 if constexpr (LanguageConfig::LANG_TYPE == LANG_TYPE_DYNAMIC) { // NOLINT 28 auto allocator = GetInternalAllocator(); 29 GCDynamicData *data = allocator->template New<GCDynamicData>(allocator); 30 SetExtensionData(data); 31 } 32 } 33 34 template <class LanguageConfig> ~GCLang()35GCLang<LanguageConfig>::~GCLang() 36 { 37 GCExtensionData *data = GetExtensionData(); 38 if (GetExtensionData() != nullptr) { 39 InternalAllocatorPtr allocator = GetInternalAllocator(); 40 allocator->Delete(data); 41 } 42 } 43 44 template <class LanguageConfig> ClearLocalInternalAllocatorPools()45void GCLang<LanguageConfig>::ClearLocalInternalAllocatorPools() 46 { 47 auto cleaner = [](ManagedThread *thread) { 48 InternalAllocator<>::RemoveFreePoolsForLocalInternalAllocator(thread->GetLocalInternalAllocator()); 49 return true; 50 }; 51 GetPandaVm()->GetThreadManager()->EnumerateThreads(cleaner); 52 } 53 54 template <class LanguageConfig> VerifyHeap()55size_t GCLang<LanguageConfig>::VerifyHeap() 56 { 57 if (GetSettings()->EnableFastHeapVerifier()) { 58 return FastHeapVerifier<LanguageConfig>(GetPandaVm()->GetHeapManager()).VerifyAll(); 59 } 60 return HeapVerifier<LanguageConfig>(GetPandaVm()->GetHeapManager()).VerifyAll(); 61 } 62 63 template <class LanguageConfig> UpdateRefsToMovedObjectsInPygoteSpace()64void GCLang<LanguageConfig>::UpdateRefsToMovedObjectsInPygoteSpace() 65 { 66 GetObjectAllocator()->IterateNonRegularSizeObjects( 67 [](ObjectHeader *obj) { ObjectHelpers<LanguageConfig::LANG_TYPE>::UpdateRefsToMovedObjects(obj); }); 68 } 69 70 template <class LanguageConfig> CommonUpdateRefsToMovedObjects()71void GCLang<LanguageConfig>::CommonUpdateRefsToMovedObjects() 72 { 73 trace::ScopedTrace scopedTrace(__FUNCTION__); 74 75 auto gcRootUpdaterCallback = [](ObjectHeader **object) { 76 if ((*object)->IsForwarded()) { 77 *object = GetForwardAddress(*object); 78 return true; 79 } 80 return false; 81 }; 82 83 rootManager_.UpdateRefsToMovedObjects(gcRootUpdaterCallback); 84 } 85 86 template <class LanguageConfig> PreRunPhasesImpl()87void GCLang<LanguageConfig>::PreRunPhasesImpl() 88 { 89 // NOLINTNEXTLINE(readability-braces-around-statements, bugprone-suspicious-semicolon) 90 if constexpr (LanguageConfig::MT_MODE != MT_MODE_SINGLE) { 91 GetPandaVm()->FreeInternalResources(); 92 } 93 } 94 95 TEMPLATE_GC_IS_MUTATOR_ALLOWED() 96 TEMPLATE_CLASS_LANGUAGE_CONFIG(GCLang); 97 98 } // namespace ark::mem 99