| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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_ |
| OLD | NEW |