Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(60)

Side by Side Diff: runtime/vm/gc_marker.cc

Issue 13406004: - Remember objects (not addresses) in the old generation containing new pointers. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/gc_marker.h" 5 #include "vm/gc_marker.h"
6 6
7 #include <map> 7 #include <map>
8 #include <utility> 8 #include <utility>
9 9
10 #include "vm/allocation.h" 10 #include "vm/allocation.h"
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 public: 121 public:
122 MarkingVisitor(Isolate* isolate, 122 MarkingVisitor(Isolate* isolate,
123 Heap* heap, 123 Heap* heap,
124 PageSpace* page_space, 124 PageSpace* page_space,
125 MarkingStack* marking_stack) 125 MarkingStack* marking_stack)
126 : ObjectPointerVisitor(isolate), 126 : ObjectPointerVisitor(isolate),
127 heap_(heap), 127 heap_(heap),
128 vm_heap_(Dart::vm_isolate()->heap()), 128 vm_heap_(Dart::vm_isolate()->heap()),
129 page_space_(page_space), 129 page_space_(page_space),
130 marking_stack_(marking_stack), 130 marking_stack_(marking_stack),
131 update_store_buffers_(false) { 131 visiting_old_object_(NULL) {
132 ASSERT(heap_ != vm_heap_); 132 ASSERT(heap_ != vm_heap_);
133 } 133 }
134 134
135 MarkingStack* marking_stack() const { return marking_stack_; } 135 MarkingStack* marking_stack() const { return marking_stack_; }
136 136
137 void VisitPointers(RawObject** first, RawObject** last) { 137 void VisitPointers(RawObject** first, RawObject** last) {
138 for (RawObject** current = first; current <= last; current++) { 138 for (RawObject** current = first; current <= last; current++) {
139 MarkObject(*current, current); 139 MarkObject(*current, current);
140 } 140 }
141 } 141 }
(...skipping 10 matching lines...) Expand all
152 delay_set_.insert(std::make_pair(raw_key, raw_weak)); 152 delay_set_.insert(std::make_pair(raw_key, raw_weak));
153 } 153 }
154 154
155 void Finalize() { 155 void Finalize() {
156 DelaySet::iterator it = delay_set_.begin(); 156 DelaySet::iterator it = delay_set_.begin();
157 for (; it != delay_set_.end(); ++it) { 157 for (; it != delay_set_.end(); ++it) {
158 WeakProperty::Clear(it->second); 158 WeakProperty::Clear(it->second);
159 } 159 }
160 } 160 }
161 161
162 void set_update_store_buffers(bool val) { update_store_buffers_ = val; } 162 void VisitingOldObject(RawObject* obj) {
163 ASSERT((obj == NULL) || obj->IsOldObject());
164 visiting_old_object_ = obj;
165 }
163 166
164 private: 167 private:
165 void MarkAndPush(RawObject* raw_obj) { 168 void MarkAndPush(RawObject* raw_obj) {
166 ASSERT(raw_obj->IsHeapObject()); 169 ASSERT(raw_obj->IsHeapObject());
167 ASSERT((FLAG_verify_before_gc || FLAG_verify_before_gc) ? 170 ASSERT((FLAG_verify_before_gc || FLAG_verify_before_gc) ?
168 page_space_->Contains(RawObject::ToAddr(raw_obj)) : 171 page_space_->Contains(RawObject::ToAddr(raw_obj)) :
169 true); 172 true);
170 173
171 // Mark the object and push it on the marking stack. 174 // Mark the object and push it on the marking stack.
172 ASSERT(!raw_obj->IsMarked()); 175 ASSERT(!raw_obj->IsMarked());
(...skipping 22 matching lines...) Expand all
195 void MarkObject(RawObject* raw_obj, RawObject** p) { 198 void MarkObject(RawObject* raw_obj, RawObject** p) {
196 // Fast exit if the raw object is a Smi. 199 // Fast exit if the raw object is a Smi.
197 if (!raw_obj->IsHeapObject()) return; 200 if (!raw_obj->IsHeapObject()) return;
198 201
199 // Fast exit if the raw object is marked. 202 // Fast exit if the raw object is marked.
200 if (raw_obj->IsMarked()) return; 203 if (raw_obj->IsMarked()) return;
201 204
202 // Skip over new objects, but verify consistency of heap while at it. 205 // Skip over new objects, but verify consistency of heap while at it.
203 if (raw_obj->IsNewObject()) { 206 if (raw_obj->IsNewObject()) {
204 // TODO(iposva): Add consistency check. 207 // TODO(iposva): Add consistency check.
205 if (update_store_buffers_) { 208 if (visiting_old_object_ != NULL) {
206 ASSERT(p != NULL); 209 ASSERT(p != NULL);
207 isolate()->store_buffer()->AddPointer(reinterpret_cast<uword>(p)); 210 isolate()->store_buffer()->AddPointer(
211 reinterpret_cast<uword>(visiting_old_object_));
208 } 212 }
209 return; 213 return;
210 } 214 }
211 215
212 MarkAndPush(raw_obj); 216 MarkAndPush(raw_obj);
213 } 217 }
214 218
215 Heap* heap_; 219 Heap* heap_;
216 Heap* vm_heap_; 220 Heap* vm_heap_;
217 PageSpace* page_space_; 221 PageSpace* page_space_;
218 MarkingStack* marking_stack_; 222 MarkingStack* marking_stack_;
223 RawObject* visiting_old_object_;
219 typedef std::multimap<RawObject*, RawWeakProperty*> DelaySet; 224 typedef std::multimap<RawObject*, RawWeakProperty*> DelaySet;
220 DelaySet delay_set_; 225 DelaySet delay_set_;
221 bool update_store_buffers_;
222 226
223 DISALLOW_IMPLICIT_CONSTRUCTORS(MarkingVisitor); 227 DISALLOW_IMPLICIT_CONSTRUCTORS(MarkingVisitor);
224 }; 228 };
225 229
226 230
227 bool IsUnreachable(const RawObject* raw_obj) { 231 bool IsUnreachable(const RawObject* raw_obj) {
228 if (!raw_obj->IsHeapObject()) { 232 if (!raw_obj->IsHeapObject()) {
229 return false; 233 return false;
230 } 234 }
231 if (raw_obj == Object::null()) { 235 if (raw_obj == Object::null()) {
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 state->set_delayed_weak_reference_sets(NULL); 345 state->set_delayed_weak_reference_sets(NULL);
342 while (queue != NULL) { 346 while (queue != NULL) {
343 delete WeakReferenceSet::Pop(&queue); 347 delete WeakReferenceSet::Pop(&queue);
344 } 348 }
345 } 349 }
346 } 350 }
347 351
348 352
349 void GCMarker::DrainMarkingStack(Isolate* isolate, 353 void GCMarker::DrainMarkingStack(Isolate* isolate,
350 MarkingVisitor* visitor) { 354 MarkingVisitor* visitor) {
351 visitor->set_update_store_buffers(true);
352 while (!visitor->marking_stack()->IsEmpty()) { 355 while (!visitor->marking_stack()->IsEmpty()) {
353 RawObject* raw_obj = visitor->marking_stack()->Pop(); 356 RawObject* raw_obj = visitor->marking_stack()->Pop();
357 visitor->VisitingOldObject(raw_obj);
354 if (raw_obj->GetClassId() != kWeakPropertyCid) { 358 if (raw_obj->GetClassId() != kWeakPropertyCid) {
355 raw_obj->VisitPointers(visitor); 359 raw_obj->VisitPointers(visitor);
356 } else { 360 } else {
357 RawWeakProperty* raw_weak = reinterpret_cast<RawWeakProperty*>(raw_obj); 361 RawWeakProperty* raw_weak = reinterpret_cast<RawWeakProperty*>(raw_obj);
358 ProcessWeakProperty(raw_weak, visitor); 362 ProcessWeakProperty(raw_weak, visitor);
359 } 363 }
360 } 364 }
361 visitor->set_update_store_buffers(false); 365 visitor->VisitingOldObject(NULL);
362 } 366 }
363 367
364 368
365 void GCMarker::ProcessWeakProperty(RawWeakProperty* raw_weak, 369 void GCMarker::ProcessWeakProperty(RawWeakProperty* raw_weak,
366 MarkingVisitor* visitor) { 370 MarkingVisitor* visitor) {
367 // The fate of the weak property is determined by its key. 371 // The fate of the weak property is determined by its key.
368 RawObject* raw_key = raw_weak->ptr()->key_; 372 RawObject* raw_key = raw_weak->ptr()->key_;
369 if (raw_key->IsHeapObject() && 373 if (raw_key->IsHeapObject() &&
370 raw_key->IsOldObject() && 374 raw_key->IsOldObject() &&
371 !raw_key->IsMarked()) { 375 !raw_key->IsMarked()) {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
405 DrainMarkingStack(isolate, &mark); 409 DrainMarkingStack(isolate, &mark);
406 IterateWeakReferences(isolate, &mark); 410 IterateWeakReferences(isolate, &mark);
407 MarkingWeakVisitor mark_weak; 411 MarkingWeakVisitor mark_weak;
408 IterateWeakRoots(isolate, &mark_weak, invoke_api_callbacks); 412 IterateWeakRoots(isolate, &mark_weak, invoke_api_callbacks);
409 mark.Finalize(); 413 mark.Finalize();
410 ProcessPeerReferents(page_space); 414 ProcessPeerReferents(page_space);
411 Epilogue(isolate, invoke_api_callbacks); 415 Epilogue(isolate, invoke_api_callbacks);
412 } 416 }
413 417
414 } // namespace dart 418 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/assembler_x64.cc ('k') | runtime/vm/object.h » ('j') | runtime/vm/object.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698