blob: 11afd1cfbd20f11a4c4a087dc2c8462b274ba0cf [file] [log] [blame]
Carl Shapiro69759ea2011-07-21 18:13:35 -07001// Copyright 2011 Google Inc. All Rights Reserved.
Carl Shapiro69759ea2011-07-21 18:13:35 -07002
3#ifndef ART_SRC_MARK_SWEEP_H_
4#define ART_SRC_MARK_SWEEP_H_
5
Brian Carlstrom578bbdc2011-07-21 14:07:47 -07006#include "macros.h"
7#include "mark_stack.h"
Elliott Hughes5e71b522011-10-20 13:12:32 -07008#include "heap_bitmap.h"
Ian Rogers0cfe1fb2011-08-26 03:29:44 -07009#include "offsets.h"
Carl Shapiro69759ea2011-07-21 18:13:35 -070010
11namespace art {
12
13class Class;
14class Object;
15
16class MarkSweep {
17 public:
Carl Shapiro58551df2011-07-24 03:09:51 -070018 MarkSweep() :
Brian Carlstrom1f870082011-08-23 16:02:11 -070019 finger_(NULL),
20 condemned_(NULL),
21 soft_reference_list_(NULL),
22 weak_reference_list_(NULL),
23 finalizer_reference_list_(NULL),
24 phantom_reference_list_(NULL),
Elliott Hughes352a4242011-10-31 15:15:21 -070025 cleared_reference_list_(NULL),
26 class_count_(0), array_count_(0), other_count_(0) {
Carl Shapiro58551df2011-07-24 03:09:51 -070027 }
28
Carl Shapiro69759ea2011-07-21 18:13:35 -070029 ~MarkSweep();
30
Carl Shapiro58551df2011-07-24 03:09:51 -070031 // Initializes internal structures.
32 bool Init();
33
Carl Shapiro69759ea2011-07-21 18:13:35 -070034 // Marks the root set at the start of a garbage collection.
35 void MarkRoots();
36
Ian Rogers5d76c432011-10-31 21:42:49 -070037 // Marks the roots in the image space on dirty cards
38 void ScanDirtyImageRoots();
39
40 bool IsMarkStackEmpty() const {
41 return mark_stack_->IsEmpty();
42 }
43
Carl Shapiro58551df2011-07-24 03:09:51 -070044 // Builds a mark stack and recursively mark until it empties.
45 void RecursiveMark();
46
Carl Shapiro69759ea2011-07-21 18:13:35 -070047 // Remarks the root set after completing the concurrent mark.
48 void ReMarkRoots();
49
Carl Shapiro58551df2011-07-24 03:09:51 -070050 void ProcessReferences(bool clear_soft_references) {
51 ProcessReferences(&soft_reference_list_, clear_soft_references,
52 &weak_reference_list_,
53 &finalizer_reference_list_,
54 &phantom_reference_list_);
55 }
56
Carl Shapiro69759ea2011-07-21 18:13:35 -070057 // Sweeps unmarked objects to complete the garbage collection.
58 void Sweep();
59
Elliott Hughesadb460d2011-10-05 17:02:34 -070060 Object* GetClearedReferences() {
61 return cleared_reference_list_;
62 }
63
Carl Shapiro69759ea2011-07-21 18:13:35 -070064 private:
65 // Returns true if the object has its bit set in the mark bitmap.
66 bool IsMarked(const Object* object) const {
67 return mark_bitmap_->Test(object);
68 }
69
Elliott Hughesc33a32b2011-10-11 18:18:07 -070070 static bool IsMarked(const Object* object, void* arg) {
71 return reinterpret_cast<MarkSweep*>(arg)->IsMarked(object);
72 }
73
Elliott Hughescf4c6c42011-09-01 15:16:42 -070074 static void MarkObjectVisitor(const Object* root, void* arg);
Brian Carlstrom1f870082011-08-23 16:02:11 -070075
Ian Rogers5d76c432011-10-31 21:42:49 -070076 static void ScanImageRootVisitor(Object* root, void* arg);
77
Carl Shapiro69759ea2011-07-21 18:13:35 -070078 // Marks an object.
79 void MarkObject(const Object* obj);
80
81 // Yuck.
82 void MarkObject0(const Object* obj, bool check_finger);
83
Carl Shapiro58551df2011-07-24 03:09:51 -070084 static void ScanBitmapCallback(Object* obj, void* finger, void* arg);
85
Ian Rogers5d76c432011-10-31 21:42:49 -070086 static void CheckBitmapCallback(Object* obj, void* finger, void* arg);
87
Carl Shapiro58551df2011-07-24 03:09:51 -070088 static void SweepCallback(size_t num_ptrs, void** ptrs, void* arg);
89
Ian Rogers5d76c432011-10-31 21:42:49 -070090 void CheckReference(const Object* obj, const Object* ref, MemberOffset offset, bool is_static);
91
Carl Shapiro69759ea2011-07-21 18:13:35 -070092 // Blackens an object.
93 void ScanObject(const Object* obj);
94
Ian Rogers5d76c432011-10-31 21:42:49 -070095 void CheckObject(const Object* obj);
96
Carl Shapiro69759ea2011-07-21 18:13:35 -070097 // Grays references in instance fields.
98 void ScanInstanceFields(const Object* obj);
99
Ian Rogers5d76c432011-10-31 21:42:49 -0700100 void CheckInstanceFields(const Object* obj);
101
Carl Shapiro69759ea2011-07-21 18:13:35 -0700102 // Blackens a class object.
103 void ScanClass(const Object* obj);
104
Ian Rogers5d76c432011-10-31 21:42:49 -0700105 void CheckClass(const Object* obj);
106
Carl Shapiro69759ea2011-07-21 18:13:35 -0700107 // Grays references in static fields.
108 void ScanStaticFields(const Class* klass);
109
Ian Rogers5d76c432011-10-31 21:42:49 -0700110 void CheckStaticFields(const Class* klass);
111
Brian Carlstrom4873d462011-08-21 15:23:39 -0700112 // Used by ScanInstanceFields and ScanStaticFields
113 void ScanFields(const Object* obj, uint32_t ref_offsets, bool is_static);
114
Ian Rogers5d76c432011-10-31 21:42:49 -0700115 void CheckFields(const Object* obj, uint32_t ref_offsets, bool is_static);
116
Carl Shapiro69759ea2011-07-21 18:13:35 -0700117 // Grays references in an array.
118 void ScanArray(const Object* obj);
119
Ian Rogers5d76c432011-10-31 21:42:49 -0700120 void CheckArray(const Object* obj);
121
Carl Shapiro58551df2011-07-24 03:09:51 -0700122 void ScanOther(const Object* obj);
Carl Shapiro69759ea2011-07-21 18:13:35 -0700123
Ian Rogers5d76c432011-10-31 21:42:49 -0700124 void CheckOther(const Object* obj);
125
Carl Shapiro69759ea2011-07-21 18:13:35 -0700126 // Blackens objects grayed during a garbage collection.
127 void ScanDirtyObjects();
128
129 // Schedules an unmarked object for reference processing.
130 void DelayReferenceReferent(Object* reference);
131
132 // Recursively blackens objects on the mark stack.
133 void ProcessMarkStack();
134
Carl Shapiro69759ea2011-07-21 18:13:35 -0700135 void EnqueueFinalizerReferences(Object** ref);
136
137 void PreserveSomeSoftReferences(Object** ref);
138
Carl Shapiro69759ea2011-07-21 18:13:35 -0700139 void ClearWhiteReferences(Object** list);
140
Carl Shapiro58551df2011-07-24 03:09:51 -0700141 void ProcessReferences(Object** soft_references, bool clear_soft_references,
Carl Shapiro69759ea2011-07-21 18:13:35 -0700142 Object** weak_references,
143 Object** finalizer_references,
144 Object** phantom_references);
145
Carl Shapiro58551df2011-07-24 03:09:51 -0700146 void SweepSystemWeaks();
Elliott Hughes410c0c82011-09-01 17:58:25 -0700147 void SweepJniWeakGlobals();
Carl Shapiro58551df2011-07-24 03:09:51 -0700148
Carl Shapiro69759ea2011-07-21 18:13:35 -0700149 MarkStack* mark_stack_;
150
151 HeapBitmap* mark_bitmap_;
152
Carl Shapiro58551df2011-07-24 03:09:51 -0700153 HeapBitmap* live_bitmap_;
Carl Shapiro69759ea2011-07-21 18:13:35 -0700154
155 Object* finger_;
156
157 Object* condemned_;
158
159 Object* soft_reference_list_;
160
161 Object* weak_reference_list_;
162
163 Object* finalizer_reference_list_;
164
165 Object* phantom_reference_list_;
166
167 Object* cleared_reference_list_;
168
Elliott Hughes352a4242011-10-31 15:15:21 -0700169 size_t class_count_;
170 size_t array_count_;
171 size_t other_count_;
172
Elliott Hughes410c0c82011-09-01 17:58:25 -0700173 friend class InternTableEntryIsUnmarked;
174
Carl Shapiro69759ea2011-07-21 18:13:35 -0700175 DISALLOW_COPY_AND_ASSIGN(MarkSweep);
176};
177
178} // namespace art
179
180#endif // ART_SRC_MARK_SWEEP_H_