| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/api.h" | 8 #include "src/api.h" |
| 9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
| 10 #include "src/base/once.h" | 10 #include "src/base/once.h" |
| (...skipping 1772 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1783 isolate->array_buffer_allocator()->Free(buffer->first, buffer->second); | 1783 isolate->array_buffer_allocator()->Free(buffer->first, buffer->second); |
| 1784 } | 1784 } |
| 1785 live_buffers.clear(); | 1785 live_buffers.clear(); |
| 1786 not_yet_discovered_buffers.clear(); | 1786 not_yet_discovered_buffers.clear(); |
| 1787 } | 1787 } |
| 1788 | 1788 |
| 1789 | 1789 |
| 1790 void Heap::RegisterNewArrayBuffer(bool in_new_space, void* data, | 1790 void Heap::RegisterNewArrayBuffer(bool in_new_space, void* data, |
| 1791 size_t length) { | 1791 size_t length) { |
| 1792 if (!data) return; | 1792 if (!data) return; |
| 1793 RegisterNewArrayBufferHelper( | 1793 RegisterNewArrayBufferHelper(live_array_buffers_, data, length); |
| 1794 in_new_space ? live_new_array_buffers_ : live_array_buffers_, data, | 1794 if (in_new_space) { |
| 1795 length); | 1795 RegisterNewArrayBufferHelper(live_array_buffers_for_scavenge_, data, |
| 1796 length); |
| 1797 } |
| 1796 reinterpret_cast<v8::Isolate*>(isolate_) | 1798 reinterpret_cast<v8::Isolate*>(isolate_) |
| 1797 ->AdjustAmountOfExternalAllocatedMemory(length); | 1799 ->AdjustAmountOfExternalAllocatedMemory(length); |
| 1798 } | 1800 } |
| 1799 | 1801 |
| 1800 | 1802 |
| 1801 void Heap::UnregisterArrayBuffer(bool in_new_space, void* data) { | 1803 void Heap::UnregisterArrayBuffer(bool in_new_space, void* data) { |
| 1802 if (!data) return; | 1804 if (!data) return; |
| 1803 UnregisterArrayBufferHelper( | 1805 UnregisterArrayBufferHelper(live_array_buffers_, |
| 1804 in_new_space ? live_new_array_buffers_ : live_array_buffers_, | 1806 not_yet_discovered_array_buffers_, data); |
| 1805 in_new_space ? not_yet_discovered_new_array_buffers_ | 1807 if (in_new_space) { |
| 1806 : not_yet_discovered_array_buffers_, | 1808 UnregisterArrayBufferHelper(live_array_buffers_for_scavenge_, |
| 1809 not_yet_discovered_array_buffers_for_scavenge_, |
| 1810 data); |
| 1811 } |
| 1812 } |
| 1813 |
| 1814 |
| 1815 void Heap::RegisterLiveArrayBuffer(bool from_scavenge, void* data) { |
| 1816 // ArrayBuffer might be in the middle of being constructed. |
| 1817 if (data == undefined_value()) return; |
| 1818 RegisterLiveArrayBufferHelper( |
| 1819 from_scavenge ? not_yet_discovered_array_buffers_for_scavenge_ |
| 1820 : not_yet_discovered_array_buffers_, |
| 1807 data); | 1821 data); |
| 1808 } | 1822 } |
| 1809 | 1823 |
| 1810 | 1824 |
| 1811 void Heap::RegisterLiveArrayBuffer(bool in_new_space, void* data) { | 1825 void Heap::FreeDeadArrayBuffers(bool from_scavenge) { |
| 1812 // ArrayBuffer might be in the middle of being constructed. | 1826 if (from_scavenge) { |
| 1813 if (data == undefined_value()) return; | 1827 for (auto& buffer : not_yet_discovered_array_buffers_for_scavenge_) { |
| 1814 RegisterLiveArrayBufferHelper(in_new_space | 1828 not_yet_discovered_array_buffers_.erase(buffer.first); |
| 1815 ? not_yet_discovered_new_array_buffers_ | 1829 live_array_buffers_.erase(buffer.first); |
| 1816 : not_yet_discovered_array_buffers_, | 1830 } |
| 1817 data); | 1831 } else { |
| 1818 } | 1832 for (auto& buffer : not_yet_discovered_array_buffers_) { |
| 1819 | 1833 // Scavenge can't happend during evacuation, so we only need to update |
| 1820 | 1834 // live_array_buffers_for_scavenge_. |
| 1821 void Heap::FreeDeadArrayBuffers(bool in_new_space) { | 1835 // not_yet_discovered_array_buffers_for_scanvenge_ will be reset before |
| 1836 // the next scavenge run in PrepareArrayBufferDiscoveryInNewSpace. |
| 1837 live_array_buffers_for_scavenge_.erase(buffer.first); |
| 1838 } |
| 1839 } |
| 1822 size_t freed_memory = FreeDeadArrayBuffersHelper( | 1840 size_t freed_memory = FreeDeadArrayBuffersHelper( |
| 1823 isolate_, in_new_space ? live_new_array_buffers_ : live_array_buffers_, | 1841 isolate_, |
| 1824 in_new_space ? not_yet_discovered_new_array_buffers_ | 1842 from_scavenge ? live_array_buffers_for_scavenge_ : live_array_buffers_, |
| 1825 : not_yet_discovered_array_buffers_); | 1843 from_scavenge ? not_yet_discovered_array_buffers_for_scavenge_ |
| 1844 : not_yet_discovered_array_buffers_); |
| 1826 if (freed_memory) { | 1845 if (freed_memory) { |
| 1827 reinterpret_cast<v8::Isolate*>(isolate_) | 1846 reinterpret_cast<v8::Isolate*>(isolate_) |
| 1828 ->AdjustAmountOfExternalAllocatedMemory( | 1847 ->AdjustAmountOfExternalAllocatedMemory( |
| 1829 -static_cast<int64_t>(freed_memory)); | 1848 -static_cast<int64_t>(freed_memory)); |
| 1830 } | 1849 } |
| 1831 } | 1850 } |
| 1832 | 1851 |
| 1833 | 1852 |
| 1834 void Heap::TearDownArrayBuffers() { | 1853 void Heap::TearDownArrayBuffers() { |
| 1835 TearDownArrayBuffersHelper(isolate_, live_array_buffers_, | 1854 TearDownArrayBuffersHelper(isolate_, live_array_buffers_, |
| 1836 not_yet_discovered_array_buffers_); | 1855 not_yet_discovered_array_buffers_); |
| 1837 TearDownArrayBuffersHelper(isolate_, live_new_array_buffers_, | |
| 1838 not_yet_discovered_new_array_buffers_); | |
| 1839 } | 1856 } |
| 1840 | 1857 |
| 1841 | 1858 |
| 1842 void Heap::PrepareArrayBufferDiscoveryInNewSpace() { | 1859 void Heap::PrepareArrayBufferDiscoveryInNewSpace() { |
| 1843 not_yet_discovered_new_array_buffers_ = live_new_array_buffers_; | 1860 not_yet_discovered_array_buffers_for_scavenge_ = |
| 1861 live_array_buffers_for_scavenge_; |
| 1844 } | 1862 } |
| 1845 | 1863 |
| 1846 | 1864 |
| 1847 void Heap::PromoteArrayBuffer(Object* obj) { | 1865 void Heap::PromoteArrayBuffer(Object* obj) { |
| 1848 JSArrayBuffer* buffer = JSArrayBuffer::cast(obj); | 1866 JSArrayBuffer* buffer = JSArrayBuffer::cast(obj); |
| 1849 if (buffer->is_external()) return; | 1867 if (buffer->is_external()) return; |
| 1850 void* data = buffer->backing_store(); | 1868 void* data = buffer->backing_store(); |
| 1851 if (!data) return; | 1869 if (!data) return; |
| 1852 // ArrayBuffer might be in the middle of being constructed. | 1870 // ArrayBuffer might be in the middle of being constructed. |
| 1853 if (data == undefined_value()) return; | 1871 if (data == undefined_value()) return; |
| 1854 DCHECK(live_new_array_buffers_.count(data) > 0); | 1872 DCHECK(live_array_buffers_for_scavenge_.count(data) > 0); |
| 1855 live_array_buffers_[data] = live_new_array_buffers_[data]; | 1873 DCHECK(live_array_buffers_.count(data) > 0); |
| 1856 live_new_array_buffers_.erase(data); | 1874 live_array_buffers_for_scavenge_.erase(data); |
| 1857 not_yet_discovered_new_array_buffers_.erase(data); | 1875 not_yet_discovered_array_buffers_for_scavenge_.erase(data); |
| 1858 } | 1876 } |
| 1859 | 1877 |
| 1860 | 1878 |
| 1861 void Heap::ProcessAllocationSites(WeakObjectRetainer* retainer) { | 1879 void Heap::ProcessAllocationSites(WeakObjectRetainer* retainer) { |
| 1862 Object* allocation_site_obj = | 1880 Object* allocation_site_obj = |
| 1863 VisitWeakList<AllocationSite>(this, allocation_sites_list(), retainer); | 1881 VisitWeakList<AllocationSite>(this, allocation_sites_list(), retainer); |
| 1864 set_allocation_sites_list(allocation_site_obj); | 1882 set_allocation_sites_list(allocation_site_obj); |
| 1865 } | 1883 } |
| 1866 | 1884 |
| 1867 | 1885 |
| (...skipping 4707 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6575 } | 6593 } |
| 6576 delete list; | 6594 delete list; |
| 6577 } else { | 6595 } else { |
| 6578 prev = list; | 6596 prev = list; |
| 6579 } | 6597 } |
| 6580 list = next; | 6598 list = next; |
| 6581 } | 6599 } |
| 6582 } | 6600 } |
| 6583 } | 6601 } |
| 6584 } // namespace v8::internal | 6602 } // namespace v8::internal |
| OLD | NEW |