| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 5cd1fd8 commit 1fdec65
3 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1791,61 +1791,13 @@ void Heap::ProcessNativeContexts(WeakObjectRetainer* retainer) { | |||
| 1791 | 1791 | } | |
| 1792 | 1792 | ||
| 1793 | 1793 | ||
| 1794 | - void Heap::RegisterNewArrayBufferHelper(std::map<void*, size_t>& live_buffers, | ||
| 1795 | - void* data, size_t length) { | ||
| 1796 | - live_buffers[data] = length; | ||
| 1797 | - } | ||
| 1798 | - | ||
| 1799 | - | ||
| 1800 | - void Heap::UnregisterArrayBufferHelper( | ||
| 1801 | - std::map<void*, size_t>& live_buffers, | ||
| 1802 | - std::map<void*, size_t>& not_yet_discovered_buffers, void* data) { | ||
| 1803 | - DCHECK(live_buffers.count(data) > 0); | ||
| 1804 | - live_buffers.erase(data); | ||
| 1805 | - not_yet_discovered_buffers.erase(data); | ||
| 1806 | - } | ||
| 1807 | - | ||
| 1808 | - | ||
| 1809 | - void Heap::RegisterLiveArrayBufferHelper( | ||
| 1810 | - std::map<void*, size_t>& not_yet_discovered_buffers, void* data) { | ||
| 1811 | - not_yet_discovered_buffers.erase(data); | ||
| 1812 | - } | ||
| 1813 | - | ||
| 1814 | - | ||
| 1815 | - size_t Heap::FreeDeadArrayBuffersHelper( | ||
| 1816 | - Isolate* isolate, std::map<void*, size_t>& live_buffers, | ||
| 1817 | - std::map<void*, size_t>& not_yet_discovered_buffers) { | ||
| 1818 | - size_t freed_memory = 0; | ||
| 1819 | - for (auto buffer = not_yet_discovered_buffers.begin(); | ||
| 1820 | - buffer != not_yet_discovered_buffers.end(); ++buffer) { | ||
| 1821 | - isolate->array_buffer_allocator()->Free(buffer->first, buffer->second); | ||
| 1822 | - freed_memory += buffer->second; | ||
| 1823 | - live_buffers.erase(buffer->first); | ||
| 1824 | - } | ||
| 1825 | - not_yet_discovered_buffers = live_buffers; | ||
| 1826 | - return freed_memory; | ||
| 1827 | - } | ||
| 1828 | - | ||
| 1829 | - | ||
| 1830 | - void Heap::TearDownArrayBuffersHelper( | ||
| 1831 | - Isolate* isolate, std::map<void*, size_t>& live_buffers, | ||
| 1832 | - std::map<void*, size_t>& not_yet_discovered_buffers) { | ||
| 1833 | - for (auto buffer = live_buffers.begin(); buffer != live_buffers.end(); | ||
| 1834 | - ++buffer) { | ||
| 1835 | - isolate->array_buffer_allocator()->Free(buffer->first, buffer->second); | ||
| 1836 | - } | ||
| 1837 | - live_buffers.clear(); | ||
| 1838 | - not_yet_discovered_buffers.clear(); | ||
| 1839 | - } | ||
| 1840 | - | ||
| 1841 | - | ||
| 1842 | 1794 | void Heap::RegisterNewArrayBuffer(bool in_new_space, void* data, | |
| 1843 | 1795 | size_t length) { | |
| 1844 | 1796 | if (!data) return; | |
| 1845 | - RegisterNewArrayBufferHelper(live_array_buffers_, data, length); | ||
| 1846 | 1797 | if (in_new_space) { | |
| 1847 | - RegisterNewArrayBufferHelper(live_array_buffers_for_scavenge_, data, | ||
| 1848 | - length); | ||
| 1798 | + live_array_buffers_for_scavenge_[data] = length; | ||
| 1799 | + } else { | ||
| 1800 | + live_array_buffers_[data] = length; | ||
| 1849 | 1801 | } | |
| 1850 | 1802 | ||
| 1851 | 1803 | // We may go over the limit of externally allocated memory here. We call the | |
@@ -1857,54 +1809,75 @@ void Heap::RegisterNewArrayBuffer(bool in_new_space, void* data, | |||
| 1857 | 1809 | ||
| 1858 | 1810 | void Heap::UnregisterArrayBuffer(bool in_new_space, void* data) { | |
| 1859 | 1811 | if (!data) return; | |
| 1860 | - UnregisterArrayBufferHelper(live_array_buffers_, | ||
| 1861 | - not_yet_discovered_array_buffers_, data); | ||
| 1862 | - if (in_new_space) { | ||
| 1863 | - UnregisterArrayBufferHelper(live_array_buffers_for_scavenge_, | ||
| 1864 | - not_yet_discovered_array_buffers_for_scavenge_, | ||
| 1865 | - data); | ||
| 1866 | - } | ||
| 1812 | + | ||
| 1813 | + std::map<void*, size_t>* live_buffers = | ||
| 1814 | + in_new_space ? &live_array_buffers_for_scavenge_ : &live_array_buffers_; | ||
| 1815 | + std::map<void*, size_t>* not_yet_discovered_buffers = | ||
| 1816 | + in_new_space ? ¬_yet_discovered_array_buffers_for_scavenge_ | ||
| 1817 | + : ¬_yet_discovered_array_buffers_; | ||
| 1818 | + | ||
| 1819 | + DCHECK(live_buffers->count(data) > 0); | ||
| 1820 | + live_buffers->erase(data); | ||
| 1821 | + not_yet_discovered_buffers->erase(data); | ||
| 1867 | 1822 | } | |
| 1868 | 1823 | ||
| 1869 | 1824 | ||
| 1870 | 1825 | void Heap::RegisterLiveArrayBuffer(bool from_scavenge, void* data) { | |
| 1871 | 1826 | // ArrayBuffer might be in the middle of being constructed. | |
| 1872 | 1827 | if (data == undefined_value()) return; | |
| 1873 | - RegisterLiveArrayBufferHelper( | ||
| 1874 | - from_scavenge ? not_yet_discovered_array_buffers_for_scavenge_ | ||
| 1875 | - : not_yet_discovered_array_buffers_, | ||
| 1876 | - data); | ||
| 1828 | + if (from_scavenge) { | ||
| 1829 | + not_yet_discovered_array_buffers_for_scavenge_.erase(data); | ||
| 1830 | + } else if (!not_yet_discovered_array_buffers_.erase(data)) { | ||
| 1831 | + not_yet_discovered_array_buffers_for_scavenge_.erase(data); | ||
| 1832 | + } | ||
| 1877 | 1833 | } | |
| 1878 | 1834 | ||
| 1879 | 1835 | ||
| 1880 | 1836 | void Heap::FreeDeadArrayBuffers(bool from_scavenge) { | |
| 1881 | - if (from_scavenge) { | ||
| 1882 | - for (auto& buffer : not_yet_discovered_array_buffers_for_scavenge_) { | ||
| 1883 | - not_yet_discovered_array_buffers_.erase(buffer.first); | ||
| 1884 | - live_array_buffers_.erase(buffer.first); | ||
| 1885 | - } | ||
| 1886 | - } else { | ||
| 1837 | + size_t freed_memory = 0; | ||
| 1838 | + for (auto& buffer : not_yet_discovered_array_buffers_for_scavenge_) { | ||
| 1839 | + isolate()->array_buffer_allocator()->Free(buffer.first, buffer.second); | ||
| 1840 | + freed_memory += buffer.second; | ||
| 1841 | + live_array_buffers_for_scavenge_.erase(buffer.first); | ||
| 1842 | + } | ||
| 1843 | + | ||
| 1844 | + if (!from_scavenge) { | ||
| 1887 | 1845 | for (auto& buffer : not_yet_discovered_array_buffers_) { | |
| 1888 | - // Scavenge can't happend during evacuation, so we only need to update | ||
| 1889 | - // live_array_buffers_for_scavenge_. | ||
| 1890 | - // not_yet_discovered_array_buffers_for_scanvenge_ will be reset before | ||
| 1891 | - // the next scavenge run in PrepareArrayBufferDiscoveryInNewSpace. | ||
| 1892 | - live_array_buffers_for_scavenge_.erase(buffer.first); | ||
| 1846 | + isolate()->array_buffer_allocator()->Free(buffer.first, buffer.second); | ||
| 1847 | + freed_memory += buffer.second; | ||
| 1848 | + live_array_buffers_.erase(buffer.first); | ||
| 1893 | 1849 | } | |
| 1894 | 1850 | } | |
| 1895 | 1851 | ||
| 1852 | + not_yet_discovered_array_buffers_for_scavenge_ = | ||
| 1853 | + live_array_buffers_for_scavenge_; | ||
| 1854 | + if (!from_scavenge) not_yet_discovered_array_buffers_ = live_array_buffers_; | ||
| 1855 | + | ||
| 1896 | 1856 | // Do not call through the api as this code is triggered while doing a GC. | |
| 1897 | - amount_of_external_allocated_memory_ -= FreeDeadArrayBuffersHelper( | ||
| 1898 | - isolate_, | ||
| 1899 | - from_scavenge ? live_array_buffers_for_scavenge_ : live_array_buffers_, | ||
| 1900 | - from_scavenge ? not_yet_discovered_array_buffers_for_scavenge_ | ||
| 1901 | - : not_yet_discovered_array_buffers_); | ||
| 1857 | + amount_of_external_allocated_memory_ -= freed_memory; | ||
| 1902 | 1858 | } | |
| 1903 | 1859 | ||
| 1904 | 1860 | ||
| 1905 | 1861 | void Heap::TearDownArrayBuffers() { | |
| 1906 | - TearDownArrayBuffersHelper(isolate_, live_array_buffers_, | ||
| 1907 | - not_yet_discovered_array_buffers_); | ||
| 1862 | + size_t freed_memory = 0; | ||
| 1863 | + for (auto& buffer : live_array_buffers_) { | ||
| 1864 | + isolate()->array_buffer_allocator()->Free(buffer.first, buffer.second); | ||
| 1865 | + freed_memory += buffer.second; | ||
| 1866 | + } | ||
| 1867 | + for (auto& buffer : live_array_buffers_for_scavenge_) { | ||
| 1868 | + isolate()->array_buffer_allocator()->Free(buffer.first, buffer.second); | ||
| 1869 | + freed_memory += buffer.second; | ||
| 1870 | + } | ||
| 1871 | + live_array_buffers_.clear(); | ||
| 1872 | + live_array_buffers_for_scavenge_.clear(); | ||
| 1873 | + not_yet_discovered_array_buffers_.clear(); | ||
| 1874 | + not_yet_discovered_array_buffers_for_scavenge_.clear(); | ||
| 1875 | + | ||
| 1876 | + if (freed_memory > 0) { | ||
| 1877 | + reinterpret_cast<v8::Isolate*>(isolate_) | ||
| 1878 | + ->AdjustAmountOfExternalAllocatedMemory( | ||
| 1879 | + -static_cast<int64_t>(freed_memory)); | ||
| 1880 | + } | ||
| 1908 | 1881 | } | |
| 1909 | 1882 | ||
| 1910 | 1883 | ||
@@ -1922,7 +1895,7 @@ void Heap::PromoteArrayBuffer(Object* obj) { | |||
| 1922 | 1895 | // ArrayBuffer might be in the middle of being constructed. | |
| 1923 | 1896 | if (data == undefined_value()) return; | |
| 1924 | 1897 | DCHECK(live_array_buffers_for_scavenge_.count(data) > 0); | |
| 1925 | - DCHECK(live_array_buffers_.count(data) > 0); | ||
| 1898 | + live_array_buffers_[data] = live_array_buffers_for_scavenge_[data]; | ||
| 1926 | 1899 | live_array_buffers_for_scavenge_.erase(data); | |
| 1927 | 1900 | not_yet_discovered_array_buffers_for_scavenge_.erase(data); | |
| 1928 | 1901 | } | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -2095,21 +2095,6 @@ class Heap { | |||
| 2095 | 2095 | // Called on heap tear-down. Frees all remaining ArrayBuffer backing stores. | |
| 2096 | 2096 | void TearDownArrayBuffers(); | |
| 2097 | 2097 | ||
| 2098 | - // These correspond to the non-Helper versions. | ||
| 2099 | - void RegisterNewArrayBufferHelper(std::map<void*, size_t>& live_buffers, | ||
| 2100 | - void* data, size_t length); | ||
| 2101 | - void UnregisterArrayBufferHelper( | ||
| 2102 | - std::map<void*, size_t>& live_buffers, | ||
| 2103 | - std::map<void*, size_t>& not_yet_discovered_buffers, void* data); | ||
| 2104 | - void RegisterLiveArrayBufferHelper( | ||
| 2105 | - std::map<void*, size_t>& not_yet_discovered_buffers, void* data); | ||
| 2106 | - size_t FreeDeadArrayBuffersHelper( | ||
| 2107 | - Isolate* isolate, std::map<void*, size_t>& live_buffers, | ||
| 2108 | - std::map<void*, size_t>& not_yet_discovered_buffers); | ||
| 2109 | - void TearDownArrayBuffersHelper( | ||
| 2110 | - Isolate* isolate, std::map<void*, size_t>& live_buffers, | ||
| 2111 | - std::map<void*, size_t>& not_yet_discovered_buffers); | ||
| 2112 | - | ||
| 2113 | 2098 | // Record statistics before and after garbage collection. | |
| 2114 | 2099 | void ReportStatisticsBeforeGC(); | |
| 2115 | 2100 | void ReportStatisticsAfterGC(); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -4357,6 +4357,9 @@ void MarkCompactCollector::SweepSpaces() { | |||
| 4357 | 4357 | ||
| 4358 | 4358 | EvacuateNewSpaceAndCandidates(); | |
| 4359 | 4359 | ||
| 4360 | + // NOTE: ArrayBuffers must be evacuated first, before freeing them. Otherwise | ||
| 4361 | + // not yet discovered buffers for scavenge will have all of them, and they | ||
| 4362 | + // will be erroneously freed. | ||
| 4360 | 4363 | heap()->FreeDeadArrayBuffers(false); | |
| 4361 | 4364 | ||
| 4362 | 4365 | // Deallocate unmarked objects and clear marked bits for marked objects. | |
| Back | FazBrowse Home | New Git URL |
0 commit comments