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 <deque> |
| 9 |
8 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
9 #include "src/heap/spaces.h" | 11 #include "src/heap/spaces.h" |
10 #include "src/heap/store-buffer.h" | 12 #include "src/heap/store-buffer.h" |
11 | 13 |
12 namespace v8 { | 14 namespace v8 { |
13 namespace internal { | 15 namespace internal { |
14 | 16 |
15 // Callback function, returns whether an object is alive. The heap size | 17 // Callback function, returns whether an object is alive. The heap size |
16 // of the object is returned in size. It optionally updates the offset | 18 // of the object is returned in size. It optionally updates the offset |
17 // to the first live object in the page (only used for old and map objects). | 19 // to the first live object in the page (only used for old and map objects). |
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
402 | 404 |
403 class Sweeper { | 405 class Sweeper { |
404 public: | 406 public: |
405 class SweeperTask; | 407 class SweeperTask; |
406 | 408 |
407 enum SweepingMode { SWEEP_ONLY, SWEEP_AND_VISIT_LIVE_OBJECTS }; | 409 enum SweepingMode { SWEEP_ONLY, SWEEP_AND_VISIT_LIVE_OBJECTS }; |
408 enum SkipListRebuildingMode { REBUILD_SKIP_LIST, IGNORE_SKIP_LIST }; | 410 enum SkipListRebuildingMode { REBUILD_SKIP_LIST, IGNORE_SKIP_LIST }; |
409 enum FreeSpaceTreatmentMode { IGNORE_FREE_SPACE, ZAP_FREE_SPACE }; | 411 enum FreeSpaceTreatmentMode { IGNORE_FREE_SPACE, ZAP_FREE_SPACE }; |
410 enum SweepingParallelism { SWEEP_ON_MAIN_THREAD, SWEEP_IN_PARALLEL }; | 412 enum SweepingParallelism { SWEEP_ON_MAIN_THREAD, SWEEP_IN_PARALLEL }; |
411 | 413 |
412 typedef std::vector<Page*> SweepingList; | 414 typedef std::deque<Page*> SweepingList; |
413 typedef List<Page*> SweptList; | 415 typedef List<Page*> SweptList; |
414 | 416 |
415 template <SweepingMode sweeping_mode, SweepingParallelism parallelism, | 417 template <SweepingMode sweeping_mode, SweepingParallelism parallelism, |
416 SkipListRebuildingMode skip_list_mode, | 418 SkipListRebuildingMode skip_list_mode, |
417 FreeSpaceTreatmentMode free_space_mode> | 419 FreeSpaceTreatmentMode free_space_mode> |
418 static int RawSweep(PagedSpace* space, Page* p, ObjectVisitor* v); | 420 static int RawSweep(PagedSpace* space, Page* p, ObjectVisitor* v); |
419 | 421 |
420 explicit Sweeper(Heap* heap) | 422 explicit Sweeper(Heap* heap) |
421 : heap_(heap), | 423 : heap_(heap), |
422 pending_sweeper_tasks_semaphore_(0), | 424 pending_sweeper_tasks_semaphore_(0), |
423 sweeping_in_progress_(false), | 425 sweeping_in_progress_(false), |
424 num_sweeping_tasks_(0) { | 426 late_pages_(false), |
425 ForAllSweepingSpaces([this](AllocationSpace space) { | 427 num_sweeping_tasks_(0) {} |
426 late_sweeping_list_[space] = nullptr; | |
427 tmp_late_sweeping_list_[space] = nullptr; | |
428 }); | |
429 } | |
430 | 428 |
431 bool sweeping_in_progress() { return sweeping_in_progress_; } | 429 bool sweeping_in_progress() { return sweeping_in_progress_; } |
| 430 bool contains_late_pages() { return late_pages_; } |
432 | 431 |
433 void AddPage(AllocationSpace space, Page* page); | 432 void AddPage(AllocationSpace space, Page* page); |
434 void AddLatePage(AllocationSpace space, Page* page); | 433 void AddLatePage(AllocationSpace space, Page* page); |
435 void CommitLateList(AllocationSpace space); | |
436 | 434 |
437 int ParallelSweepSpace(AllocationSpace identity, int required_freed_bytes, | 435 int ParallelSweepSpace(AllocationSpace identity, int required_freed_bytes, |
438 int max_pages = 0); | 436 int max_pages = 0); |
439 int ParallelSweepPage(Page* page, PagedSpace* space); | 437 int ParallelSweepPage(Page* page, PagedSpace* space); |
440 | 438 |
441 void StartSweeping(); | 439 void StartSweeping(); |
442 void StartSweepingHelper(AllocationSpace space_to_start); | 440 void StartSweepingHelper(AllocationSpace space_to_start); |
443 void EnsureCompleted(); | 441 void EnsureCompleted(); |
444 bool IsSweepingCompleted(); | 442 bool IsSweepingCompleted(); |
445 void SweepOrWaitUntilSweepingCompleted(Page* page); | 443 void SweepOrWaitUntilSweepingCompleted(Page* page); |
446 | 444 |
447 void AddSweptPageSafe(PagedSpace* space, Page* page); | 445 void AddSweptPageSafe(PagedSpace* space, Page* page); |
448 Page* GetSweptPageSafe(PagedSpace* space); | 446 Page* GetSweptPageSafe(PagedSpace* space); |
449 | 447 |
450 private: | 448 private: |
451 static const int kAllocationSpaces = LAST_PAGED_SPACE + 1; | 449 static const int kAllocationSpaces = LAST_PAGED_SPACE + 1; |
452 | 450 |
453 template <typename Callback> | 451 template <typename Callback> |
454 void ForAllSweepingSpaces(Callback callback) { | 452 void ForAllSweepingSpaces(Callback callback) { |
455 for (int i = 0; i < kAllocationSpaces; i++) { | 453 for (int i = 0; i < kAllocationSpaces; i++) { |
456 callback(static_cast<AllocationSpace>(i)); | 454 callback(static_cast<AllocationSpace>(i)); |
457 } | 455 } |
458 } | 456 } |
459 | 457 |
460 SweepingList* GetLateSweepingListSafe(AllocationSpace space); | 458 Page* GetSweepingPageSafe(AllocationSpace space); |
| 459 void AddSweepingPageSafe(AllocationSpace space, Page* page); |
461 | 460 |
462 void PrepareToBeSweptPage(AllocationSpace space, Page* page); | 461 void PrepareToBeSweptPage(AllocationSpace space, Page* page); |
463 void ParallelSweepList(SweepingList& list, AllocationSpace out_space, | |
464 int required_freed_bytes, int max_pages, | |
465 int* max_freed, int* pages_freed); | |
466 | 462 |
467 Heap* heap_; | 463 Heap* heap_; |
468 base::Mutex mutex_; | 464 base::Mutex mutex_; |
469 base::Semaphore pending_sweeper_tasks_semaphore_; | 465 base::Semaphore pending_sweeper_tasks_semaphore_; |
470 SweptList swept_list_[kAllocationSpaces]; | 466 SweptList swept_list_[kAllocationSpaces]; |
471 SweepingList sweeping_list_[kAllocationSpaces]; | 467 SweepingList sweeping_list_[kAllocationSpaces]; |
472 SweepingList* late_sweeping_list_[kAllocationSpaces]; | |
473 SweepingList* tmp_late_sweeping_list_[kAllocationSpaces]; | |
474 bool sweeping_in_progress_; | 468 bool sweeping_in_progress_; |
| 469 bool late_pages_; |
475 int num_sweeping_tasks_; | 470 int num_sweeping_tasks_; |
476 }; | 471 }; |
477 | 472 |
478 enum IterationMode { | 473 enum IterationMode { |
479 kKeepMarking, | 474 kKeepMarking, |
480 kClearMarkbits, | 475 kClearMarkbits, |
481 }; | 476 }; |
482 | 477 |
483 static void Initialize(); | 478 static void Initialize(); |
484 | 479 |
(...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
898 private: | 893 private: |
899 MarkCompactCollector* collector_; | 894 MarkCompactCollector* collector_; |
900 }; | 895 }; |
901 | 896 |
902 | 897 |
903 const char* AllocationSpaceName(AllocationSpace space); | 898 const char* AllocationSpaceName(AllocationSpace space); |
904 } // namespace internal | 899 } // namespace internal |
905 } // namespace v8 | 900 } // namespace v8 |
906 | 901 |
907 #endif // V8_HEAP_MARK_COMPACT_H_ | 902 #endif // V8_HEAP_MARK_COMPACT_H_ |
OLD | NEW |