1 /** 2 * Copyright (c) 2023-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 #ifndef PANDA_RUNTIME_MEM_GC_G1_G1_MARKER_H 16 #define PANDA_RUNTIME_MEM_GC_G1_G1_MARKER_H 17 18 #include "runtime/mem/gc/gc_marker.h" 19 20 namespace ark::mem { 21 template <class LanguageConfig> 22 class G1GCPauseMarker : public GCMarker<G1GCPauseMarker<LanguageConfig>, LanguageConfig::LANG_TYPE> { 23 public: G1GCPauseMarker(GC * gc)24 explicit G1GCPauseMarker(GC *gc) : GCMarker<G1GCPauseMarker<LanguageConfig>, LanguageConfig::LANG_TYPE>(gc) {} 25 MarkIfNotMarked(ObjectHeader * object)26 ALWAYS_INLINE bool MarkIfNotMarked(ObjectHeader *object) const 27 { 28 MarkBitmap *bitmap = ObjectToRegion(object)->GetMarkBitmap(); 29 ASSERT(bitmap != nullptr); 30 return !bitmap->AtomicTestAndSet(object); 31 } 32 IsMarked(const ObjectHeader * object)33 ALWAYS_INLINE static bool IsMarked(const ObjectHeader *object) 34 { 35 MarkBitmap *bitmap = ObjectToRegion(object)->GetMarkBitmap(); 36 ASSERT(bitmap != nullptr); 37 return bitmap->AtomicTest(object); 38 } 39 Mark(ObjectHeader * object)40 ALWAYS_INLINE static void Mark(ObjectHeader *object) 41 { 42 MarkBitmap *bitmap = ObjectToRegion(object)->GetMarkBitmap(); 43 ASSERT(bitmap != nullptr); 44 bitmap->AtomicTestAndSet(object); 45 } 46 }; 47 48 template <class LanguageConfig> 49 class G1GCConcurrentMarker : public GCMarker<G1GCConcurrentMarker<LanguageConfig>, LanguageConfig::LANG_TYPE> { 50 public: G1GCConcurrentMarker(GC * gc)51 explicit G1GCConcurrentMarker(GC *gc) 52 : GCMarker<G1GCConcurrentMarker<LanguageConfig>, LanguageConfig::LANG_TYPE>(gc) 53 { 54 } 55 MarkIfNotMarked(ObjectHeader * object)56 ALWAYS_INLINE bool MarkIfNotMarked(ObjectHeader *object) const 57 { 58 MarkBitmap *bitmap = ObjectToRegion(object)->GetMarkBitmap(); 59 ASSERT(bitmap != nullptr); 60 bool result = !bitmap->Test(object); 61 bitmap->Set(object); 62 return result; 63 } 64 IsMarked(const ObjectHeader * object)65 ALWAYS_INLINE bool IsMarked(const ObjectHeader *object) const 66 { 67 MarkBitmap *bitmap = ObjectToRegion(object)->GetMarkBitmap(); 68 ASSERT(bitmap != nullptr); 69 return bitmap->Test(object); 70 } 71 Mark(ObjectHeader * object)72 ALWAYS_INLINE void Mark(ObjectHeader *object) 73 { 74 MarkBitmap *bitmap = ObjectToRegion(object)->GetMarkBitmap(); 75 ASSERT(bitmap != nullptr); 76 bitmap->Set(object); 77 } 78 }; 79 80 template <class LanguageConfig> 81 class G1GCMixedMarker : public GCMarker<G1GCMixedMarker<LanguageConfig>, LanguageConfig::LANG_TYPE> { 82 public: G1GCMixedMarker(GC * gc)83 explicit G1GCMixedMarker(GC *gc) : GCMarker<G1GCMixedMarker<LanguageConfig>, LanguageConfig::LANG_TYPE>(gc) {} 84 MarkIfNotMarked(ObjectHeader * object)85 ALWAYS_INLINE bool MarkIfNotMarked(ObjectHeader *object) const 86 { 87 Region *objRegion = ObjectToRegion(object); 88 if (!objRegion->IsInCollectionSet()) { 89 return false; 90 } 91 MarkBitmap *bitmap = objRegion->GetMarkBitmap(); 92 ASSERT(bitmap != nullptr); 93 return !bitmap->AtomicTestAndSet(object); 94 } 95 MarkIfNotMarkedInCollectionSet(ObjectHeader * object)96 ALWAYS_INLINE bool MarkIfNotMarkedInCollectionSet(ObjectHeader *object) const 97 { 98 ASSERT(this->GetGC()->InGCSweepRange(object)); 99 MarkBitmap *bitmap = ObjectToRegion(object)->GetMarkBitmap(); 100 ASSERT(bitmap != nullptr); 101 return !bitmap->AtomicTestAndSet(object); 102 } 103 IsMarked(const ObjectHeader * object)104 ALWAYS_INLINE bool IsMarked(const ObjectHeader *object) const 105 { 106 return G1GCPauseMarker<LanguageConfig>::IsMarked(object); 107 } 108 Mark(ObjectHeader * object)109 ALWAYS_INLINE void Mark(ObjectHeader *object) const 110 { 111 G1GCPauseMarker<LanguageConfig>::Mark(object); 112 } 113 }; 114 115 } // namespace ark::mem 116 117 #endif // PANDA_RUNTIME_MEM_GC_G1_G1_MARKER_H 118