blob: 47a703a5d1f4456eece30fe9260aaa0b401f08e5 [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
73 // Grays interface class objects.
74 void ScanInterfaces(const Class* klass);
75
76 // Grays references in an array.
77 void ScanArray(const Object* obj);
78
Carl Shapiro58551df2011-07-24 03:09:51 -070079 void ScanOther(const Object* obj);
Carl Shapiro69759ea2011-07-21 18:13:35 -070080
81 // Blackens objects grayed during a garbage collection.
82 void ScanDirtyObjects();
83
84 // Schedules an unmarked object for reference processing.
85 void DelayReferenceReferent(Object* reference);
86
87 // Recursively blackens objects on the mark stack.
88 void ProcessMarkStack();
89
90 // Adds a reference to the tail of a circular queue of references.
91 static void EnqueuePendingReference(Object* ref, Object** list);
92
93 // Removes the reference at the head of a circular queue of
94 // references.
95 static Object* DequeuePendingReference(Object** list);
96
97 // Sets the referent field of a reference object to null.
98 static void ClearReference(Object* reference);
99
100 // Returns true if the reference object has not yet been enqueued.
101 static bool IsEnqueuable(const Object* ref);
102
103 void EnqueueReference(Object* ref);
104
105 void EnqueueFinalizerReferences(Object** ref);
106
107 void PreserveSomeSoftReferences(Object** ref);
108
109 void EnqueueClearedReferences(Object** cleared_references);
110
111 void ClearWhiteReferences(Object** list);
112
Carl Shapiro58551df2011-07-24 03:09:51 -0700113 void ProcessReferences(Object** soft_references, bool clear_soft_references,
Carl Shapiro69759ea2011-07-21 18:13:35 -0700114 Object** weak_references,
115 Object** finalizer_references,
116 Object** phantom_references);
117
Carl Shapiro58551df2011-07-24 03:09:51 -0700118 void SweepSystemWeaks();
119
Carl Shapiro69759ea2011-07-21 18:13:35 -0700120 MarkStack* mark_stack_;
121
122 HeapBitmap* mark_bitmap_;
123
Carl Shapiro58551df2011-07-24 03:09:51 -0700124 HeapBitmap* live_bitmap_;
Carl Shapiro69759ea2011-07-21 18:13:35 -0700125
126 Object* finger_;
127
128 Object* condemned_;
129
130 Object* soft_reference_list_;
131
132 Object* weak_reference_list_;
133
134 Object* finalizer_reference_list_;
135
136 Object* phantom_reference_list_;
137
138 Object* cleared_reference_list_;
139
140 static size_t reference_referent_offset_;
141
142 static size_t reference_queue_offset_;
143
144 static size_t reference_queueNext_offset_;
145
146 static size_t reference_pendingNext_offset_;
147
148 static size_t finalizer_reference_zombie_offset_;
149
150 DISALLOW_COPY_AND_ASSIGN(MarkSweep);
151};
152
153} // namespace art
154
155#endif // ART_SRC_MARK_SWEEP_H_