OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_HEAP_MARK_COMPACT_H_ | 5 #ifndef V8_HEAP_MARK_COMPACT_H_ |
6 #define V8_HEAP_MARK_COMPACT_H_ | 6 #define V8_HEAP_MARK_COMPACT_H_ |
7 | 7 |
8 #include "src/base/bits.h" | 8 #include "src/base/bits.h" |
9 #include "src/heap/spaces.h" | 9 #include "src/heap/spaces.h" |
10 | 10 |
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
367 buffer = buffer->next(); | 367 buffer = buffer->next(); |
368 } | 368 } |
369 } | 369 } |
370 | 370 |
371 enum AdditionMode { FAIL_ON_OVERFLOW, IGNORE_OVERFLOW }; | 371 enum AdditionMode { FAIL_ON_OVERFLOW, IGNORE_OVERFLOW }; |
372 | 372 |
373 static bool ChainLengthThresholdReached(SlotsBuffer* buffer) { | 373 static bool ChainLengthThresholdReached(SlotsBuffer* buffer) { |
374 return buffer != NULL && buffer->chain_length_ >= kChainLengthThreshold; | 374 return buffer != NULL && buffer->chain_length_ >= kChainLengthThreshold; |
375 } | 375 } |
376 | 376 |
| 377 INLINE(static bool AddToSynchronized(SlotsBufferAllocator* allocator, |
| 378 SlotsBuffer** buffer_address, |
| 379 base::Mutex* buffer_mutex, |
| 380 ObjectSlot slot, AdditionMode mode)) { |
| 381 base::LockGuard<base::Mutex> lock_guard(buffer_mutex); |
| 382 return AddTo(allocator, buffer_address, slot, mode); |
| 383 } |
| 384 |
377 INLINE(static bool AddTo(SlotsBufferAllocator* allocator, | 385 INLINE(static bool AddTo(SlotsBufferAllocator* allocator, |
378 SlotsBuffer** buffer_address, ObjectSlot slot, | 386 SlotsBuffer** buffer_address, ObjectSlot slot, |
379 AdditionMode mode)) { | 387 AdditionMode mode)) { |
380 SlotsBuffer* buffer = *buffer_address; | 388 SlotsBuffer* buffer = *buffer_address; |
381 if (buffer == NULL || buffer->IsFull()) { | 389 if (buffer == NULL || buffer->IsFull()) { |
382 if (mode == FAIL_ON_OVERFLOW && ChainLengthThresholdReached(buffer)) { | 390 if (mode == FAIL_ON_OVERFLOW && ChainLengthThresholdReached(buffer)) { |
383 allocator->DeallocateChain(buffer_address); | 391 allocator->DeallocateChain(buffer_address); |
384 return false; | 392 return false; |
385 } | 393 } |
386 buffer = allocator->AllocateBuffer(buffer); | 394 buffer = allocator->AllocateBuffer(buffer); |
387 *buffer_address = buffer; | 395 *buffer_address = buffer; |
388 } | 396 } |
389 buffer->Add(slot); | 397 buffer->Add(slot); |
390 return true; | 398 return true; |
391 } | 399 } |
392 | 400 |
393 static bool IsTypedSlot(ObjectSlot slot); | 401 static bool IsTypedSlot(ObjectSlot slot); |
394 | 402 |
| 403 static bool AddToSynchronized(SlotsBufferAllocator* allocator, |
| 404 SlotsBuffer** buffer_address, |
| 405 base::Mutex* buffer_mutex, SlotType type, |
| 406 Address addr, AdditionMode mode); |
| 407 |
395 static bool AddTo(SlotsBufferAllocator* allocator, | 408 static bool AddTo(SlotsBufferAllocator* allocator, |
396 SlotsBuffer** buffer_address, SlotType type, Address addr, | 409 SlotsBuffer** buffer_address, SlotType type, Address addr, |
397 AdditionMode mode); | 410 AdditionMode mode); |
398 | 411 |
399 // Eliminates all stale entries from the slots buffer, i.e., slots that | 412 // Eliminates all stale entries from the slots buffer, i.e., slots that |
400 // are not part of live objects anymore. This method must be called after | 413 // are not part of live objects anymore. This method must be called after |
401 // marking, when the whole transitive closure is known and must be called | 414 // marking, when the whole transitive closure is known and must be called |
402 // before sweeping when mark bits are still intact. | 415 // before sweeping when mark bits are still intact. |
403 static void RemoveInvalidSlots(Heap* heap, SlotsBuffer* buffer); | 416 static void RemoveInvalidSlots(Heap* heap, SlotsBuffer* buffer); |
404 | 417 |
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
715 | 728 |
716 // Synchronize compaction threads. | 729 // Synchronize compaction threads. |
717 base::Semaphore pending_compaction_jobs_semaphore_; | 730 base::Semaphore pending_compaction_jobs_semaphore_; |
718 | 731 |
719 bool evacuation_; | 732 bool evacuation_; |
720 | 733 |
721 SlotsBufferAllocator slots_buffer_allocator_; | 734 SlotsBufferAllocator slots_buffer_allocator_; |
722 | 735 |
723 SlotsBuffer* migration_slots_buffer_; | 736 SlotsBuffer* migration_slots_buffer_; |
724 | 737 |
| 738 base::Mutex migration_slots_buffer_mutex_; |
| 739 |
725 // Finishes GC, performs heap verification if enabled. | 740 // Finishes GC, performs heap verification if enabled. |
726 void Finish(); | 741 void Finish(); |
727 | 742 |
728 // ----------------------------------------------------------------------- | 743 // ----------------------------------------------------------------------- |
729 // Phase 1: Marking live objects. | 744 // Phase 1: Marking live objects. |
730 // | 745 // |
731 // Before: The heap has been prepared for garbage collection by | 746 // Before: The heap has been prepared for garbage collection by |
732 // MarkCompactCollector::Prepare() and is otherwise in its | 747 // MarkCompactCollector::Prepare() and is otherwise in its |
733 // normal state. | 748 // normal state. |
734 // | 749 // |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
890 | 905 |
891 // Finalizes the parallel sweeping phase. Marks all the pages that were | 906 // Finalizes the parallel sweeping phase. Marks all the pages that were |
892 // swept in parallel. | 907 // swept in parallel. |
893 void ParallelSweepSpacesComplete(); | 908 void ParallelSweepSpacesComplete(); |
894 | 909 |
895 void ParallelSweepSpaceComplete(PagedSpace* space); | 910 void ParallelSweepSpaceComplete(PagedSpace* space); |
896 | 911 |
897 // Updates store buffer and slot buffer for a pointer in a migrating object. | 912 // Updates store buffer and slot buffer for a pointer in a migrating object. |
898 void RecordMigratedSlot(Object* value, Address slot); | 913 void RecordMigratedSlot(Object* value, Address slot); |
899 | 914 |
| 915 // Adds the code entry slot to the slots buffer. |
| 916 void RecordMigratedCodeEntrySlot(Address code_entry, Address code_entry_slot); |
| 917 |
| 918 // Adds the slot of a moved code object. |
| 919 void RecordMigratedCodeObjectSlot(Address code_object); |
| 920 |
900 #ifdef DEBUG | 921 #ifdef DEBUG |
901 friend class MarkObjectVisitor; | 922 friend class MarkObjectVisitor; |
902 static void VisitObject(HeapObject* obj); | 923 static void VisitObject(HeapObject* obj); |
903 | 924 |
904 friend class UnmarkObjectVisitor; | 925 friend class UnmarkObjectVisitor; |
905 static void UnmarkObject(HeapObject* obj); | 926 static void UnmarkObject(HeapObject* obj); |
906 #endif | 927 #endif |
907 | 928 |
908 Heap* heap_; | 929 Heap* heap_; |
909 base::VirtualMemory* marking_deque_memory_; | 930 base::VirtualMemory* marking_deque_memory_; |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
975 private: | 996 private: |
976 MarkCompactCollector* collector_; | 997 MarkCompactCollector* collector_; |
977 }; | 998 }; |
978 | 999 |
979 | 1000 |
980 const char* AllocationSpaceName(AllocationSpace space); | 1001 const char* AllocationSpaceName(AllocationSpace space); |
981 } | 1002 } |
982 } // namespace v8::internal | 1003 } // namespace v8::internal |
983 | 1004 |
984 #endif // V8_HEAP_MARK_COMPACT_H_ | 1005 #endif // V8_HEAP_MARK_COMPACT_H_ |
OLD | NEW |