Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(406)

Side by Side Diff: src/heap/spaces.h

Issue 1380723002: [heap] Remove unswept bytes counter (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Simplify concatenate API and add comment Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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_HEAP_SPACES_H_ 5 #ifndef V8_HEAP_SPACES_H_
6 #define V8_HEAP_SPACES_H_ 6 #define V8_HEAP_SPACES_H_
7 7
8 #include "src/allocation.h" 8 #include "src/allocation.h"
9 #include "src/atomic-utils.h" 9 #include "src/atomic-utils.h"
10 #include "src/base/atomicops.h" 10 #include "src/base/atomicops.h"
(...skipping 1461 matching lines...) Expand 10 before | Expand all | Expand 10 after
1472 1472
1473 // Allocate from available bytes (available -> size). 1473 // Allocate from available bytes (available -> size).
1474 void AllocateBytes(intptr_t size_in_bytes) { 1474 void AllocateBytes(intptr_t size_in_bytes) {
1475 size_ += size_in_bytes; 1475 size_ += size_in_bytes;
1476 DCHECK(size_ >= 0); 1476 DCHECK(size_ >= 0);
1477 } 1477 }
1478 1478
1479 // Free allocated bytes, making them available (size -> available). 1479 // Free allocated bytes, making them available (size -> available).
1480 void DeallocateBytes(intptr_t size_in_bytes) { 1480 void DeallocateBytes(intptr_t size_in_bytes) {
1481 size_ -= size_in_bytes; 1481 size_ -= size_in_bytes;
1482 DCHECK(size_ >= 0); 1482 DCHECK_GE(size_, 0);
1483 } 1483 }
1484 1484
1485 // Merge {other} into {this}. 1485 // Merge {other} into {this}.
1486 void Merge(const AllocationStats& other) { 1486 void Merge(const AllocationStats& other) {
1487 capacity_ += other.capacity_; 1487 capacity_ += other.capacity_;
1488 size_ += other.size_; 1488 size_ += other.size_;
1489 if (other.max_capacity_ > max_capacity_) { 1489 if (other.max_capacity_ > max_capacity_) {
1490 max_capacity_ = other.max_capacity_; 1490 max_capacity_ = other.max_capacity_;
1491 } 1491 }
1492 } 1492 }
1493 1493
1494 void DecreaseCapacity(intptr_t size_in_bytes) { 1494 void DecreaseCapacity(intptr_t size_in_bytes) {
1495 capacity_ -= size_in_bytes; 1495 capacity_ -= size_in_bytes;
1496 DCHECK_GE(capacity_, 0); 1496 DCHECK_GE(capacity_, 0);
1497 DCHECK_GE(capacity_, size_);
1497 } 1498 }
1498 1499
1499 void IncreaseCapacity(intptr_t size_in_bytes) { capacity_ += size_in_bytes; } 1500 void IncreaseCapacity(intptr_t size_in_bytes) { capacity_ += size_in_bytes; }
1500 1501
1501 private: 1502 private:
1502 // |capacity_|: The number of object-area bytes (i.e., not including page 1503 // |capacity_|: The number of object-area bytes (i.e., not including page
1503 // bookkeeping structures) currently in the space. 1504 // bookkeeping structures) currently in the space.
1504 intptr_t capacity_; 1505 intptr_t capacity_;
1505 1506
1506 // |max_capacity_|: The maximum capacity ever observed. 1507 // |max_capacity_|: The maximum capacity ever observed.
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
1590 // spaces are called medium. 1591 // spaces are called medium.
1591 // 1048-16383 words: There is a list of spaces this large. It is used for top 1592 // 1048-16383 words: There is a list of spaces this large. It is used for top
1592 // and limit when the object we need to allocate is 256-2047 words in size. 1593 // and limit when the object we need to allocate is 256-2047 words in size.
1593 // These spaces are call large. 1594 // These spaces are call large.
1594 // At least 16384 words. This list is for objects of 2048 words or larger. 1595 // At least 16384 words. This list is for objects of 2048 words or larger.
1595 // Empty pages are added to this list. These spaces are called huge. 1596 // Empty pages are added to this list. These spaces are called huge.
1596 class FreeList { 1597 class FreeList {
1597 public: 1598 public:
1598 explicit FreeList(PagedSpace* owner); 1599 explicit FreeList(PagedSpace* owner);
1599 1600
1601 // The method concatenates {other} into {this} and returns the added bytes,
1602 // including waste.
1603 //
1604 // Can be used concurrently.
1600 intptr_t Concatenate(FreeList* other); 1605 intptr_t Concatenate(FreeList* other);
1601 1606
1602 // Clear the free list. 1607 // Clear the free list.
1603 void Reset(); 1608 void Reset();
1604 1609
1605 void ResetStats() { wasted_bytes_ = 0; } 1610 void ResetStats() { wasted_bytes_ = 0; }
1606 1611
1607 // Return the number of bytes available on the free list. 1612 // Return the number of bytes available on the free list.
1608 intptr_t available() { 1613 intptr_t available() {
1609 return small_list_.available() + medium_list_.available() + 1614 return small_list_.available() + medium_list_.available() +
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after
1915 static void ResetCodeStatistics(Isolate* isolate); 1920 static void ResetCodeStatistics(Isolate* isolate);
1916 #endif 1921 #endif
1917 1922
1918 // Evacuation candidates are swept by evacuator. Needs to return a valid 1923 // Evacuation candidates are swept by evacuator. Needs to return a valid
1919 // result before _and_ after evacuation has finished. 1924 // result before _and_ after evacuation has finished.
1920 static bool ShouldBeSweptBySweeperThreads(Page* p) { 1925 static bool ShouldBeSweptBySweeperThreads(Page* p) {
1921 return !p->IsEvacuationCandidate() && 1926 return !p->IsEvacuationCandidate() &&
1922 !p->IsFlagSet(Page::RESCAN_ON_EVACUATION) && !p->WasSwept(); 1927 !p->IsFlagSet(Page::RESCAN_ON_EVACUATION) && !p->WasSwept();
1923 } 1928 }
1924 1929
1925 void IncrementUnsweptFreeBytes(intptr_t by) { unswept_free_bytes_ += by; }
1926
1927 void IncreaseUnsweptFreeBytes(Page* p) {
1928 DCHECK(ShouldBeSweptBySweeperThreads(p));
1929 unswept_free_bytes_ += (p->area_size() - p->LiveBytes());
1930 }
1931
1932 void DecrementUnsweptFreeBytes(intptr_t by) { unswept_free_bytes_ -= by; }
1933
1934 void DecreaseUnsweptFreeBytes(Page* p) {
1935 DCHECK(ShouldBeSweptBySweeperThreads(p));
1936 unswept_free_bytes_ -= (p->area_size() - p->LiveBytes());
1937 }
1938
1939 void ResetUnsweptFreeBytes() { unswept_free_bytes_ = 0; }
1940
1941 // This function tries to steal size_in_bytes memory from the sweeper threads 1930 // This function tries to steal size_in_bytes memory from the sweeper threads
1942 // free-lists. If it does not succeed stealing enough memory, it will wait 1931 // free-lists. If it does not succeed stealing enough memory, it will wait
1943 // for the sweeper threads to finish sweeping. 1932 // for the sweeper threads to finish sweeping.
1944 // It returns true when sweeping is completed and false otherwise. 1933 // It returns true when sweeping is completed and false otherwise.
1945 bool EnsureSweeperProgress(intptr_t size_in_bytes); 1934 bool EnsureSweeperProgress(intptr_t size_in_bytes);
1946 1935
1947 void set_end_of_unswept_pages(Page* page) { end_of_unswept_pages_ = page; } 1936 void set_end_of_unswept_pages(Page* page) { end_of_unswept_pages_ = page; }
1948 1937
1949 Page* end_of_unswept_pages() { return end_of_unswept_pages_; } 1938 Page* end_of_unswept_pages() { return end_of_unswept_pages_; }
1950 1939
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
2013 2002
2014 // The dummy page that anchors the double linked list of pages. 2003 // The dummy page that anchors the double linked list of pages.
2015 Page anchor_; 2004 Page anchor_;
2016 2005
2017 // The space's free list. 2006 // The space's free list.
2018 FreeList free_list_; 2007 FreeList free_list_;
2019 2008
2020 // Normal allocation information. 2009 // Normal allocation information.
2021 AllocationInfo allocation_info_; 2010 AllocationInfo allocation_info_;
2022 2011
2023 // The number of free bytes which could be reclaimed by advancing the
2024 // concurrent sweeper threads.
2025 intptr_t unswept_free_bytes_;
2026
2027 // The sweeper threads iterate over the list of pointer and data space pages 2012 // The sweeper threads iterate over the list of pointer and data space pages
2028 // and sweep these pages concurrently. They will stop sweeping after the 2013 // and sweep these pages concurrently. They will stop sweeping after the
2029 // end_of_unswept_pages_ page. 2014 // end_of_unswept_pages_ page.
2030 Page* end_of_unswept_pages_; 2015 Page* end_of_unswept_pages_;
2031 2016
2032 // Mutex guarding any concurrent access to the space. 2017 // Mutex guarding any concurrent access to the space.
2033 base::Mutex space_mutex_; 2018 base::Mutex space_mutex_;
2034 2019
2035 friend class MarkCompactCollector; 2020 friend class MarkCompactCollector;
2036 friend class PageIterator; 2021 friend class PageIterator;
(...skipping 917 matching lines...) Expand 10 before | Expand all | Expand 10 after
2954 count = 0; 2939 count = 0;
2955 } 2940 }
2956 // Must be small, since an iteration is used for lookup. 2941 // Must be small, since an iteration is used for lookup.
2957 static const int kMaxComments = 64; 2942 static const int kMaxComments = 64;
2958 }; 2943 };
2959 #endif 2944 #endif
2960 } // namespace internal 2945 } // namespace internal
2961 } // namespace v8 2946 } // namespace v8
2962 2947
2963 #endif // V8_HEAP_SPACES_H_ 2948 #endif // V8_HEAP_SPACES_H_
OLDNEW
« src/heap/mark-compact.cc ('K') | « src/heap/mark-compact.cc ('k') | src/heap/spaces.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698