| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent c60857a commit e1c9761
3 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1854,120 +1854,93 @@ void Heap::ProcessNativeContexts(WeakObjectRetainer* retainer) { | |||
| 1854 | 1854 | } | |
| 1855 | 1855 | ||
| 1856 | 1856 | ||
| 1857 | - void Heap::RegisterNewArrayBufferHelper(std::map<void*, size_t>& live_buffers, | ||
| 1858 | - void* data, size_t length) { | ||
| 1859 | - live_buffers[data] = length; | ||
| 1860 | - } | ||
| 1861 | - | ||
| 1862 | - | ||
| 1863 | - void Heap::UnregisterArrayBufferHelper( | ||
| 1864 | - std::map<void*, size_t>& live_buffers, | ||
| 1865 | - std::map<void*, size_t>& not_yet_discovered_buffers, void* data) { | ||
| 1866 | - DCHECK(live_buffers.count(data) > 0); | ||
| 1867 | - live_buffers.erase(data); | ||
| 1868 | - not_yet_discovered_buffers.erase(data); | ||
| 1869 | - } | ||
| 1870 | - | ||
| 1871 | - | ||
| 1872 | - void Heap::RegisterLiveArrayBufferHelper( | ||
| 1873 | - std::map<void*, size_t>& not_yet_discovered_buffers, void* data) { | ||
| 1874 | - not_yet_discovered_buffers.erase(data); | ||
| 1875 | - } | ||
| 1876 | - | ||
| 1877 | - | ||
| 1878 | - size_t Heap::FreeDeadArrayBuffersHelper( | ||
| 1879 | - Isolate* isolate, std::map<void*, size_t>& live_buffers, | ||
| 1880 | - std::map<void*, size_t>& not_yet_discovered_buffers) { | ||
| 1881 | - size_t freed_memory = 0; | ||
| 1882 | - for (auto buffer = not_yet_discovered_buffers.begin(); | ||
| 1883 | - buffer != not_yet_discovered_buffers.end(); ++buffer) { | ||
| 1884 | - isolate->array_buffer_allocator()->Free(buffer->first, buffer->second); | ||
| 1885 | - freed_memory += buffer->second; | ||
| 1886 | - live_buffers.erase(buffer->first); | ||
| 1887 | - } | ||
| 1888 | - not_yet_discovered_buffers = live_buffers; | ||
| 1889 | - return freed_memory; | ||
| 1890 | - } | ||
| 1891 | - | ||
| 1892 | - | ||
| 1893 | - void Heap::TearDownArrayBuffersHelper( | ||
| 1894 | - Isolate* isolate, std::map<void*, size_t>& live_buffers, | ||
| 1895 | - std::map<void*, size_t>& not_yet_discovered_buffers) { | ||
| 1896 | - for (auto buffer = live_buffers.begin(); buffer != live_buffers.end(); | ||
| 1897 | - ++buffer) { | ||
| 1898 | - isolate->array_buffer_allocator()->Free(buffer->first, buffer->second); | ||
| 1899 | - } | ||
| 1900 | - live_buffers.clear(); | ||
| 1901 | - not_yet_discovered_buffers.clear(); | ||
| 1902 | - } | ||
| 1903 | - | ||
| 1904 | - | ||
| 1905 | 1857 | void Heap::RegisterNewArrayBuffer(bool in_new_space, void* data, | |
| 1906 | 1858 | size_t length) { | |
| 1907 | 1859 | if (!data) return; | |
| 1908 | - RegisterNewArrayBufferHelper(live_array_buffers_, data, length); | ||
| 1909 | 1860 | if (in_new_space) { | |
| 1910 | - RegisterNewArrayBufferHelper(live_array_buffers_for_scavenge_, data, | ||
| 1911 | - length); | ||
| 1861 | + live_array_buffers_for_scavenge_[data] = length; | ||
| 1862 | + } else { | ||
| 1863 | + live_array_buffers_[data] = length; | ||
| 1912 | 1864 | } | |
| 1865 | + | ||
| 1866 | + // We may go over the limit of externally allocated memory here. We call the | ||
| 1867 | + // api function to trigger a GC in this case. | ||
| 1913 | 1868 | reinterpret_cast<v8::Isolate*>(isolate_) | |
| 1914 | 1869 | ->AdjustAmountOfExternalAllocatedMemory(length); | |
| 1915 | 1870 | } | |
| 1916 | 1871 | ||
| 1917 | 1872 | ||
| 1918 | 1873 | void Heap::UnregisterArrayBuffer(bool in_new_space, void* data) { | |
| 1919 | 1874 | if (!data) return; | |
| 1920 | - UnregisterArrayBufferHelper(live_array_buffers_, | ||
| 1921 | - not_yet_discovered_array_buffers_, data); | ||
| 1922 | - if (in_new_space) { | ||
| 1923 | - UnregisterArrayBufferHelper(live_array_buffers_for_scavenge_, | ||
| 1924 | - not_yet_discovered_array_buffers_for_scavenge_, | ||
| 1925 | - data); | ||
| 1926 | - } | ||
| 1875 | + | ||
| 1876 | + std::map<void*, size_t>* live_buffers = | ||
| 1877 | + in_new_space ? &live_array_buffers_for_scavenge_ : &live_array_buffers_; | ||
| 1878 | + std::map<void*, size_t>* not_yet_discovered_buffers = | ||
| 1879 | + in_new_space ? ¬_yet_discovered_array_buffers_for_scavenge_ | ||
| 1880 | + : ¬_yet_discovered_array_buffers_; | ||
| 1881 | + | ||
| 1882 | + DCHECK(live_buffers->count(data) > 0); | ||
| 1883 | + live_buffers->erase(data); | ||
| 1884 | + not_yet_discovered_buffers->erase(data); | ||
| 1927 | 1885 | } | |
| 1928 | 1886 | ||
| 1929 | 1887 | ||
| 1930 | 1888 | void Heap::RegisterLiveArrayBuffer(bool from_scavenge, void* data) { | |
| 1931 | 1889 | // ArrayBuffer might be in the middle of being constructed. | |
| 1932 | 1890 | if (data == undefined_value()) return; | |
| 1933 | - RegisterLiveArrayBufferHelper( | ||
| 1934 | - from_scavenge ? not_yet_discovered_array_buffers_for_scavenge_ | ||
| 1935 | - : not_yet_discovered_array_buffers_, | ||
| 1936 | - data); | ||
| 1891 | + if (from_scavenge) { | ||
| 1892 | + not_yet_discovered_array_buffers_for_scavenge_.erase(data); | ||
| 1893 | + } else if (!not_yet_discovered_array_buffers_.erase(data)) { | ||
| 1894 | + not_yet_discovered_array_buffers_for_scavenge_.erase(data); | ||
| 1895 | + } | ||
| 1937 | 1896 | } | |
| 1938 | 1897 | ||
| 1939 | 1898 | ||
| 1940 | 1899 | void Heap::FreeDeadArrayBuffers(bool from_scavenge) { | |
| 1941 | - if (from_scavenge) { | ||
| 1942 | - for (auto& buffer : not_yet_discovered_array_buffers_for_scavenge_) { | ||
| 1943 | - not_yet_discovered_array_buffers_.erase(buffer.first); | ||
| 1944 | - live_array_buffers_.erase(buffer.first); | ||
| 1945 | - } | ||
| 1946 | - } else { | ||
| 1900 | + size_t freed_memory = 0; | ||
| 1901 | + for (auto& buffer : not_yet_discovered_array_buffers_for_scavenge_) { | ||
| 1902 | + isolate()->array_buffer_allocator()->Free(buffer.first, buffer.second); | ||
| 1903 | + freed_memory += buffer.second; | ||
| 1904 | + live_array_buffers_for_scavenge_.erase(buffer.first); | ||
| 1905 | + } | ||
| 1906 | + | ||
| 1907 | + if (!from_scavenge) { | ||
| 1947 | 1908 | for (auto& buffer : not_yet_discovered_array_buffers_) { | |
| 1948 | - // Scavenge can't happend during evacuation, so we only need to update | ||
| 1949 | - // live_array_buffers_for_scavenge_. | ||
| 1950 | - // not_yet_discovered_array_buffers_for_scanvenge_ will be reset before | ||
| 1951 | - // the next scavenge run in PrepareArrayBufferDiscoveryInNewSpace. | ||
| 1952 | - live_array_buffers_for_scavenge_.erase(buffer.first); | ||
| 1909 | + isolate()->array_buffer_allocator()->Free(buffer.first, buffer.second); | ||
| 1910 | + freed_memory += buffer.second; | ||
| 1911 | + live_array_buffers_.erase(buffer.first); | ||
| 1953 | 1912 | } | |
| 1954 | 1913 | } | |
| 1955 | - size_t freed_memory = FreeDeadArrayBuffersHelper( | ||
| 1956 | - isolate_, | ||
| 1957 | - from_scavenge ? live_array_buffers_for_scavenge_ : live_array_buffers_, | ||
| 1958 | - from_scavenge ? not_yet_discovered_array_buffers_for_scavenge_ | ||
| 1959 | - : not_yet_discovered_array_buffers_); | ||
| 1960 | - if (freed_memory) { | ||
| 1961 | - reinterpret_cast<v8::Isolate*>(isolate_) | ||
| 1962 | - ->AdjustAmountOfExternalAllocatedMemory( | ||
| 1963 | - -static_cast<int64_t>(freed_memory)); | ||
| 1964 | - } | ||
| 1914 | + | ||
| 1915 | + not_yet_discovered_array_buffers_for_scavenge_ = | ||
| 1916 | + live_array_buffers_for_scavenge_; | ||
| 1917 | + if (!from_scavenge) not_yet_discovered_array_buffers_ = live_array_buffers_; | ||
| 1918 | + | ||
| 1919 | + // Do not call through the api as this code is triggered while doing a GC. | ||
| 1920 | + amount_of_external_allocated_memory_ -= freed_memory; | ||
| 1965 | 1921 | } | |
| 1966 | 1922 | ||
| 1967 | 1923 | ||
| 1968 | 1924 | void Heap::TearDownArrayBuffers() { | |
| 1969 | - TearDownArrayBuffersHelper(isolate_, live_array_buffers_, | ||
| 1970 | - not_yet_discovered_array_buffers_); | ||
| 1925 | + size_t freed_memory = 0; | ||
| 1926 | + for (auto& buffer : live_array_buffers_) { | ||
| 1927 | + isolate()->array_buffer_allocator()->Free(buffer.first, buffer.second); | ||
| 1928 | + freed_memory += buffer.second; | ||
| 1929 | + } | ||
| 1930 | + for (auto& buffer : live_array_buffers_for_scavenge_) { | ||
| 1931 | + isolate()->array_buffer_allocator()->Free(buffer.first, buffer.second); | ||
| 1932 | + freed_memory += buffer.second; | ||
| 1933 | + } | ||
| 1934 | + live_array_buffers_.clear(); | ||
| 1935 | + live_array_buffers_for_scavenge_.clear(); | ||
| 1936 | + not_yet_discovered_array_buffers_.clear(); | ||
| 1937 | + not_yet_discovered_array_buffers_for_scavenge_.clear(); | ||
| 1938 | + | ||
| 1939 | + if (freed_memory > 0) { | ||
| 1940 | + reinterpret_cast<v8::Isolate*>(isolate_) | ||
| 1941 | + ->AdjustAmountOfExternalAllocatedMemory( | ||
| 1942 | + -static_cast<int64_t>(freed_memory)); | ||
| 1943 | + } | ||
| 1971 | 1944 | } | |
| 1972 | 1945 | ||
| 1973 | 1946 | ||
@@ -1985,7 +1958,7 @@ void Heap::PromoteArrayBuffer(Object* obj) { | |||
| 1985 | 1958 | // ArrayBuffer might be in the middle of being constructed. | |
| 1986 | 1959 | if (data == undefined_value()) return; | |
| 1987 | 1960 | DCHECK(live_array_buffers_for_scavenge_.count(data) > 0); | |
| 1988 | - DCHECK(live_array_buffers_.count(data) > 0); | ||
| 1961 | + live_array_buffers_[data] = live_array_buffers_for_scavenge_[data]; | ||
| 1989 | 1962 | live_array_buffers_for_scavenge_.erase(data); | |
| 1990 | 1963 | not_yet_discovered_array_buffers_for_scavenge_.erase(data); | |
| 1991 | 1964 | } | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -2147,21 +2147,6 @@ class Heap { | |||
| 2147 | 2147 | // Called on heap tear-down. Frees all remaining ArrayBuffer backing stores. | |
| 2148 | 2148 | void TearDownArrayBuffers(); | |
| 2149 | 2149 | ||
| 2150 | - // These correspond to the non-Helper versions. | ||
| 2151 | - void RegisterNewArrayBufferHelper(std::map<void*, size_t>& live_buffers, | ||
| 2152 | - void* data, size_t length); | ||
| 2153 | - void UnregisterArrayBufferHelper( | ||
| 2154 | - std::map<void*, size_t>& live_buffers, | ||
| 2155 | - std::map<void*, size_t>& not_yet_discovered_buffers, void* data); | ||
| 2156 | - void RegisterLiveArrayBufferHelper( | ||
| 2157 | - std::map<void*, size_t>& not_yet_discovered_buffers, void* data); | ||
| 2158 | - size_t FreeDeadArrayBuffersHelper( | ||
| 2159 | - Isolate* isolate, std::map<void*, size_t>& live_buffers, | ||
| 2160 | - std::map<void*, size_t>& not_yet_discovered_buffers); | ||
| 2161 | - void TearDownArrayBuffersHelper( | ||
| 2162 | - Isolate* isolate, std::map<void*, size_t>& live_buffers, | ||
| 2163 | - std::map<void*, size_t>& not_yet_discovered_buffers); | ||
| 2164 | - | ||
| 2165 | 2150 | // Record statistics before and after garbage collection. | |
| 2166 | 2151 | void ReportStatisticsBeforeGC(); | |
| 2167 | 2152 | void ReportStatisticsAfterGC(); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -4310,6 +4310,9 @@ void MarkCompactCollector::SweepSpaces() { | |||
| 4310 | 4310 | ||
| 4311 | 4311 | EvacuateNewSpaceAndCandidates(); | |
| 4312 | 4312 | ||
| 4313 | + // NOTE: ArrayBuffers must be evacuated first, before freeing them. Otherwise | ||
| 4314 | + // not yet discovered buffers for scavenge will have all of them, and they | ||
| 4315 | + // will be erroneously freed. | ||
| 4313 | 4316 | heap()->FreeDeadArrayBuffers(false); | |
| 4314 | 4317 | ||
| 4315 | 4318 | // ClearNonLiveReferences depends on precise sweeping of map space to | |
| Back | FazBrowse Home | New Git URL |
0 commit comments