• 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 #include "runtime/mem/gc/g1/hot_cards.h"
17 #include "libpandabase/macros.h"
18 
19 namespace ark::mem {
20 
UpdateCardsStatus()21 void HotCards::UpdateCardsStatus()
22 {
23     VisitHotCards([this](CardPtr card) {
24         auto cardValue = card->GetCard();
25         auto cardStatus = CardTable::Card::GetStatus(cardValue);
26 
27         ASSERT_PRINT(!CardTable::Card::IsProcessed(cardStatus) && !CardTable::Card::IsYoung(cardStatus),
28                      "UpdateHotCardStatus card: " << card << " cardValue: " << (int)cardValue);
29 
30         if (CardTable::Card::IsMarked(cardStatus)) {
31             SetHotAndMaxHotValue(card, cardValue & RESET_MARK_MASK);
32             unprocessedCards_.insert(card);
33         }
34     });
35 }
36 
PushCard(CardPtr card)37 void HotCards::PushCard(CardPtr card)
38 {
39     ASSERT(card->IsHot());
40     hotCards_.insert(card);
41 }
42 
DecrementHotValue()43 void HotCards::DecrementHotValue()
44 {
45     VisitHotCards([](CardPtr card) {
46         auto cardValue = card->GetCard();
47         auto cardStatus = Card::GetStatus(cardValue);
48 
49         ASSERT_PRINT(!CardTable::Card::IsProcessed(cardStatus) && !CardTable::Card::IsYoung(cardStatus),
50                      "DecrementHotValue card: " << card << " cardValue: " << (int)cardValue);
51 
52         if (Card::IsMarked(cardStatus) || !Card::IsHot(cardValue)) {
53             return;
54         }
55 
56         if (Card::IsMinHotValue(cardValue)) {
57             card->ResetHot();
58             return;
59         }
60         card->DecrementHotValue();
61     });
62 }
63 
DrainMarkedCards(PandaUnorderedSet<CardPtr> * markedCards)64 void HotCards::DrainMarkedCards(PandaUnorderedSet<CardPtr> *markedCards)
65 {
66     auto cardIt = hotCards_.begin();
67     while (cardIt != hotCards_.end()) {
68         auto *cardPtr = *cardIt;
69         auto cardValue = cardPtr->GetCard();
70         auto cardStatus = CardTable::Card::GetStatus(cardValue);
71         if (CardTable::Card::IsMarked(cardStatus)) {
72             markedCards->insert(cardPtr);
73         }
74         ResetHot(cardPtr, cardValue);
75         cardIt = hotCards_.erase(cardIt);
76     }
77     markedCards->insert(unprocessedCards_.begin(), unprocessedCards_.end());
78     unprocessedCards_.clear();
79 }
80 
ClearHotCards()81 void HotCards::ClearHotCards()
82 {
83     auto cardIt = hotCards_.begin();
84     while (cardIt != hotCards_.end()) {
85         (*cardIt)->ResetHot();
86         cardIt = hotCards_.erase(cardIt);
87     }
88     ASSERT(unprocessedCards_.empty());
89 }
90 
91 }  // namespace ark::mem
92