@@ -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
}
0 commit comments