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