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/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 |
11 #include "vm/dart.h" | 11 #include "vm/dart.h" |
12 #include "vm/dart_api_state.h" | 12 #include "vm/dart_api_state.h" |
13 #include "vm/isolate.h" | 13 #include "vm/isolate.h" |
14 #include "vm/object.h" | 14 #include "vm/object.h" |
15 #include "vm/stack_frame.h" | 15 #include "vm/stack_frame.h" |
16 #include "vm/store_buffer.h" | 16 #include "vm/store_buffer.h" |
17 #include "vm/verifier.h" | 17 #include "vm/verifier.h" |
18 #include "vm/visitor.h" | 18 #include "vm/visitor.h" |
19 #include "vm/weak_table.h" | 19 #include "vm/weak_table.h" |
| 20 #include "vm/object_id_ring.h" |
20 | 21 |
21 namespace dart { | 22 namespace dart { |
22 | 23 |
23 // Scavenger uses RawObject::kMarkBit to distinguish forwaded and non-forwarded | 24 // Scavenger uses RawObject::kMarkBit to distinguish forwaded and non-forwarded |
24 // objects. The kMarkBit does not intersect with the target address because of | 25 // objects. The kMarkBit does not intersect with the target address because of |
25 // object alignment. | 26 // object alignment. |
26 enum { | 27 enum { |
27 kForwardingMask = 1 << RawObject::kMarkBit, | 28 kForwardingMask = 1 << RawObject::kMarkBit, |
28 kNotForwarded = 0, | 29 kNotForwarded = 0, |
29 kForwarded = kForwardingMask, | 30 kForwarded = kForwardingMask, |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
397 } | 398 } |
398 delete pending; | 399 delete pending; |
399 pending = next; | 400 pending = next; |
400 } | 401 } |
401 heap_->RecordData(kStoreBufferEntries, entries); | 402 heap_->RecordData(kStoreBufferEntries, entries); |
402 // Done iterating through old objects remembered in the store buffers. | 403 // Done iterating through old objects remembered in the store buffers. |
403 visitor->VisitingOldObject(NULL); | 404 visitor->VisitingOldObject(NULL); |
404 } | 405 } |
405 | 406 |
406 | 407 |
| 408 void Scavenger::IterateObjectIdTable(Isolate* isolate, |
| 409 ScavengerVisitor* visitor) { |
| 410 ObjectIdRing* ring = isolate->object_id_ring(); |
| 411 ASSERT(ring != NULL); |
| 412 ring->VisitPointers(visitor); |
| 413 } |
| 414 |
| 415 |
407 void Scavenger::IterateRoots(Isolate* isolate, | 416 void Scavenger::IterateRoots(Isolate* isolate, |
408 ScavengerVisitor* visitor, | 417 ScavengerVisitor* visitor, |
409 bool visit_prologue_weak_persistent_handles) { | 418 bool visit_prologue_weak_persistent_handles) { |
410 int64_t start = OS::GetCurrentTimeMicros(); | 419 int64_t start = OS::GetCurrentTimeMicros(); |
411 isolate->VisitObjectPointers(visitor, | 420 isolate->VisitObjectPointers(visitor, |
412 visit_prologue_weak_persistent_handles, | 421 visit_prologue_weak_persistent_handles, |
413 StackFrameIterator::kDontValidateFrames); | 422 StackFrameIterator::kDontValidateFrames); |
414 int64_t middle = OS::GetCurrentTimeMicros(); | 423 int64_t middle = OS::GetCurrentTimeMicros(); |
415 IterateStoreBuffers(isolate, visitor); | 424 IterateStoreBuffers(isolate, visitor); |
| 425 IterateObjectIdTable(isolate, visitor); |
416 int64_t end = OS::GetCurrentTimeMicros(); | 426 int64_t end = OS::GetCurrentTimeMicros(); |
417 heap_->RecordTime(kVisitIsolateRoots, middle - start); | 427 heap_->RecordTime(kVisitIsolateRoots, middle - start); |
418 heap_->RecordTime(kIterateStoreBuffers, end - middle); | 428 heap_->RecordTime(kIterateStoreBuffers, end - middle); |
419 } | 429 } |
420 | 430 |
421 | 431 |
422 bool Scavenger::IsUnreachable(RawObject** p) { | 432 bool Scavenger::IsUnreachable(RawObject** p) { |
423 RawObject* raw_obj = *p; | 433 RawObject* raw_obj = *p; |
424 if (!raw_obj->IsHeapObject()) { | 434 if (!raw_obj->IsHeapObject()) { |
425 return false; | 435 return false; |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
659 } | 669 } |
660 | 670 |
661 | 671 |
662 void Scavenger::WriteProtect(bool read_only) { | 672 void Scavenger::WriteProtect(bool read_only) { |
663 space_->Protect( | 673 space_->Protect( |
664 read_only ? VirtualMemory::kReadOnly : VirtualMemory::kReadWrite); | 674 read_only ? VirtualMemory::kReadOnly : VirtualMemory::kReadWrite); |
665 } | 675 } |
666 | 676 |
667 | 677 |
668 } // namespace dart | 678 } // namespace dart |
OLD | NEW |