blob: cf099adb5f4c6ae1f2afec41fe67d1d7a0c928c0 [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 Hughescf4c6c42011-09-01 15:16:42 -070062 static void MarkObjectVisitor(const Object* root, void* arg);
Brian Carlstrom1f870082011-08-23 16:02:11 -070063
Carl Shapiro69759ea2011-07-21 18:13:35 -070064 // Marks an object.
65 void MarkObject(const Object* obj);
66
67 // Yuck.
68 void MarkObject0(const Object* obj, bool check_finger);
69
Carl Shapiro58551df2011-07-24 03:09:51 -070070 static void ScanBitmapCallback(Object* obj, void* finger, void* arg);
71
72 static void SweepCallback(size_t num_ptrs, void** ptrs, void* arg);
73
Carl Shapiro69759ea2011-07-21 18:13:35 -070074 // Blackens an object.
75 void ScanObject(const Object* obj);
76
77 // Grays references in instance fields.
78 void ScanInstanceFields(const Object* obj);
79
80 // Blackens a class object.
81 void ScanClass(const Object* obj);
82
83 // Grays references in static fields.
84 void ScanStaticFields(const Class* klass);
85
Brian Carlstrom4873d462011-08-21 15:23:39 -070086 // Used by ScanInstanceFields and ScanStaticFields
87 void ScanFields(const Object* obj, uint32_t ref_offsets, bool is_static);
88
Carl Shapiro69759ea2011-07-21 18:13:35 -070089 // Grays references in an array.
90 void ScanArray(const Object* obj);
91
Carl Shapiro58551df2011-07-24 03:09:51 -070092 void ScanOther(const Object* obj);
Carl Shapiro69759ea2011-07-21 18:13:35 -070093
94 // Blackens objects grayed during a garbage collection.
95 void ScanDirtyObjects();
96
97 // Schedules an unmarked object for reference processing.
98 void DelayReferenceReferent(Object* reference);
99
100 // Recursively blackens objects on the mark stack.
101 void ProcessMarkStack();
102
Carl Shapiro69759ea2011-07-21 18:13:35 -0700103 void EnqueueFinalizerReferences(Object** ref);
104
105 void PreserveSomeSoftReferences(Object** ref);
106
Carl Shapiro69759ea2011-07-21 18:13:35 -0700107 void ClearWhiteReferences(Object** list);
108
Carl Shapiro58551df2011-07-24 03:09:51 -0700109 void ProcessReferences(Object** soft_references, bool clear_soft_references,
Carl Shapiro69759ea2011-07-21 18:13:35 -0700110 Object** weak_references,
111 Object** finalizer_references,
112 Object** phantom_references);
113
Carl Shapiro58551df2011-07-24 03:09:51 -0700114 void SweepSystemWeaks();
Elliott Hughes410c0c82011-09-01 17:58:25 -0700115 void SweepMonitorList();
116 void SweepJniWeakGlobals();
Carl Shapiro58551df2011-07-24 03:09:51 -0700117
Carl Shapiro69759ea2011-07-21 18:13:35 -0700118 MarkStack* mark_stack_;
119
120 HeapBitmap* mark_bitmap_;
121
Carl Shapiro58551df2011-07-24 03:09:51 -0700122 HeapBitmap* live_bitmap_;
Carl Shapiro69759ea2011-07-21 18:13:35 -0700123
124 Object* finger_;
125
126 Object* condemned_;
127
128 Object* soft_reference_list_;
129
130 Object* weak_reference_list_;
131
132 Object* finalizer_reference_list_;
133
134 Object* phantom_reference_list_;
135
136 Object* cleared_reference_list_;
137
Elliott Hughes410c0c82011-09-01 17:58:25 -0700138 friend class InternTableEntryIsUnmarked;
139
Carl Shapiro69759ea2011-07-21 18:13:35 -0700140 DISALLOW_COPY_AND_ASSIGN(MarkSweep);
141};
142
143} // namespace art
144
145#endif // ART_SRC_MARK_SWEEP_H_