blob: 5f374ae9e44363d68a96e4e9f957efdeeecef208 [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"
8#include "object_bitmap.h"
Carl Shapiro69759ea2011-07-21 18:13:35 -07009
10namespace art {
11
12class Class;
13class Object;
14
15class MarkSweep {
16 public:
Carl Shapiro58551df2011-07-24 03:09:51 -070017 MarkSweep() :
18 finger_(NULL), condemned_(NULL) {
19 }
20
Carl Shapiro69759ea2011-07-21 18:13:35 -070021 ~MarkSweep();
22
Carl Shapiro58551df2011-07-24 03:09:51 -070023 // Initializes internal structures.
24 bool Init();
25
Carl Shapiro69759ea2011-07-21 18:13:35 -070026 // Marks the root set at the start of a garbage collection.
27 void MarkRoots();
28
Carl Shapiro58551df2011-07-24 03:09:51 -070029 // Builds a mark stack and recursively mark until it empties.
30 void RecursiveMark();
31
Carl Shapiro69759ea2011-07-21 18:13:35 -070032 // Remarks the root set after completing the concurrent mark.
33 void ReMarkRoots();
34
Carl Shapiro58551df2011-07-24 03:09:51 -070035 void ProcessReferences(bool clear_soft_references) {
36 ProcessReferences(&soft_reference_list_, clear_soft_references,
37 &weak_reference_list_,
38 &finalizer_reference_list_,
39 &phantom_reference_list_);
40 }
41
Carl Shapiro69759ea2011-07-21 18:13:35 -070042 // Sweeps unmarked objects to complete the garbage collection.
43 void Sweep();
44
45 private:
46 // Returns true if the object has its bit set in the mark bitmap.
47 bool IsMarked(const Object* object) const {
48 return mark_bitmap_->Test(object);
49 }
50
51 // Marks an object.
52 void MarkObject(const Object* obj);
53
54 // Yuck.
55 void MarkObject0(const Object* obj, bool check_finger);
56
Carl Shapiro58551df2011-07-24 03:09:51 -070057 static void ScanBitmapCallback(Object* obj, void* finger, void* arg);
58
59 static void SweepCallback(size_t num_ptrs, void** ptrs, void* arg);
60
Carl Shapiro69759ea2011-07-21 18:13:35 -070061 // Blackens an object.
62 void ScanObject(const Object* obj);
63
64 // Grays references in instance fields.
65 void ScanInstanceFields(const Object* obj);
66
67 // Blackens a class object.
68 void ScanClass(const Object* obj);
69
70 // Grays references in static fields.
71 void ScanStaticFields(const Class* klass);
72
Brian Carlstrom4873d462011-08-21 15:23:39 -070073 // Used by ScanInstanceFields and ScanStaticFields
74 void ScanFields(const Object* obj, uint32_t ref_offsets, bool is_static);
75
Carl Shapiro69759ea2011-07-21 18:13:35 -070076 // Grays interface class objects.
77 void ScanInterfaces(const Class* klass);
78
79 // Grays references in an array.
80 void ScanArray(const Object* obj);
81
Carl Shapiro58551df2011-07-24 03:09:51 -070082 void ScanOther(const Object* obj);
Carl Shapiro69759ea2011-07-21 18:13:35 -070083
84 // Blackens objects grayed during a garbage collection.
85 void ScanDirtyObjects();
86
87 // Schedules an unmarked object for reference processing.
88 void DelayReferenceReferent(Object* reference);
89
90 // Recursively blackens objects on the mark stack.
91 void ProcessMarkStack();
92
93 // Adds a reference to the tail of a circular queue of references.
94 static void EnqueuePendingReference(Object* ref, Object** list);
95
96 // Removes the reference at the head of a circular queue of
97 // references.
98 static Object* DequeuePendingReference(Object** list);
99
100 // Sets the referent field of a reference object to null.
101 static void ClearReference(Object* reference);
102
103 // Returns true if the reference object has not yet been enqueued.
104 static bool IsEnqueuable(const Object* ref);
105
106 void EnqueueReference(Object* ref);
107
108 void EnqueueFinalizerReferences(Object** ref);
109
110 void PreserveSomeSoftReferences(Object** ref);
111
112 void EnqueueClearedReferences(Object** cleared_references);
113
114 void ClearWhiteReferences(Object** list);
115
Carl Shapiro58551df2011-07-24 03:09:51 -0700116 void ProcessReferences(Object** soft_references, bool clear_soft_references,
Carl Shapiro69759ea2011-07-21 18:13:35 -0700117 Object** weak_references,
118 Object** finalizer_references,
119 Object** phantom_references);
120
Carl Shapiro58551df2011-07-24 03:09:51 -0700121 void SweepSystemWeaks();
122
Carl Shapiro69759ea2011-07-21 18:13:35 -0700123 MarkStack* mark_stack_;
124
125 HeapBitmap* mark_bitmap_;
126
Carl Shapiro58551df2011-07-24 03:09:51 -0700127 HeapBitmap* live_bitmap_;
Carl Shapiro69759ea2011-07-21 18:13:35 -0700128
129 Object* finger_;
130
131 Object* condemned_;
132
133 Object* soft_reference_list_;
134
135 Object* weak_reference_list_;
136
137 Object* finalizer_reference_list_;
138
139 Object* phantom_reference_list_;
140
141 Object* cleared_reference_list_;
142
143 static size_t reference_referent_offset_;
144
145 static size_t reference_queue_offset_;
146
147 static size_t reference_queueNext_offset_;
148
149 static size_t reference_pendingNext_offset_;
150
151 static size_t finalizer_reference_zombie_offset_;
152
153 DISALLOW_COPY_AND_ASSIGN(MarkSweep);
154};
155
156} // namespace art
157
158#endif // ART_SRC_MARK_SWEEP_H_