blob: bcb4df0a4e59eea0c14a06250fc46e2d8f9ae53f [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"
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),
25 cleared_reference_list_(NULL) {
Carl Shapiro58551df2011-07-24 03:09:51 -070026 }
27
Carl Shapiro69759ea2011-07-21 18:13:35 -070028 ~MarkSweep();
29
Carl Shapiro58551df2011-07-24 03:09:51 -070030 // Initializes internal structures.
31 bool Init();
32
Carl Shapiro69759ea2011-07-21 18:13:35 -070033 // Marks the root set at the start of a garbage collection.
34 void MarkRoots();
35
Carl Shapiro58551df2011-07-24 03:09:51 -070036 // Builds a mark stack and recursively mark until it empties.
37 void RecursiveMark();
38
Carl Shapiro69759ea2011-07-21 18:13:35 -070039 // Remarks the root set after completing the concurrent mark.
40 void ReMarkRoots();
41
Carl Shapiro58551df2011-07-24 03:09:51 -070042 void ProcessReferences(bool clear_soft_references) {
43 ProcessReferences(&soft_reference_list_, clear_soft_references,
44 &weak_reference_list_,
45 &finalizer_reference_list_,
46 &phantom_reference_list_);
47 }
48
Carl Shapiro69759ea2011-07-21 18:13:35 -070049 // Sweeps unmarked objects to complete the garbage collection.
50 void Sweep();
51
Elliott Hughesadb460d2011-10-05 17:02:34 -070052 Object* GetClearedReferences() {
53 return cleared_reference_list_;
54 }
55
Carl Shapiro69759ea2011-07-21 18:13:35 -070056 private:
57 // Returns true if the object has its bit set in the mark bitmap.
58 bool IsMarked(const Object* object) const {
59 return mark_bitmap_->Test(object);
60 }
61
Elliott Hughesc33a32b2011-10-11 18:18:07 -070062 static bool IsMarked(const Object* object, void* arg) {
63 return reinterpret_cast<MarkSweep*>(arg)->IsMarked(object);
64 }
65
Elliott Hughescf4c6c42011-09-01 15:16:42 -070066 static void MarkObjectVisitor(const Object* root, void* arg);
Brian Carlstrom1f870082011-08-23 16:02:11 -070067
Carl Shapiro69759ea2011-07-21 18:13:35 -070068 // Marks an object.
69 void MarkObject(const Object* obj);
70
71 // Yuck.
72 void MarkObject0(const Object* obj, bool check_finger);
73
Carl Shapiro58551df2011-07-24 03:09:51 -070074 static void ScanBitmapCallback(Object* obj, void* finger, void* arg);
75
76 static void SweepCallback(size_t num_ptrs, void** ptrs, void* arg);
77
Carl Shapiro69759ea2011-07-21 18:13:35 -070078 // Blackens an object.
79 void ScanObject(const Object* obj);
80
81 // Grays references in instance fields.
82 void ScanInstanceFields(const Object* obj);
83
84 // Blackens a class object.
85 void ScanClass(const Object* obj);
86
87 // Grays references in static fields.
88 void ScanStaticFields(const Class* klass);
89
Brian Carlstrom4873d462011-08-21 15:23:39 -070090 // Used by ScanInstanceFields and ScanStaticFields
91 void ScanFields(const Object* obj, uint32_t ref_offsets, bool is_static);
92
Carl Shapiro69759ea2011-07-21 18:13:35 -070093 // Grays references in an array.
94 void ScanArray(const Object* obj);
95
Carl Shapiro58551df2011-07-24 03:09:51 -070096 void ScanOther(const Object* obj);
Carl Shapiro69759ea2011-07-21 18:13:35 -070097
98 // Blackens objects grayed during a garbage collection.
99 void ScanDirtyObjects();
100
101 // Schedules an unmarked object for reference processing.
102 void DelayReferenceReferent(Object* reference);
103
104 // Recursively blackens objects on the mark stack.
105 void ProcessMarkStack();
106
Carl Shapiro69759ea2011-07-21 18:13:35 -0700107 void EnqueueFinalizerReferences(Object** ref);
108
109 void PreserveSomeSoftReferences(Object** ref);
110
Carl Shapiro69759ea2011-07-21 18:13:35 -0700111 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();
Elliott Hughes410c0c82011-09-01 17:58:25 -0700119 void SweepJniWeakGlobals();
Carl Shapiro58551df2011-07-24 03:09:51 -0700120
Carl Shapiro69759ea2011-07-21 18:13:35 -0700121 MarkStack* mark_stack_;
122
123 HeapBitmap* mark_bitmap_;
124
Carl Shapiro58551df2011-07-24 03:09:51 -0700125 HeapBitmap* live_bitmap_;
Carl Shapiro69759ea2011-07-21 18:13:35 -0700126
127 Object* finger_;
128
129 Object* condemned_;
130
131 Object* soft_reference_list_;
132
133 Object* weak_reference_list_;
134
135 Object* finalizer_reference_list_;
136
137 Object* phantom_reference_list_;
138
139 Object* cleared_reference_list_;
140
Elliott Hughes410c0c82011-09-01 17:58:25 -0700141 friend class InternTableEntryIsUnmarked;
142
Carl Shapiro69759ea2011-07-21 18:13:35 -0700143 DISALLOW_COPY_AND_ASSIGN(MarkSweep);
144};
145
146} // namespace art
147
148#endif // ART_SRC_MARK_SWEEP_H_