1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2012 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker #ifndef ART_RUNTIME_GC_ACCOUNTING_MOD_UNION_TABLE_H_ 18*795d594fSAndroid Build Coastguard Worker #define ART_RUNTIME_GC_ACCOUNTING_MOD_UNION_TABLE_H_ 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker #include "base/allocator.h" 21*795d594fSAndroid Build Coastguard Worker #include "base/safe_map.h" 22*795d594fSAndroid Build Coastguard Worker #include "base/tracking_safe_map.h" 23*795d594fSAndroid Build Coastguard Worker #include "bitmap.h" 24*795d594fSAndroid Build Coastguard Worker #include "card_table.h" 25*795d594fSAndroid Build Coastguard Worker #include "mirror/object_reference.h" 26*795d594fSAndroid Build Coastguard Worker #include "runtime_globals.h" 27*795d594fSAndroid Build Coastguard Worker 28*795d594fSAndroid Build Coastguard Worker #include <set> 29*795d594fSAndroid Build Coastguard Worker #include <vector> 30*795d594fSAndroid Build Coastguard Worker 31*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN { 32*795d594fSAndroid Build Coastguard Worker 33*795d594fSAndroid Build Coastguard Worker namespace mirror { 34*795d594fSAndroid Build Coastguard Worker class Object; 35*795d594fSAndroid Build Coastguard Worker } // namespace mirror 36*795d594fSAndroid Build Coastguard Worker 37*795d594fSAndroid Build Coastguard Worker class MarkObjectVisitor; 38*795d594fSAndroid Build Coastguard Worker 39*795d594fSAndroid Build Coastguard Worker namespace gc { 40*795d594fSAndroid Build Coastguard Worker namespace space { 41*795d594fSAndroid Build Coastguard Worker class ContinuousSpace; 42*795d594fSAndroid Build Coastguard Worker } // namespace space 43*795d594fSAndroid Build Coastguard Worker 44*795d594fSAndroid Build Coastguard Worker class Heap; 45*795d594fSAndroid Build Coastguard Worker 46*795d594fSAndroid Build Coastguard Worker namespace accounting { 47*795d594fSAndroid Build Coastguard Worker 48*795d594fSAndroid Build Coastguard Worker // The mod-union table is the union of modified cards. It is used to allow the card table to be 49*795d594fSAndroid Build Coastguard Worker // cleared between GC phases, reducing the number of dirty cards that need to be scanned. 50*795d594fSAndroid Build Coastguard Worker class ModUnionTable { 51*795d594fSAndroid Build Coastguard Worker public: 52*795d594fSAndroid Build Coastguard Worker // A callback for visiting an object in the heap. 53*795d594fSAndroid Build Coastguard Worker using ObjectCallback = void (*)(mirror::Object*, void*); 54*795d594fSAndroid Build Coastguard Worker 55*795d594fSAndroid Build Coastguard Worker using CardSet = std::set<uint8_t*, 56*795d594fSAndroid Build Coastguard Worker std::less<uint8_t*>, 57*795d594fSAndroid Build Coastguard Worker TrackingAllocator<uint8_t*, kAllocatorTagModUnionCardSet>>; 58*795d594fSAndroid Build Coastguard Worker using CardBitmap = MemoryRangeBitmap<CardTable::kCardSize>; 59*795d594fSAndroid Build Coastguard Worker ModUnionTable(const std::string & name,Heap * heap,space::ContinuousSpace * space)60*795d594fSAndroid Build Coastguard Worker explicit ModUnionTable(const std::string& name, Heap* heap, space::ContinuousSpace* space) 61*795d594fSAndroid Build Coastguard Worker : name_(name), 62*795d594fSAndroid Build Coastguard Worker heap_(heap), 63*795d594fSAndroid Build Coastguard Worker space_(space) {} 64*795d594fSAndroid Build Coastguard Worker ~ModUnionTable()65*795d594fSAndroid Build Coastguard Worker virtual ~ModUnionTable() {} 66*795d594fSAndroid Build Coastguard Worker 67*795d594fSAndroid Build Coastguard Worker // Process cards for a memory range of a space. This doesn't immediately update the mod-union 68*795d594fSAndroid Build Coastguard Worker // table, as updating the mod-union table may have an associated cost, such as determining 69*795d594fSAndroid Build Coastguard Worker // references to track. 70*795d594fSAndroid Build Coastguard Worker virtual void ProcessCards() = 0; 71*795d594fSAndroid Build Coastguard Worker 72*795d594fSAndroid Build Coastguard Worker // Set all the cards. 73*795d594fSAndroid Build Coastguard Worker virtual void SetCards() = 0; 74*795d594fSAndroid Build Coastguard Worker 75*795d594fSAndroid Build Coastguard Worker // Clear all of the table. 76*795d594fSAndroid Build Coastguard Worker virtual void ClearTable() = 0; 77*795d594fSAndroid Build Coastguard Worker 78*795d594fSAndroid Build Coastguard Worker // Update the mod-union table using data stored by ProcessCards. There may be multiple 79*795d594fSAndroid Build Coastguard Worker // ProcessCards before a call to update, for example, back-to-back sticky GCs. Also mark 80*795d594fSAndroid Build Coastguard Worker // references to other spaces which are stored in the mod-union table. 81*795d594fSAndroid Build Coastguard Worker virtual void UpdateAndMarkReferences(MarkObjectVisitor* visitor) = 0; 82*795d594fSAndroid Build Coastguard Worker 83*795d594fSAndroid Build Coastguard Worker // Visit all of the objects that may contain references to other spaces. 84*795d594fSAndroid Build Coastguard Worker virtual void VisitObjects(ObjectCallback callback, void* arg) = 0; 85*795d594fSAndroid Build Coastguard Worker 86*795d594fSAndroid Build Coastguard Worker // Verification: consistency checks that we don't have clean cards which conflict with out 87*795d594fSAndroid Build Coastguard Worker // cached data for said cards. Exclusive lock is required since verify sometimes uses 88*795d594fSAndroid Build Coastguard Worker // SpaceBitmap::VisitMarkedRange and VisitMarkedRange can't know if the callback will modify the 89*795d594fSAndroid Build Coastguard Worker // bitmap or not. 90*795d594fSAndroid Build Coastguard Worker virtual void Verify() REQUIRES(Locks::heap_bitmap_lock_) = 0; 91*795d594fSAndroid Build Coastguard Worker 92*795d594fSAndroid Build Coastguard Worker // Returns true if a card is marked inside the mod union table. Used for testing. The address 93*795d594fSAndroid Build Coastguard Worker // doesn't need to be aligned. 94*795d594fSAndroid Build Coastguard Worker virtual bool ContainsCardFor(uintptr_t addr) = 0; 95*795d594fSAndroid Build Coastguard Worker 96*795d594fSAndroid Build Coastguard Worker // Filter out cards that don't need to be marked. Automatically done with UpdateAndMarkReferences. 97*795d594fSAndroid Build Coastguard Worker void FilterCards(); 98*795d594fSAndroid Build Coastguard Worker 99*795d594fSAndroid Build Coastguard Worker virtual void Dump(std::ostream& os) = 0; 100*795d594fSAndroid Build Coastguard Worker GetSpace()101*795d594fSAndroid Build Coastguard Worker space::ContinuousSpace* GetSpace() { 102*795d594fSAndroid Build Coastguard Worker return space_; 103*795d594fSAndroid Build Coastguard Worker } 104*795d594fSAndroid Build Coastguard Worker GetHeap()105*795d594fSAndroid Build Coastguard Worker Heap* GetHeap() const { 106*795d594fSAndroid Build Coastguard Worker return heap_; 107*795d594fSAndroid Build Coastguard Worker } 108*795d594fSAndroid Build Coastguard Worker GetName()109*795d594fSAndroid Build Coastguard Worker const std::string& GetName() const { 110*795d594fSAndroid Build Coastguard Worker return name_; 111*795d594fSAndroid Build Coastguard Worker } 112*795d594fSAndroid Build Coastguard Worker 113*795d594fSAndroid Build Coastguard Worker protected: 114*795d594fSAndroid Build Coastguard Worker const std::string name_; 115*795d594fSAndroid Build Coastguard Worker Heap* const heap_; 116*795d594fSAndroid Build Coastguard Worker space::ContinuousSpace* const space_; 117*795d594fSAndroid Build Coastguard Worker }; 118*795d594fSAndroid Build Coastguard Worker 119*795d594fSAndroid Build Coastguard Worker // Reference caching implementation. Caches references pointing to alloc space(s) for each card. 120*795d594fSAndroid Build Coastguard Worker class ModUnionTableReferenceCache : public ModUnionTable { 121*795d594fSAndroid Build Coastguard Worker public: ModUnionTableReferenceCache(const std::string & name,Heap * heap,space::ContinuousSpace * space)122*795d594fSAndroid Build Coastguard Worker explicit ModUnionTableReferenceCache(const std::string& name, Heap* heap, 123*795d594fSAndroid Build Coastguard Worker space::ContinuousSpace* space) 124*795d594fSAndroid Build Coastguard Worker : ModUnionTable(name, heap, space) {} 125*795d594fSAndroid Build Coastguard Worker ~ModUnionTableReferenceCache()126*795d594fSAndroid Build Coastguard Worker virtual ~ModUnionTableReferenceCache() {} 127*795d594fSAndroid Build Coastguard Worker 128*795d594fSAndroid Build Coastguard Worker // Clear and store cards for a space. 129*795d594fSAndroid Build Coastguard Worker void ProcessCards() override; 130*795d594fSAndroid Build Coastguard Worker 131*795d594fSAndroid Build Coastguard Worker // Update table based on cleared cards and mark all references to the other spaces. 132*795d594fSAndroid Build Coastguard Worker void UpdateAndMarkReferences(MarkObjectVisitor* visitor) override 133*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 134*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_); 135*795d594fSAndroid Build Coastguard Worker 136*795d594fSAndroid Build Coastguard Worker void VisitObjects(ObjectCallback callback, void* arg) override 137*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 138*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 139*795d594fSAndroid Build Coastguard Worker 140*795d594fSAndroid Build Coastguard Worker // Exclusive lock is required since verify uses SpaceBitmap::VisitMarkedRange and 141*795d594fSAndroid Build Coastguard Worker // VisitMarkedRange can't know if the callback will modify the bitmap or not. 142*795d594fSAndroid Build Coastguard Worker void Verify() override 143*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 144*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_); 145*795d594fSAndroid Build Coastguard Worker 146*795d594fSAndroid Build Coastguard Worker // Function that tells whether or not to add a reference to the table. 147*795d594fSAndroid Build Coastguard Worker virtual bool ShouldAddReference(const mirror::Object* ref) const = 0; 148*795d594fSAndroid Build Coastguard Worker 149*795d594fSAndroid Build Coastguard Worker bool ContainsCardFor(uintptr_t addr) override; 150*795d594fSAndroid Build Coastguard Worker 151*795d594fSAndroid Build Coastguard Worker void Dump(std::ostream& os) override REQUIRES_SHARED(Locks::mutator_lock_); 152*795d594fSAndroid Build Coastguard Worker 153*795d594fSAndroid Build Coastguard Worker void SetCards() override; 154*795d594fSAndroid Build Coastguard Worker 155*795d594fSAndroid Build Coastguard Worker void ClearTable() override; 156*795d594fSAndroid Build Coastguard Worker 157*795d594fSAndroid Build Coastguard Worker protected: 158*795d594fSAndroid Build Coastguard Worker // Cleared card array, used to update the mod-union table. 159*795d594fSAndroid Build Coastguard Worker ModUnionTable::CardSet cleared_cards_; 160*795d594fSAndroid Build Coastguard Worker 161*795d594fSAndroid Build Coastguard Worker // Maps from dirty cards to their corresponding alloc space references. 162*795d594fSAndroid Build Coastguard Worker AllocationTrackingSafeMap<const uint8_t*, std::vector<mirror::HeapReference<mirror::Object>*>, 163*795d594fSAndroid Build Coastguard Worker kAllocatorTagModUnionReferenceArray> references_; 164*795d594fSAndroid Build Coastguard Worker }; 165*795d594fSAndroid Build Coastguard Worker 166*795d594fSAndroid Build Coastguard Worker // Card caching implementation. Keeps track of which cards we cleared and only this information. 167*795d594fSAndroid Build Coastguard Worker class ModUnionTableCardCache : public ModUnionTable { 168*795d594fSAndroid Build Coastguard Worker public: 169*795d594fSAndroid Build Coastguard Worker // Note: There is assumption that the space End() doesn't change. 170*795d594fSAndroid Build Coastguard Worker explicit ModUnionTableCardCache(const std::string& name, Heap* heap, 171*795d594fSAndroid Build Coastguard Worker space::ContinuousSpace* space); 172*795d594fSAndroid Build Coastguard Worker ~ModUnionTableCardCache()173*795d594fSAndroid Build Coastguard Worker virtual ~ModUnionTableCardCache() {} 174*795d594fSAndroid Build Coastguard Worker 175*795d594fSAndroid Build Coastguard Worker // Clear and store cards for a space. 176*795d594fSAndroid Build Coastguard Worker void ProcessCards() override; 177*795d594fSAndroid Build Coastguard Worker 178*795d594fSAndroid Build Coastguard Worker // Mark all references to the alloc space(s). 179*795d594fSAndroid Build Coastguard Worker void UpdateAndMarkReferences(MarkObjectVisitor* visitor) override 180*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 181*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 182*795d594fSAndroid Build Coastguard Worker 183*795d594fSAndroid Build Coastguard Worker void VisitObjects(ObjectCallback callback, void* arg) override 184*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::heap_bitmap_lock_) 185*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 186*795d594fSAndroid Build Coastguard Worker 187*795d594fSAndroid Build Coastguard Worker // Nothing to verify. Verify()188*795d594fSAndroid Build Coastguard Worker void Verify() override {} 189*795d594fSAndroid Build Coastguard Worker 190*795d594fSAndroid Build Coastguard Worker void Dump(std::ostream& os) override; 191*795d594fSAndroid Build Coastguard Worker 192*795d594fSAndroid Build Coastguard Worker bool ContainsCardFor(uintptr_t addr) override; 193*795d594fSAndroid Build Coastguard Worker 194*795d594fSAndroid Build Coastguard Worker void SetCards() override; 195*795d594fSAndroid Build Coastguard Worker 196*795d594fSAndroid Build Coastguard Worker void ClearTable() override; 197*795d594fSAndroid Build Coastguard Worker 198*795d594fSAndroid Build Coastguard Worker protected: 199*795d594fSAndroid Build Coastguard Worker // Cleared card bitmap, used to update the mod-union table. 200*795d594fSAndroid Build Coastguard Worker std::unique_ptr<CardBitmap> card_bitmap_; 201*795d594fSAndroid Build Coastguard Worker }; 202*795d594fSAndroid Build Coastguard Worker 203*795d594fSAndroid Build Coastguard Worker } // namespace accounting 204*795d594fSAndroid Build Coastguard Worker } // namespace gc 205*795d594fSAndroid Build Coastguard Worker } // namespace art 206*795d594fSAndroid Build Coastguard Worker 207*795d594fSAndroid Build Coastguard Worker #endif // ART_RUNTIME_GC_ACCOUNTING_MOD_UNION_TABLE_H_ 208