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

Side by Side Diff: src/spaces.h

Issue 254603002: Remove lazy sweeping. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 8 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 | Annotate | Revision Log
« no previous file with comments | « src/mark-compact.cc ('k') | src/spaces.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 1765 matching lines...) Expand 10 before | Expand all | Expand 10 after
1776 accounting_stats_.DeallocateBytes(bytes); 1776 accounting_stats_.DeallocateBytes(bytes);
1777 } 1777 }
1778 1778
1779 // Available bytes without growing. These are the bytes on the free list. 1779 // Available bytes without growing. These are the bytes on the free list.
1780 // The bytes in the linear allocation area are not included in this total 1780 // The bytes in the linear allocation area are not included in this total
1781 // because updating the stats would slow down allocation. New pages are 1781 // because updating the stats would slow down allocation. New pages are
1782 // immediately added to the free list so they show up here. 1782 // immediately added to the free list so they show up here.
1783 intptr_t Available() { return free_list_.available(); } 1783 intptr_t Available() { return free_list_.available(); }
1784 1784
1785 // Allocated bytes in this space. Garbage bytes that were not found due to 1785 // Allocated bytes in this space. Garbage bytes that were not found due to
1786 // lazy sweeping are counted as being allocated! The bytes in the current 1786 // concurrent sweeping are counted as being allocated! The bytes in the
1787 // linear allocation area (between top and limit) are also counted here. 1787 // current linear allocation area (between top and limit) are also counted
1788 // here.
1788 virtual intptr_t Size() { return accounting_stats_.Size(); } 1789 virtual intptr_t Size() { return accounting_stats_.Size(); }
1789 1790
1790 // As size, but the bytes in lazily swept pages are estimated and the bytes 1791 // As size, but the bytes in lazily swept pages are estimated and the bytes
1791 // in the current linear allocation area are not included. 1792 // in the current linear allocation area are not included.
1792 virtual intptr_t SizeOfObjects(); 1793 virtual intptr_t SizeOfObjects();
1793 1794
1794 // Wasted bytes in this space. These are just the bytes that were thrown away 1795 // Wasted bytes in this space. These are just the bytes that were thrown away
1795 // due to being too small to use for allocation. They do not include the 1796 // due to being too small to use for allocation. They do not include the
1796 // free bytes that were not found at all due to lazy sweeping. 1797 // free bytes that were not found at all due to lazy sweeping.
1797 virtual intptr_t Waste() { return accounting_stats_.Waste(); } 1798 virtual intptr_t Waste() { return accounting_stats_.Waste(); }
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
1878 void CollectCodeStatistics(); 1879 void CollectCodeStatistics();
1879 static void ReportCodeStatistics(Isolate* isolate); 1880 static void ReportCodeStatistics(Isolate* isolate);
1880 static void ResetCodeStatistics(Isolate* isolate); 1881 static void ResetCodeStatistics(Isolate* isolate);
1881 #endif 1882 #endif
1882 1883
1883 bool was_swept_conservatively() { return was_swept_conservatively_; } 1884 bool was_swept_conservatively() { return was_swept_conservatively_; }
1884 void set_was_swept_conservatively(bool b) { was_swept_conservatively_ = b; } 1885 void set_was_swept_conservatively(bool b) { was_swept_conservatively_ = b; }
1885 1886
1886 // Evacuation candidates are swept by evacuator. Needs to return a valid 1887 // Evacuation candidates are swept by evacuator. Needs to return a valid
1887 // result before _and_ after evacuation has finished. 1888 // result before _and_ after evacuation has finished.
1888 static bool ShouldBeSweptLazily(Page* p) { 1889 static bool ShouldBeSweptBySweeperThreads(Page* p) {
1889 return !p->IsEvacuationCandidate() && 1890 return !p->IsEvacuationCandidate() &&
1890 !p->IsFlagSet(Page::RESCAN_ON_EVACUATION) && 1891 !p->IsFlagSet(Page::RESCAN_ON_EVACUATION) &&
1891 !p->WasSweptPrecisely(); 1892 !p->WasSweptPrecisely();
1892 } 1893 }
1893 1894
1894 void SetPagesToSweep(Page* first) {
1895 ASSERT(unswept_free_bytes_ == 0);
1896 if (first == &anchor_) first = NULL;
1897 first_unswept_page_ = first;
1898 }
1899
1900 void IncrementUnsweptFreeBytes(intptr_t by) { 1895 void IncrementUnsweptFreeBytes(intptr_t by) {
1901 unswept_free_bytes_ += by; 1896 unswept_free_bytes_ += by;
1902 } 1897 }
1903 1898
1904 void IncreaseUnsweptFreeBytes(Page* p) { 1899 void IncreaseUnsweptFreeBytes(Page* p) {
1905 ASSERT(ShouldBeSweptLazily(p)); 1900 ASSERT(ShouldBeSweptBySweeperThreads(p));
1906 unswept_free_bytes_ += (p->area_size() - p->LiveBytes()); 1901 unswept_free_bytes_ += (p->area_size() - p->LiveBytes());
1907 } 1902 }
1908 1903
1909 void DecrementUnsweptFreeBytes(intptr_t by) { 1904 void DecrementUnsweptFreeBytes(intptr_t by) {
1910 unswept_free_bytes_ -= by; 1905 unswept_free_bytes_ -= by;
1911 } 1906 }
1912 1907
1913 void DecreaseUnsweptFreeBytes(Page* p) { 1908 void DecreaseUnsweptFreeBytes(Page* p) {
1914 ASSERT(ShouldBeSweptLazily(p)); 1909 ASSERT(ShouldBeSweptBySweeperThreads(p));
1915 unswept_free_bytes_ -= (p->area_size() - p->LiveBytes()); 1910 unswept_free_bytes_ -= (p->area_size() - p->LiveBytes());
1916 } 1911 }
1917 1912
1918 void ResetUnsweptFreeBytes() { 1913 void ResetUnsweptFreeBytes() {
1919 unswept_free_bytes_ = 0; 1914 unswept_free_bytes_ = 0;
1920 } 1915 }
1921 1916
1922 bool AdvanceSweeper(intptr_t bytes_to_sweep); 1917 // This function tries to steal size_in_bytes memory from the sweeper threads
1923 1918 // free-lists. If it does not succeed stealing enough memory, it will wait
1924 // When parallel sweeper threads are active and the main thread finished 1919 // for the sweeper threads to finish sweeping.
1925 // its sweeping phase, this function waits for them to complete, otherwise 1920 // It returns true when sweeping is completed and false otherwise.
1926 // AdvanceSweeper with size_in_bytes is called.
1927 bool EnsureSweeperProgress(intptr_t size_in_bytes); 1921 bool EnsureSweeperProgress(intptr_t size_in_bytes);
1928 1922
1929 bool IsLazySweepingComplete() {
1930 return !first_unswept_page_->is_valid();
1931 }
1932
1933 Page* FirstPage() { return anchor_.next_page(); } 1923 Page* FirstPage() { return anchor_.next_page(); }
1934 Page* LastPage() { return anchor_.prev_page(); } 1924 Page* LastPage() { return anchor_.prev_page(); }
1935 1925
1936 void EvictEvacuationCandidatesFromFreeLists(); 1926 void EvictEvacuationCandidatesFromFreeLists();
1937 1927
1938 bool CanExpand(); 1928 bool CanExpand();
1939 1929
1940 // Returns the number of total pages in this space. 1930 // Returns the number of total pages in this space.
1941 int CountTotalPages(); 1931 int CountTotalPages();
1942 1932
(...skipping 19 matching lines...) Expand all
1962 Page anchor_; 1952 Page anchor_;
1963 1953
1964 // The space's free list. 1954 // The space's free list.
1965 FreeList free_list_; 1955 FreeList free_list_;
1966 1956
1967 // Normal allocation information. 1957 // Normal allocation information.
1968 AllocationInfo allocation_info_; 1958 AllocationInfo allocation_info_;
1969 1959
1970 bool was_swept_conservatively_; 1960 bool was_swept_conservatively_;
1971 1961
1972 // The first page to be swept when the lazy sweeper advances. Is set
1973 // to NULL when all pages have been swept.
1974 Page* first_unswept_page_;
1975
1976 // The number of free bytes which could be reclaimed by advancing the 1962 // The number of free bytes which could be reclaimed by advancing the
1977 // lazy sweeper. This is only an estimation because lazy sweeping is 1963 // concurrent sweeper threads. This is only an estimation because concurrent
1978 // done conservatively. 1964 // sweeping is done conservatively.
1979 intptr_t unswept_free_bytes_; 1965 intptr_t unswept_free_bytes_;
1980 1966
1981 // Expands the space by allocating a fixed number of pages. Returns false if 1967 // Expands the space by allocating a fixed number of pages. Returns false if
1982 // it cannot allocate requested number of pages from OS, or if the hard heap 1968 // it cannot allocate requested number of pages from OS, or if the hard heap
1983 // size limit has been hit. 1969 // size limit has been hit.
1984 bool Expand(); 1970 bool Expand();
1985 1971
1986 // Generic fast case allocation function that tries linear allocation at the 1972 // Generic fast case allocation function that tries linear allocation at the
1987 // address denoted by top in allocation_info_. 1973 // address denoted by top in allocation_info_.
1988 inline HeapObject* AllocateLinearly(int size_in_bytes); 1974 inline HeapObject* AllocateLinearly(int size_in_bytes);
(...skipping 991 matching lines...) Expand 10 before | Expand all | Expand 10 after
2980 } 2966 }
2981 // Must be small, since an iteration is used for lookup. 2967 // Must be small, since an iteration is used for lookup.
2982 static const int kMaxComments = 64; 2968 static const int kMaxComments = 64;
2983 }; 2969 };
2984 #endif 2970 #endif
2985 2971
2986 2972
2987 } } // namespace v8::internal 2973 } } // namespace v8::internal
2988 2974
2989 #endif // V8_SPACES_H_ 2975 #endif // V8_SPACES_H_
OLDNEW
« no previous file with comments | « src/mark-compact.cc ('k') | src/spaces.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698