• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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