| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |