| 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 "vm/allocation.h" | 7 #include "vm/allocation.h" |
| 8 #include "vm/dart_api_state.h" | 8 #include "vm/dart_api_state.h" |
| 9 #include "vm/isolate.h" | 9 #include "vm/isolate.h" |
| 10 #include "vm/pages.h" | 10 #include "vm/pages.h" |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 259 isolate->VisitWeakPersistentHandles(visitor, | 259 isolate->VisitWeakPersistentHandles(visitor, |
| 260 visit_prologue_weak_persistent_handles); | 260 visit_prologue_weak_persistent_handles); |
| 261 } | 261 } |
| 262 | 262 |
| 263 | 263 |
| 264 void GCMarker::IterateWeakReferences(Isolate* isolate, | 264 void GCMarker::IterateWeakReferences(Isolate* isolate, |
| 265 MarkingVisitor* visitor) { | 265 MarkingVisitor* visitor) { |
| 266 ApiState* state = isolate->api_state(); | 266 ApiState* state = isolate->api_state(); |
| 267 ASSERT(state != NULL); | 267 ASSERT(state != NULL); |
| 268 while (true) { | 268 while (true) { |
| 269 WeakReference* queue = state->delayed_weak_references(); | 269 WeakReferenceSet* queue = state->delayed_weak_reference_sets(); |
| 270 if (queue == NULL) { | 270 if (queue == NULL) { |
| 271 // The delay queue is empty therefore no clean-up is required. | 271 // The delay queue is empty therefore no clean-up is required. |
| 272 return; | 272 return; |
| 273 } | 273 } |
| 274 state->set_delayed_weak_references(NULL); | 274 state->set_delayed_weak_reference_sets(NULL); |
| 275 while (queue != NULL) { | 275 while (queue != NULL) { |
| 276 WeakReference* reference = WeakReference::Pop(&queue); | 276 WeakReferenceSet* reference_set = WeakReferenceSet::Pop(&queue); |
| 277 ASSERT(reference != NULL); | 277 ASSERT(reference_set != NULL); |
| 278 bool is_unreachable = true; | 278 bool is_unreachable = true; |
| 279 // Test each key object for reachability. If a key object is | 279 // Test each key object for reachability. If a key object is |
| 280 // reachable, all value objects should be marked. | 280 // reachable, all value objects should be marked. |
| 281 for (intptr_t k = 0; k < reference->num_keys(); ++k) { | 281 for (intptr_t k = 0; k < reference_set->num_keys(); ++k) { |
| 282 if (!IsUnreachable(*reference->get_key(k))) { | 282 if (!IsUnreachable(*reference_set->get_key(k))) { |
| 283 for (intptr_t v = 0; v < reference->num_values(); ++v) { | 283 for (intptr_t v = 0; v < reference_set->num_values(); ++v) { |
| 284 visitor->VisitPointer(reference->get_value(v)); | 284 visitor->VisitPointer(reference_set->get_value(v)); |
| 285 } | 285 } |
| 286 is_unreachable = false; | 286 is_unreachable = false; |
| 287 delete reference; | 287 delete reference_set; |
| 288 break; | 288 break; |
| 289 } | 289 } |
| 290 } | 290 } |
| 291 // If all key objects are unreachable put the reference on a | 291 // If all key objects are unreachable put the reference on a |
| 292 // delay queue. This reference will be revisited if another | 292 // delay queue. This reference will be revisited if another |
| 293 // reference is marked. | 293 // reference is marked. |
| 294 if (is_unreachable) { | 294 if (is_unreachable) { |
| 295 state->DelayWeakReference(reference); | 295 state->DelayWeakReferenceSet(reference_set); |
| 296 } | 296 } |
| 297 } | 297 } |
| 298 if (!visitor->marking_stack()->IsEmpty()) { | 298 if (!visitor->marking_stack()->IsEmpty()) { |
| 299 DrainMarkingStack(isolate, visitor); | 299 DrainMarkingStack(isolate, visitor); |
| 300 } else { | 300 } else { |
| 301 // Break out of the loop if there has been no forward process. | 301 // Break out of the loop if there has been no forward process. |
| 302 break; | 302 break; |
| 303 } | 303 } |
| 304 } | 304 } |
| 305 // Deallocate any unmarked references on the delay queue. | 305 // Deallocate any unmarked references on the delay queue. |
| 306 if (state->delayed_weak_references() != NULL) { | 306 if (state->delayed_weak_reference_sets() != NULL) { |
| 307 WeakReference* queue = state->delayed_weak_references(); | 307 WeakReferenceSet* queue = state->delayed_weak_reference_sets(); |
| 308 state->set_delayed_weak_references(NULL); | 308 state->set_delayed_weak_reference_sets(NULL); |
| 309 while (queue != NULL) { | 309 while (queue != NULL) { |
| 310 delete WeakReference::Pop(&queue); | 310 delete WeakReferenceSet::Pop(&queue); |
| 311 } | 311 } |
| 312 } | 312 } |
| 313 } | 313 } |
| 314 | 314 |
| 315 | 315 |
| 316 void GCMarker::DrainMarkingStack(Isolate* isolate, | 316 void GCMarker::DrainMarkingStack(Isolate* isolate, |
| 317 MarkingVisitor* visitor) { | 317 MarkingVisitor* visitor) { |
| 318 visitor->set_update_store_buffers(true); | 318 visitor->set_update_store_buffers(true); |
| 319 while (!visitor->marking_stack()->IsEmpty()) { | 319 while (!visitor->marking_stack()->IsEmpty()) { |
| 320 RawObject* raw_obj = visitor->marking_stack()->Pop(); | 320 RawObject* raw_obj = visitor->marking_stack()->Pop(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 332 MarkingVisitor mark(isolate, heap_, page_space, &marking_stack); | 332 MarkingVisitor mark(isolate, heap_, page_space, &marking_stack); |
| 333 IterateRoots(isolate, &mark, !invoke_api_callbacks); | 333 IterateRoots(isolate, &mark, !invoke_api_callbacks); |
| 334 DrainMarkingStack(isolate, &mark); | 334 DrainMarkingStack(isolate, &mark); |
| 335 IterateWeakReferences(isolate, &mark); | 335 IterateWeakReferences(isolate, &mark); |
| 336 MarkingWeakVisitor mark_weak; | 336 MarkingWeakVisitor mark_weak; |
| 337 IterateWeakRoots(isolate, &mark_weak, invoke_api_callbacks); | 337 IterateWeakRoots(isolate, &mark_weak, invoke_api_callbacks); |
| 338 Epilogue(isolate, invoke_api_callbacks); | 338 Epilogue(isolate, invoke_api_callbacks); |
| 339 } | 339 } |
| 340 | 340 |
| 341 } // namespace dart | 341 } // namespace dart |
| OLD | NEW |