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 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
318 void Add(ObjectSlot slot) { | 318 void Add(ObjectSlot slot) { |
319 DCHECK(0 <= idx_ && idx_ < kNumberOfElements); | 319 DCHECK(0 <= idx_ && idx_ < kNumberOfElements); |
320 #ifdef DEBUG | 320 #ifdef DEBUG |
321 if (slot >= reinterpret_cast<ObjectSlot>(NUMBER_OF_SLOT_TYPES)) { | 321 if (slot >= reinterpret_cast<ObjectSlot>(NUMBER_OF_SLOT_TYPES)) { |
322 DCHECK_NOT_NULL(*slot); | 322 DCHECK_NOT_NULL(*slot); |
323 } | 323 } |
324 #endif | 324 #endif |
325 slots_[idx_++] = slot; | 325 slots_[idx_++] = slot; |
326 } | 326 } |
327 | 327 |
| 328 // Should be used for testing only. |
| 329 ObjectSlot Get(intptr_t i) { |
| 330 DCHECK(i >= 0 && i < kNumberOfElements); |
| 331 return slots_[i]; |
| 332 } |
| 333 |
328 enum SlotType { | 334 enum SlotType { |
329 EMBEDDED_OBJECT_SLOT, | 335 EMBEDDED_OBJECT_SLOT, |
330 OBJECT_SLOT, | 336 OBJECT_SLOT, |
331 RELOCATED_CODE_OBJECT, | 337 RELOCATED_CODE_OBJECT, |
332 CELL_TARGET_SLOT, | 338 CELL_TARGET_SLOT, |
333 CODE_TARGET_SLOT, | 339 CODE_TARGET_SLOT, |
334 CODE_ENTRY_SLOT, | 340 CODE_ENTRY_SLOT, |
335 DEBUG_TARGET_SLOT, | 341 DEBUG_TARGET_SLOT, |
336 NUMBER_OF_SLOT_TYPES | 342 NUMBER_OF_SLOT_TYPES |
337 }; | 343 }; |
(...skipping 29 matching lines...) Expand all Loading... |
367 static int SizeOfChain(SlotsBuffer* buffer) { | 373 static int SizeOfChain(SlotsBuffer* buffer) { |
368 if (buffer == NULL) return 0; | 374 if (buffer == NULL) return 0; |
369 return static_cast<int>(buffer->idx_ + | 375 return static_cast<int>(buffer->idx_ + |
370 (buffer->chain_length_ - 1) * kNumberOfElements); | 376 (buffer->chain_length_ - 1) * kNumberOfElements); |
371 } | 377 } |
372 | 378 |
373 inline bool IsFull() { return idx_ == kNumberOfElements; } | 379 inline bool IsFull() { return idx_ == kNumberOfElements; } |
374 | 380 |
375 inline bool HasSpaceForTypedSlot() { return idx_ < kNumberOfElements - 1; } | 381 inline bool HasSpaceForTypedSlot() { return idx_ < kNumberOfElements - 1; } |
376 | 382 |
377 static void UpdateSlotsRecordedIn(Heap* heap, SlotsBuffer* buffer, | 383 static void UpdateSlotsRecordedIn(Heap* heap, SlotsBuffer* buffer) { |
378 bool code_slots_filtering_required) { | |
379 while (buffer != NULL) { | 384 while (buffer != NULL) { |
380 if (code_slots_filtering_required) { | |
381 buffer->UpdateSlotsWithFilter(heap); | |
382 } else { | |
383 buffer->UpdateSlots(heap); | 385 buffer->UpdateSlots(heap); |
384 } | |
385 buffer = buffer->next(); | 386 buffer = buffer->next(); |
386 } | 387 } |
387 } | 388 } |
388 | 389 |
389 enum AdditionMode { FAIL_ON_OVERFLOW, IGNORE_OVERFLOW }; | 390 enum AdditionMode { FAIL_ON_OVERFLOW, IGNORE_OVERFLOW }; |
390 | 391 |
391 static bool ChainLengthThresholdReached(SlotsBuffer* buffer) { | 392 static bool ChainLengthThresholdReached(SlotsBuffer* buffer) { |
392 return buffer != NULL && buffer->chain_length_ >= kChainLengthThreshold; | 393 return buffer != NULL && buffer->chain_length_ >= kChainLengthThreshold; |
393 } | 394 } |
394 | 395 |
(...skipping 18 matching lines...) Expand all Loading... |
413 static bool AddTo(SlotsBufferAllocator* allocator, | 414 static bool AddTo(SlotsBufferAllocator* allocator, |
414 SlotsBuffer** buffer_address, SlotType type, Address addr, | 415 SlotsBuffer** buffer_address, SlotType type, Address addr, |
415 AdditionMode mode); | 416 AdditionMode mode); |
416 | 417 |
417 // Eliminates all stale entries from the slots buffer, i.e., slots that | 418 // Eliminates all stale entries from the slots buffer, i.e., slots that |
418 // are not part of live objects anymore. This method must be called after | 419 // are not part of live objects anymore. This method must be called after |
419 // marking, when the whole transitive closure is known and must be called | 420 // marking, when the whole transitive closure is known and must be called |
420 // before sweeping when mark bits are still intact. | 421 // before sweeping when mark bits are still intact. |
421 static void RemoveInvalidSlots(Heap* heap, SlotsBuffer* buffer); | 422 static void RemoveInvalidSlots(Heap* heap, SlotsBuffer* buffer); |
422 | 423 |
| 424 // Eliminate all slots that are within the given address range. |
| 425 static void RemoveObjectSlots(Heap* heap, SlotsBuffer* buffer, |
| 426 Address start_slot, Address end_slot); |
| 427 |
423 // Ensures that there are no invalid slots in the chain of slots buffers. | 428 // Ensures that there are no invalid slots in the chain of slots buffers. |
424 static void VerifySlots(Heap* heap, SlotsBuffer* buffer); | 429 static void VerifySlots(Heap* heap, SlotsBuffer* buffer); |
425 | 430 |
426 static const int kNumberOfElements = 1021; | 431 static const int kNumberOfElements = 1021; |
427 | 432 |
428 private: | 433 private: |
429 static const int kChainLengthThreshold = 15; | 434 static const int kChainLengthThreshold = 15; |
430 | 435 |
431 intptr_t idx_; | 436 intptr_t idx_; |
432 intptr_t chain_length_; | 437 intptr_t chain_length_; |
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
734 void InitializeMarkingDeque(); | 739 void InitializeMarkingDeque(); |
735 | 740 |
736 // The following four methods can just be called after marking, when the | 741 // The following four methods can just be called after marking, when the |
737 // whole transitive closure is known. They must be called before sweeping | 742 // whole transitive closure is known. They must be called before sweeping |
738 // when mark bits are still intact. | 743 // when mark bits are still intact. |
739 bool IsSlotInBlackObject(Page* p, Address slot, HeapObject** out_object); | 744 bool IsSlotInBlackObject(Page* p, Address slot, HeapObject** out_object); |
740 bool IsSlotInBlackObjectSlow(Page* p, Address slot); | 745 bool IsSlotInBlackObjectSlow(Page* p, Address slot); |
741 bool IsSlotInLiveObject(Address slot); | 746 bool IsSlotInLiveObject(Address slot); |
742 void VerifyIsSlotInLiveObject(Address slot, HeapObject* object); | 747 void VerifyIsSlotInLiveObject(Address slot, HeapObject* object); |
743 | 748 |
| 749 // Removes all the slots in the slot buffers that are within the given |
| 750 // address range. |
| 751 void RemoveObjectSlots(Address start_slot, Address end_slot); |
| 752 |
744 private: | 753 private: |
745 class SweeperTask; | 754 class SweeperTask; |
746 | 755 |
747 explicit MarkCompactCollector(Heap* heap); | 756 explicit MarkCompactCollector(Heap* heap); |
748 ~MarkCompactCollector(); | 757 ~MarkCompactCollector(); |
749 | 758 |
750 bool MarkInvalidatedCode(); | 759 void RemoveDeoptimizedCodeSlots(); |
751 bool WillBeDeoptimized(Code* code); | 760 bool WillBeDeoptimized(Code* code); |
752 void RemoveDeadInvalidatedCode(); | 761 void RemoveDeadInvalidatedCode(); |
753 void ProcessInvalidatedCode(ObjectVisitor* visitor); | 762 void ProcessInvalidatedCode(ObjectVisitor* visitor); |
754 void EvictPopularEvacuationCandidate(Page* page); | 763 void EvictPopularEvacuationCandidate(Page* page); |
755 void ClearInvalidSlotsBufferEntries(PagedSpace* space); | 764 void ClearInvalidSlotsBufferEntries(PagedSpace* space); |
756 void ClearInvalidStoreAndSlotsBufferEntries(); | 765 void ClearInvalidStoreAndSlotsBufferEntries(); |
757 | 766 |
758 void StartSweeperThreads(); | 767 void StartSweeperThreads(); |
759 | 768 |
760 #ifdef DEBUG | 769 #ifdef DEBUG |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1028 private: | 1037 private: |
1029 MarkCompactCollector* collector_; | 1038 MarkCompactCollector* collector_; |
1030 }; | 1039 }; |
1031 | 1040 |
1032 | 1041 |
1033 const char* AllocationSpaceName(AllocationSpace space); | 1042 const char* AllocationSpaceName(AllocationSpace space); |
1034 } | 1043 } |
1035 } // namespace v8::internal | 1044 } // namespace v8::internal |
1036 | 1045 |
1037 #endif // V8_HEAP_MARK_COMPACT_H_ | 1046 #endif // V8_HEAP_MARK_COMPACT_H_ |
OLD | NEW |