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

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

Issue 238063011: Modify the Weak Reference Set creation API to make it easier to create (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 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
« runtime/vm/gc_marker.cc ('K') | « runtime/vm/gc_marker.cc ('k') | no next file » | 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/scavenger.h" 5 #include "vm/scavenger.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <map> 8 #include <map>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after
520 ASSERT(reference_set != NULL); 520 ASSERT(reference_set != NULL);
521 bool is_unreachable = true; 521 bool is_unreachable = true;
522 // Test each key object for reachability. If a key object is 522 // Test each key object for reachability. If a key object is
523 // reachable, all value objects should be scavenged. 523 // reachable, all value objects should be scavenged.
524 for (intptr_t k = 0; k < reference_set->num_keys(); ++k) { 524 for (intptr_t k = 0; k < reference_set->num_keys(); ++k) {
525 if (!IsUnreachable(reference_set->get_key(k))) { 525 if (!IsUnreachable(reference_set->get_key(k))) {
526 for (intptr_t v = 0; v < reference_set->num_values(); ++v) { 526 for (intptr_t v = 0; v < reference_set->num_values(); ++v) {
527 visitor->VisitPointer(reference_set->get_value(v)); 527 visitor->VisitPointer(reference_set->get_value(v));
528 } 528 }
529 is_unreachable = false; 529 is_unreachable = false;
530 delete reference_set;
531 break; 530 break;
Ivan Posva 2014/04/17 23:47:44 ditto
siva 2014/04/21 18:04:14 Done.
532 } 531 }
533 } 532 }
534 // If all key objects are unreachable put the reference on a 533 // If all key objects are unreachable put the reference on a
535 // delay queue. This reference will be revisited if another 534 // delay queue. This reference will be revisited if another
536 // reference is scavenged. 535 // reference is scavenged.
537 if (is_unreachable) { 536 if (is_unreachable) {
538 state->DelayWeakReferenceSet(reference_set); 537 state->DelayWeakReferenceSet(reference_set);
539 } 538 }
540 } 539 }
541 if ((resolved_top_ < top_) || PromotedStackHasMore()) { 540 if ((resolved_top_ < top_) || PromotedStackHasMore()) {
542 ProcessToSpace(visitor); 541 ProcessToSpace(visitor);
543 } else { 542 } else {
544 // Break out of the loop if there has been no forward process. 543 // Break out of the loop if there has been no forward process.
545 break; 544 break;
546 } 545 }
547 } 546 }
548 // Deallocate any unreachable references on the delay queue. 547 // All weak reference sets are zone allocated and unmarked references on
549 if (state->delayed_weak_reference_sets() != NULL) { 548 // the delay queue will be freed when the zone is released in the epilog
550 WeakReferenceSet* queue = state->delayed_weak_reference_sets(); 549 // callback.
551 state->set_delayed_weak_reference_sets(NULL);
552 while (queue != NULL) {
553 delete WeakReferenceSet::Pop(&queue);
554 }
555 }
556 } 550 }
557 551
558 552
559 void Scavenger::IterateWeakRoots(Isolate* isolate, 553 void Scavenger::IterateWeakRoots(Isolate* isolate,
560 HandleVisitor* visitor, 554 HandleVisitor* visitor,
561 bool visit_prologue_weak_persistent_handles) { 555 bool visit_prologue_weak_persistent_handles) {
562 isolate->VisitWeakPersistentHandles(visitor, 556 isolate->VisitWeakPersistentHandles(visitor,
563 visit_prologue_weak_persistent_handles); 557 visit_prologue_weak_persistent_handles);
564 } 558 }
565 559
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
769 } 763 }
770 764
771 765
772 void Scavenger::FreeExternal(intptr_t size) { 766 void Scavenger::FreeExternal(intptr_t size) {
773 ASSERT(size >= 0); 767 ASSERT(size >= 0);
774 external_size_ -= size; 768 external_size_ -= size;
775 ASSERT(external_size_ >= 0); 769 ASSERT(external_size_ >= 0);
776 } 770 }
777 771
778 } // namespace dart 772 } // namespace dart
OLDNEW
« runtime/vm/gc_marker.cc ('K') | « runtime/vm/gc_marker.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698