Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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_SPACES_H_ | 5 #ifndef V8_SPACES_H_ |
| 6 #define V8_SPACES_H_ | 6 #define V8_SPACES_H_ |
| 7 | 7 |
| 8 #include "src/allocation.h" | 8 #include "src/allocation.h" |
| 9 #include "src/hashmap.h" | 9 #include "src/hashmap.h" |
| 10 #include "src/list.h" | 10 #include "src/list.h" |
| (...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 284 } | 284 } |
| 285 | 285 |
| 286 // Only works for addresses in pointer spaces, not data or code spaces. | 286 // Only works for addresses in pointer spaces, not data or code spaces. |
| 287 static inline MemoryChunk* FromAnyPointerAddress(Heap* heap, Address addr); | 287 static inline MemoryChunk* FromAnyPointerAddress(Heap* heap, Address addr); |
| 288 | 288 |
| 289 Address address() { return reinterpret_cast<Address>(this); } | 289 Address address() { return reinterpret_cast<Address>(this); } |
| 290 | 290 |
| 291 bool is_valid() { return address() != NULL; } | 291 bool is_valid() { return address() != NULL; } |
| 292 | 292 |
| 293 MemoryChunk* next_chunk() const { | 293 MemoryChunk* next_chunk() const { |
| 294 return reinterpret_cast<MemoryChunk*>(Acquire_Load(&next_chunk_)); | 294 return reinterpret_cast<MemoryChunk*>(base::Acquire_Load(&next_chunk_)); |
|
Jakob Kummerow
2014/06/05 11:49:06
IWYU?
| |
| 295 } | 295 } |
| 296 | 296 |
| 297 MemoryChunk* prev_chunk() const { | 297 MemoryChunk* prev_chunk() const { |
| 298 return reinterpret_cast<MemoryChunk*>(Acquire_Load(&prev_chunk_)); | 298 return reinterpret_cast<MemoryChunk*>(base::Acquire_Load(&prev_chunk_)); |
| 299 } | 299 } |
| 300 | 300 |
| 301 void set_next_chunk(MemoryChunk* next) { | 301 void set_next_chunk(MemoryChunk* next) { |
| 302 Release_Store(&next_chunk_, reinterpret_cast<AtomicWord>(next)); | 302 base::Release_Store(&next_chunk_, reinterpret_cast<base::AtomicWord>(next)); |
| 303 } | 303 } |
| 304 | 304 |
| 305 void set_prev_chunk(MemoryChunk* prev) { | 305 void set_prev_chunk(MemoryChunk* prev) { |
| 306 Release_Store(&prev_chunk_, reinterpret_cast<AtomicWord>(prev)); | 306 base::Release_Store(&prev_chunk_, reinterpret_cast<base::AtomicWord>(prev)); |
| 307 } | 307 } |
| 308 | 308 |
| 309 Space* owner() const { | 309 Space* owner() const { |
| 310 if ((reinterpret_cast<intptr_t>(owner_) & kFailureTagMask) == | 310 if ((reinterpret_cast<intptr_t>(owner_) & kFailureTagMask) == |
| 311 kFailureTag) { | 311 kFailureTag) { |
| 312 return reinterpret_cast<Space*>(reinterpret_cast<intptr_t>(owner_) - | 312 return reinterpret_cast<Space*>(reinterpret_cast<intptr_t>(owner_) - |
| 313 kFailureTag); | 313 kFailureTag); |
| 314 } else { | 314 } else { |
| 315 return NULL; | 315 return NULL; |
| 316 } | 316 } |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 454 // PARALLEL_SWEEPING_PENDING - This page is ready for parallel sweeping. | 454 // PARALLEL_SWEEPING_PENDING - This page is ready for parallel sweeping. |
| 455 enum ParallelSweepingState { | 455 enum ParallelSweepingState { |
| 456 PARALLEL_SWEEPING_DONE, | 456 PARALLEL_SWEEPING_DONE, |
| 457 PARALLEL_SWEEPING_FINALIZE, | 457 PARALLEL_SWEEPING_FINALIZE, |
| 458 PARALLEL_SWEEPING_IN_PROGRESS, | 458 PARALLEL_SWEEPING_IN_PROGRESS, |
| 459 PARALLEL_SWEEPING_PENDING | 459 PARALLEL_SWEEPING_PENDING |
| 460 }; | 460 }; |
| 461 | 461 |
| 462 ParallelSweepingState parallel_sweeping() { | 462 ParallelSweepingState parallel_sweeping() { |
| 463 return static_cast<ParallelSweepingState>( | 463 return static_cast<ParallelSweepingState>( |
| 464 Acquire_Load(¶llel_sweeping_)); | 464 base::Acquire_Load(¶llel_sweeping_)); |
| 465 } | 465 } |
| 466 | 466 |
| 467 void set_parallel_sweeping(ParallelSweepingState state) { | 467 void set_parallel_sweeping(ParallelSweepingState state) { |
| 468 Release_Store(¶llel_sweeping_, state); | 468 base::Release_Store(¶llel_sweeping_, state); |
| 469 } | 469 } |
| 470 | 470 |
| 471 bool TryParallelSweeping() { | 471 bool TryParallelSweeping() { |
| 472 return Acquire_CompareAndSwap(¶llel_sweeping_, | 472 return base::Acquire_CompareAndSwap( |
| 473 PARALLEL_SWEEPING_PENDING, | 473 ¶llel_sweeping_, PARALLEL_SWEEPING_PENDING, |
| 474 PARALLEL_SWEEPING_IN_PROGRESS) == | 474 PARALLEL_SWEEPING_IN_PROGRESS) == PARALLEL_SWEEPING_PENDING; |
| 475 PARALLEL_SWEEPING_PENDING; | |
| 476 } | 475 } |
| 477 | 476 |
| 478 // Manage live byte count (count of bytes known to be live, | 477 // Manage live byte count (count of bytes known to be live, |
| 479 // because they are marked black). | 478 // because they are marked black). |
| 480 void ResetLiveBytes() { | 479 void ResetLiveBytes() { |
| 481 if (FLAG_gc_verbose) { | 480 if (FLAG_gc_verbose) { |
| 482 PrintF("ResetLiveBytes:%p:%x->0\n", | 481 PrintF("ResetLiveBytes:%p:%x->0\n", |
| 483 static_cast<void*>(this), live_byte_count_); | 482 static_cast<void*>(this), live_byte_count_); |
| 484 } | 483 } |
| 485 live_byte_count_ = 0; | 484 live_byte_count_ = 0; |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 700 SlotsBuffer* slots_buffer_; | 699 SlotsBuffer* slots_buffer_; |
| 701 SkipList* skip_list_; | 700 SkipList* skip_list_; |
| 702 intptr_t write_barrier_counter_; | 701 intptr_t write_barrier_counter_; |
| 703 // Used by the incremental marker to keep track of the scanning progress in | 702 // Used by the incremental marker to keep track of the scanning progress in |
| 704 // large objects that have a progress bar and are scanned in increments. | 703 // large objects that have a progress bar and are scanned in increments. |
| 705 int progress_bar_; | 704 int progress_bar_; |
| 706 // Assuming the initial allocation on a page is sequential, | 705 // Assuming the initial allocation on a page is sequential, |
| 707 // count highest number of bytes ever allocated on the page. | 706 // count highest number of bytes ever allocated on the page. |
| 708 int high_water_mark_; | 707 int high_water_mark_; |
| 709 | 708 |
| 710 AtomicWord parallel_sweeping_; | 709 base::AtomicWord parallel_sweeping_; |
| 711 | 710 |
| 712 // PagedSpace free-list statistics. | 711 // PagedSpace free-list statistics. |
| 713 intptr_t available_in_small_free_list_; | 712 intptr_t available_in_small_free_list_; |
| 714 intptr_t available_in_medium_free_list_; | 713 intptr_t available_in_medium_free_list_; |
| 715 intptr_t available_in_large_free_list_; | 714 intptr_t available_in_large_free_list_; |
| 716 intptr_t available_in_huge_free_list_; | 715 intptr_t available_in_huge_free_list_; |
| 717 intptr_t non_available_small_blocks_; | 716 intptr_t non_available_small_blocks_; |
| 718 | 717 |
| 719 static MemoryChunk* Initialize(Heap* heap, | 718 static MemoryChunk* Initialize(Heap* heap, |
| 720 Address base, | 719 Address base, |
| 721 size_t size, | 720 size_t size, |
| 722 Address area_start, | 721 Address area_start, |
| 723 Address area_end, | 722 Address area_end, |
| 724 Executability executable, | 723 Executability executable, |
| 725 Space* owner); | 724 Space* owner); |
| 726 | 725 |
| 727 private: | 726 private: |
| 728 // next_chunk_ holds a pointer of type MemoryChunk | 727 // next_chunk_ holds a pointer of type MemoryChunk |
| 729 AtomicWord next_chunk_; | 728 base::AtomicWord next_chunk_; |
| 730 // prev_chunk_ holds a pointer of type MemoryChunk | 729 // prev_chunk_ holds a pointer of type MemoryChunk |
| 731 AtomicWord prev_chunk_; | 730 base::AtomicWord prev_chunk_; |
| 732 | 731 |
| 733 friend class MemoryAllocator; | 732 friend class MemoryAllocator; |
| 734 }; | 733 }; |
| 735 | 734 |
| 736 | 735 |
| 737 STATIC_ASSERT(sizeof(MemoryChunk) <= MemoryChunk::kHeaderSize); | 736 STATIC_ASSERT(sizeof(MemoryChunk) <= MemoryChunk::kHeaderSize); |
| 738 | 737 |
| 739 | 738 |
| 740 // ----------------------------------------------------------------------------- | 739 // ----------------------------------------------------------------------------- |
| 741 // A page is a memory chunk of a size 1MB. Large object pages may be larger. | 740 // A page is a memory chunk of a size 1MB. Large object pages may be larger. |
| (...skipping 783 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1525 | 1524 |
| 1526 FreeListNode* PickNodeFromList(int *node_size); | 1525 FreeListNode* PickNodeFromList(int *node_size); |
| 1527 FreeListNode* PickNodeFromList(int size_in_bytes, int *node_size); | 1526 FreeListNode* PickNodeFromList(int size_in_bytes, int *node_size); |
| 1528 | 1527 |
| 1529 intptr_t EvictFreeListItemsInList(Page* p); | 1528 intptr_t EvictFreeListItemsInList(Page* p); |
| 1530 bool ContainsPageFreeListItemsInList(Page* p); | 1529 bool ContainsPageFreeListItemsInList(Page* p); |
| 1531 | 1530 |
| 1532 void RepairFreeList(Heap* heap); | 1531 void RepairFreeList(Heap* heap); |
| 1533 | 1532 |
| 1534 FreeListNode* top() const { | 1533 FreeListNode* top() const { |
| 1535 return reinterpret_cast<FreeListNode*>(NoBarrier_Load(&top_)); | 1534 return reinterpret_cast<FreeListNode*>(base::NoBarrier_Load(&top_)); |
| 1536 } | 1535 } |
| 1537 | 1536 |
| 1538 void set_top(FreeListNode* top) { | 1537 void set_top(FreeListNode* top) { |
| 1539 NoBarrier_Store(&top_, reinterpret_cast<AtomicWord>(top)); | 1538 base::NoBarrier_Store(&top_, reinterpret_cast<base::AtomicWord>(top)); |
| 1540 } | 1539 } |
| 1541 | 1540 |
| 1542 FreeListNode** GetEndAddress() { return &end_; } | 1541 FreeListNode** GetEndAddress() { return &end_; } |
| 1543 FreeListNode* end() const { return end_; } | 1542 FreeListNode* end() const { return end_; } |
| 1544 void set_end(FreeListNode* end) { end_ = end; } | 1543 void set_end(FreeListNode* end) { end_ = end; } |
| 1545 | 1544 |
| 1546 int* GetAvailableAddress() { return &available_; } | 1545 int* GetAvailableAddress() { return &available_; } |
| 1547 int available() const { return available_; } | 1546 int available() const { return available_; } |
| 1548 void set_available(int available) { available_ = available; } | 1547 void set_available(int available) { available_ = available; } |
| 1549 | 1548 |
| 1550 Mutex* mutex() { return &mutex_; } | 1549 Mutex* mutex() { return &mutex_; } |
| 1551 | 1550 |
| 1552 bool IsEmpty() { | 1551 bool IsEmpty() { |
| 1553 return top() == 0; | 1552 return top() == 0; |
| 1554 } | 1553 } |
| 1555 | 1554 |
| 1556 #ifdef DEBUG | 1555 #ifdef DEBUG |
| 1557 intptr_t SumFreeList(); | 1556 intptr_t SumFreeList(); |
| 1558 int FreeListLength(); | 1557 int FreeListLength(); |
| 1559 #endif | 1558 #endif |
| 1560 | 1559 |
| 1561 private: | 1560 private: |
| 1562 // top_ points to the top FreeListNode* in the free list category. | 1561 // top_ points to the top FreeListNode* in the free list category. |
| 1563 AtomicWord top_; | 1562 base::AtomicWord top_; |
| 1564 FreeListNode* end_; | 1563 FreeListNode* end_; |
| 1565 Mutex mutex_; | 1564 Mutex mutex_; |
| 1566 | 1565 |
| 1567 // Total available bytes in all blocks of this free list category. | 1566 // Total available bytes in all blocks of this free list category. |
| 1568 int available_; | 1567 int available_; |
| 1569 }; | 1568 }; |
| 1570 | 1569 |
| 1571 | 1570 |
| 1572 // The free list for the old space. The free list is organized in such a way | 1571 // The free list for the old space. The free list is organized in such a way |
| 1573 // as to encourage objects allocated around the same time to be near each | 1572 // as to encourage objects allocated around the same time to be near each |
| (...skipping 1426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3000 } | 2999 } |
| 3001 // Must be small, since an iteration is used for lookup. | 3000 // Must be small, since an iteration is used for lookup. |
| 3002 static const int kMaxComments = 64; | 3001 static const int kMaxComments = 64; |
| 3003 }; | 3002 }; |
| 3004 #endif | 3003 #endif |
| 3005 | 3004 |
| 3006 | 3005 |
| 3007 } } // namespace v8::internal | 3006 } } // namespace v8::internal |
| 3008 | 3007 |
| 3009 #endif // V8_SPACES_H_ | 3008 #endif // V8_SPACES_H_ |
| OLD | NEW |