@@ -1744,61 +1744,13 @@ void Heap::ProcessNativeContexts(WeakObjectRetainer* retainer) {
1744
1744
}
1745
1745
1746
1746
1747
- void Heap::RegisterNewArrayBufferHelper (std::map<void *, size_t >& live_buffers,
1748
- void * data, size_t length) {
1749
- live_buffers[data] = length;
1750
- }
1751
-
1752
-
1753
- void Heap::UnregisterArrayBufferHelper (
1754
- std::map<void *, size_t >& live_buffers,
1755
- std::map<void *, size_t >& not_yet_discovered_buffers, void * data) {
1756
- DCHECK (live_buffers.count (data) > 0 );
1757
- live_buffers.erase (data);
1758
- not_yet_discovered_buffers.erase (data);
1759
- }
1760
-
1761
-
1762
- void Heap::RegisterLiveArrayBufferHelper (
1763
- std::map<void *, size_t >& not_yet_discovered_buffers, void * data) {
1764
- not_yet_discovered_buffers.erase (data);
1765
- }
1766
-
1767
-
1768
- size_t Heap::FreeDeadArrayBuffersHelper (
1769
- Isolate* isolate, std::map<void *, size_t >& live_buffers,
1770
- std::map<void *, size_t >& not_yet_discovered_buffers) {
1771
- size_t freed_memory = 0 ;
1772
- for (auto buffer = not_yet_discovered_buffers.begin ();
1773
- buffer != not_yet_discovered_buffers.end (); ++buffer) {
1774
- isolate->array_buffer_allocator ()->Free (buffer->first , buffer->second );
1775
- freed_memory += buffer->second ;
1776
- live_buffers.erase (buffer->first );
1777
- }
1778
- not_yet_discovered_buffers = live_buffers;
1779
- return freed_memory;
1780
- }
1781
-
1782
-
1783
- void Heap::TearDownArrayBuffersHelper (
1784
- Isolate* isolate, std::map<void *, size_t >& live_buffers,
1785
- std::map<void *, size_t >& not_yet_discovered_buffers) {
1786
- for (auto buffer = live_buffers.begin (); buffer != live_buffers.end ();
1787
- ++buffer) {
1788
- isolate->array_buffer_allocator ()->Free (buffer->first , buffer->second );
1789
- }
1790
- live_buffers.clear ();
1791
- not_yet_discovered_buffers.clear ();
1792
- }
1793
-
1794
-
1795
1747
void Heap::RegisterNewArrayBuffer (bool in_new_space, void * data,
1796
1748
size_t length) {
1797
1749
if (!data) return ;
1798
- RegisterNewArrayBufferHelper (live_array_buffers_, data, length);
1799
1750
if (in_new_space) {
1800
- RegisterNewArrayBufferHelper (live_array_buffers_for_scavenge_, data,
1801
- length);
1751
+ live_array_buffers_for_scavenge_[data] = length;
1752
+ } else {
1753
+ live_array_buffers_[data] = length;
1802
1754
}
1803
1755
1804
1756
// We may go over the limit of externally allocated memory here. We call the
@@ -1810,54 +1762,75 @@ void Heap::RegisterNewArrayBuffer(bool in_new_space, void* data,
1810
1762
1811
1763
void Heap::UnregisterArrayBuffer (bool in_new_space, void * data) {
1812
1764
if (!data) return ;
1813
- UnregisterArrayBufferHelper (live_array_buffers_,
1814
- not_yet_discovered_array_buffers_, data);
1815
- if (in_new_space) {
1816
- UnregisterArrayBufferHelper (live_array_buffers_for_scavenge_,
1817
- not_yet_discovered_array_buffers_for_scavenge_,
1818
- data);
1819
- }
1765
+
1766
+ std::map<void *, size_t >* live_buffers =
1767
+ in_new_space ? &live_array_buffers_for_scavenge_ : &live_array_buffers_;
1768
+ std::map<void *, size_t >* not_yet_discovered_buffers =
1769
+ in_new_space ? ¬_yet_discovered_array_buffers_for_scavenge_
1770
+ : ¬_yet_discovered_array_buffers_;
1771
+
1772
+ DCHECK (live_buffers->count (data) > 0 );
1773
+ live_buffers->erase (data);
1774
+ not_yet_discovered_buffers->erase (data);
1820
1775
}
1821
1776
1822
1777
1823
1778
void Heap::RegisterLiveArrayBuffer (bool from_scavenge, void * data) {
1824
1779
// ArrayBuffer might be in the middle of being constructed.
1825
1780
if (data == undefined_value ()) return ;
1826
- RegisterLiveArrayBufferHelper (
1827
- from_scavenge ? not_yet_discovered_array_buffers_for_scavenge_
1828
- : not_yet_discovered_array_buffers_,
1829
- data);
1781
+ if (from_scavenge) {
1782
+ not_yet_discovered_array_buffers_for_scavenge_.erase (data);
1783
+ } else if (!not_yet_discovered_array_buffers_.erase (data)) {
1784
+ not_yet_discovered_array_buffers_for_scavenge_.erase (data);
1785
+ }
1830
1786
}
1831
1787
1832
1788
1833
1789
void Heap::FreeDeadArrayBuffers (bool from_scavenge) {
1834
- if (from_scavenge) {
1835
- for (auto & buffer : not_yet_discovered_array_buffers_for_scavenge_) {
1836
- not_yet_discovered_array_buffers_.erase (buffer.first );
1837
- live_array_buffers_.erase (buffer.first );
1838
- }
1839
- } else {
1790
+ size_t freed_memory = 0 ;
1791
+ for (auto & buffer : not_yet_discovered_array_buffers_for_scavenge_) {
1792
+ isolate ()->array_buffer_allocator ()->Free (buffer.first , buffer.second );
1793
+ freed_memory += buffer.second ;
1794
+ live_array_buffers_for_scavenge_.erase (buffer.first );
1795
+ }
1796
+
1797
+ if (!from_scavenge) {
1840
1798
for (auto & buffer : not_yet_discovered_array_buffers_) {
1841
- // Scavenge can't happend during evacuation, so we only need to update
1842
- // live_array_buffers_for_scavenge_.
1843
- // not_yet_discovered_array_buffers_for_scanvenge_ will be reset before
1844
- // the next scavenge run in PrepareArrayBufferDiscoveryInNewSpace.
1845
- live_array_buffers_for_scavenge_.erase (buffer.first );
1799
+ isolate ()->array_buffer_allocator ()->Free (buffer.first , buffer.second );
1800
+ freed_memory += buffer.second ;
1801
+ live_array_buffers_.erase (buffer.first );
1846
1802
}
1847
1803
}
1848
1804
1805
+ not_yet_discovered_array_buffers_for_scavenge_ =
1806
+ live_array_buffers_for_scavenge_;
1807
+ if (!from_scavenge) not_yet_discovered_array_buffers_ = live_array_buffers_;
1808
+
1849
1809
// Do not call through the api as this code is triggered while doing a GC.
1850
- amount_of_external_allocated_memory_ -= FreeDeadArrayBuffersHelper (
1851
- isolate_,
1852
- from_scavenge ? live_array_buffers_for_scavenge_ : live_array_buffers_,
1853
- from_scavenge ? not_yet_discovered_array_buffers_for_scavenge_
1854
- : not_yet_discovered_array_buffers_);
1810
+ amount_of_external_allocated_memory_ -= freed_memory;
1855
1811
}
1856
1812
1857
1813
1858
1814
void Heap::TearDownArrayBuffers () {
1859
- TearDownArrayBuffersHelper (isolate_, live_array_buffers_,
1860
- not_yet_discovered_array_buffers_);
1815
+ size_t freed_memory = 0 ;
1816
+ for (auto & buffer : live_array_buffers_) {
1817
+ isolate ()->array_buffer_allocator ()->Free (buffer.first , buffer.second );
1818
+ freed_memory += buffer.second ;
1819
+ }
1820
+ for (auto & buffer : live_array_buffers_for_scavenge_) {
1821
+ isolate ()->array_buffer_allocator ()->Free (buffer.first , buffer.second );
1822
+ freed_memory += buffer.second ;
1823
+ }
1824
+ live_array_buffers_.clear ();
1825
+ live_array_buffers_for_scavenge_.clear ();
1826
+ not_yet_discovered_array_buffers_.clear ();
1827
+ not_yet_discovered_array_buffers_for_scavenge_.clear ();
1828
+
1829
+ if (freed_memory > 0 ) {
1830
+ reinterpret_cast <v8::Isolate*>(isolate_)
1831
+ ->AdjustAmountOfExternalAllocatedMemory (
1832
+ -static_cast <int64_t >(freed_memory));
1833
+ }
1861
1834
}
1862
1835
1863
1836
@@ -1875,7 +1848,7 @@ void Heap::PromoteArrayBuffer(Object* obj) {
1875
1848
// ArrayBuffer might be in the middle of being constructed.
1876
1849
if (data == undefined_value ()) return ;
1877
1850
DCHECK (live_array_buffers_for_scavenge_.count (data) > 0 );
1878
- DCHECK ( live_array_buffers_. count ( data) > 0 ) ;
1851
+ live_array_buffers_[ data] = live_array_buffers_for_scavenge_[data] ;
1879
1852
live_array_buffers_for_scavenge_.erase (data);
1880
1853
not_yet_discovered_array_buffers_for_scavenge_.erase (data);
1881
1854
}
0 commit comments