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

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

Issue 10824053: Rename WeakReference to WeakReferenceSet. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 4 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
« no previous file with comments | « runtime/vm/dart_api_state.h ('k') | runtime/vm/scavenger.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "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
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
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
OLDNEW
« no previous file with comments | « runtime/vm/dart_api_state.h ('k') | runtime/vm/scavenger.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698