blob: 22aad15d11f1acd4969f267854a3fd2d8d6061b8 [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
Carl Shapiro58551df2011-07-24 03:09:51 -070037 // Builds a mark stack and recursively mark until it empties.
38 void RecursiveMark();
39
Carl Shapiro69759ea2011-07-21 18:13:35 -070040 // Remarks the root set after completing the concurrent mark.
41 void ReMarkRoots();
42
Carl Shapiro58551df2011-07-24 03:09:51 -070043 void ProcessReferences(bool clear_soft_references) {
44 ProcessReferences(&soft_reference_list_, clear_soft_references,
45 &weak_reference_list_,
46 &finalizer_reference_list_,
47 &phantom_reference_list_);
48 }
49
Carl Shapiro69759ea2011-07-21 18:13:35 -070050 // Sweeps unmarked objects to complete the garbage collection.
51 void Sweep();
52
Elliott Hughesadb460d2011-10-05 17:02:34 -070053 Object* GetClearedReferences() {
54 return cleared_reference_list_;
55 }
56
Carl Shapiro69759ea2011-07-21 18:13:35 -070057 private:
58 // Returns true if the object has its bit set in the mark bitmap.
59 bool IsMarked(const Object* object) const {
60 return mark_bitmap_->Test(object);
61 }
62
Elliott Hughesc33a32b2011-10-11 18:18:07 -070063 static bool IsMarked(const Object* object, void* arg) {
64 return reinterpret_cast<MarkSweep*>(arg)->IsMarked(object);
65 }
66
Elliott Hughescf4c6c42011-09-01 15:16:42 -070067 static void MarkObjectVisitor(const Object* root, void* arg);
Brian Carlstrom1f870082011-08-23 16:02:11 -070068
Carl Shapiro69759ea2011-07-21 18:13:35 -070069 // Marks an object.
70 void MarkObject(const Object* obj);
71
72 // Yuck.
73 void MarkObject0(const Object* obj, bool check_finger);
74
Carl Shapiro58551df2011-07-24 03:09:51 -070075 static void ScanBitmapCallback(Object* obj, void* finger, void* arg);
76
77 static void SweepCallback(size_t num_ptrs, void** ptrs, void* arg);
78
Carl Shapiro69759ea2011-07-21 18:13:35 -070079 // Blackens an object.
80 void ScanObject(const Object* obj);
81
82 // Grays references in instance fields.
83 void ScanInstanceFields(const Object* obj);
84
85 // Blackens a class object.
86 void ScanClass(const Object* obj);
87
88 // Grays references in static fields.
89 void ScanStaticFields(const Class* klass);
90
Brian Carlstrom4873d462011-08-21 15:23:39 -070091 // Used by ScanInstanceFields and ScanStaticFields
92 void ScanFields(const Object* obj, uint32_t ref_offsets, bool is_static);
93
Carl Shapiro69759ea2011-07-21 18:13:35 -070094 // Grays references in an array.
95 void ScanArray(const Object* obj);
96
Carl Shapiro58551df2011-07-24 03:09:51 -070097 void ScanOther(const Object* obj);
Carl Shapiro69759ea2011-07-21 18:13:35 -070098
99 // Blackens objects grayed during a garbage collection.
100 void ScanDirtyObjects();
101
102 // Schedules an unmarked object for reference processing.
103 void DelayReferenceReferent(Object* reference);
104
105 // Recursively blackens objects on the mark stack.
106 void ProcessMarkStack();
107
Carl Shapiro69759ea2011-07-21 18:13:35 -0700108 void EnqueueFinalizerReferences(Object** ref);
109
110 void PreserveSomeSoftReferences(Object** ref);
111
Carl Shapiro69759ea2011-07-21 18:13:35 -0700112 void ClearWhiteReferences(Object** list);
113
Carl Shapiro58551df2011-07-24 03:09:51 -0700114 void ProcessReferences(Object** soft_references, bool clear_soft_references,
Carl Shapiro69759ea2011-07-21 18:13:35 -0700115 Object** weak_references,
116 Object** finalizer_references,
117 Object** phantom_references);
118
Carl Shapiro58551df2011-07-24 03:09:51 -0700119 void SweepSystemWeaks();
Elliott Hughes410c0c82011-09-01 17:58:25 -0700120 void SweepJniWeakGlobals();
Carl Shapiro58551df2011-07-24 03:09:51 -0700121
Carl Shapiro69759ea2011-07-21 18:13:35 -0700122 MarkStack* mark_stack_;
123
124 HeapBitmap* mark_bitmap_;
125
Carl Shapiro58551df2011-07-24 03:09:51 -0700126 HeapBitmap* live_bitmap_;
Carl Shapiro69759ea2011-07-21 18:13:35 -0700127
128 Object* finger_;
129
130 Object* condemned_;
131
132 Object* soft_reference_list_;
133
134 Object* weak_reference_list_;
135
136 Object* finalizer_reference_list_;
137
138 Object* phantom_reference_list_;
139
140 Object* cleared_reference_list_;
141
Elliott Hughes352a4242011-10-31 15:15:21 -0700142 size_t class_count_;
143 size_t array_count_;
144 size_t other_count_;
145
Elliott Hughes410c0c82011-09-01 17:58:25 -0700146 friend class InternTableEntryIsUnmarked;
147
Carl Shapiro69759ea2011-07-21 18:13:35 -0700148 DISALLOW_COPY_AND_ASSIGN(MarkSweep);
149};
150
151} // namespace art
152
153#endif // ART_SRC_MARK_SWEEP_H_