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/heap/heap.h" | 5 #include "src/heap/heap.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 1718 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1729 } | 1729 } |
1730 | 1730 |
1731 | 1731 |
1732 void Heap::ProcessNativeContexts(WeakObjectRetainer* retainer) { | 1732 void Heap::ProcessNativeContexts(WeakObjectRetainer* retainer) { |
1733 Object* head = VisitWeakList<Context>(this, native_contexts_list(), retainer); | 1733 Object* head = VisitWeakList<Context>(this, native_contexts_list(), retainer); |
1734 // Update the head of the list of contexts. | 1734 // Update the head of the list of contexts. |
1735 set_native_contexts_list(head); | 1735 set_native_contexts_list(head); |
1736 } | 1736 } |
1737 | 1737 |
1738 | 1738 |
1739 void Heap::RegisterNewArrayBufferHelper(std::map<void*, size_t>& live_buffers, | 1739 void Heap::RegisterNewArrayBufferHelper(std::map<void*, size_t>& live_buffers, |
Michael Lippautz
2015/08/28 08:05:02
Please get rid of this function and inline it into
fedor.indutny
2015/08/28 11:03:34
Acknowledged.
| |
1740 void* data, size_t length) { | 1740 void* data, size_t length) { |
1741 live_buffers[data] = length; | 1741 live_buffers[data] = length; |
1742 } | 1742 } |
1743 | 1743 |
1744 | 1744 |
1745 void Heap::UnregisterArrayBufferHelper( | 1745 void Heap::UnregisterArrayBufferHelper( |
Michael Lippautz
2015/08/28 08:05:02
Ditto, please inline the call manually.
fedor.indutny
2015/08/28 11:03:34
Acknowledged.
| |
1746 std::map<void*, size_t>& live_buffers, | 1746 std::map<void*, size_t>& live_buffers, |
1747 std::map<void*, size_t>& not_yet_discovered_buffers, void* data) { | 1747 std::map<void*, size_t>& not_yet_discovered_buffers, void* data) { |
1748 DCHECK(live_buffers.count(data) > 0); | 1748 DCHECK(live_buffers.count(data) > 0); |
1749 live_buffers.erase(data); | 1749 live_buffers.erase(data); |
1750 not_yet_discovered_buffers.erase(data); | 1750 not_yet_discovered_buffers.erase(data); |
1751 } | 1751 } |
1752 | 1752 |
1753 | 1753 |
1754 void Heap::RegisterLiveArrayBufferHelper( | 1754 void Heap::RegisterLiveArrayBufferHelper( |
Michael Lippautz
2015/08/28 08:05:02
Please get rid of this function and inline it into
fedor.indutny
2015/08/28 11:03:34
Acknowledged.
| |
1755 std::map<void*, size_t>& not_yet_discovered_buffers, void* data) { | 1755 std::map<void*, size_t>& not_yet_discovered_buffers, void* data) { |
1756 not_yet_discovered_buffers.erase(data); | 1756 not_yet_discovered_buffers.erase(data); |
1757 } | 1757 } |
1758 | 1758 |
1759 | 1759 |
1760 size_t Heap::FreeDeadArrayBuffersHelper( | 1760 size_t Heap::FreeDeadArrayBuffersHelper( |
Michael Lippautz
2015/08/28 08:05:02
We should get rid of this one. See below.
fedor.indutny
2015/08/28 11:03:34
Acknowledged.
| |
1761 Isolate* isolate, std::map<void*, size_t>& live_buffers, | 1761 Isolate* isolate, bool from_scavenge, |
1762 std::map<void*, size_t>& not_yet_discovered_buffers) { | 1762 std::map<void*, size_t>& not_yet_discovered_buffers) { |
1763 size_t freed_memory = 0; | 1763 size_t freed_memory = 0; |
1764 for (auto buffer = not_yet_discovered_buffers.begin(); | 1764 for (auto buffer = not_yet_discovered_buffers.begin(); |
1765 buffer != not_yet_discovered_buffers.end(); ++buffer) { | 1765 buffer != not_yet_discovered_buffers.end(); ++buffer) { |
1766 isolate->array_buffer_allocator()->Free(buffer->first, buffer->second); | 1766 isolate->array_buffer_allocator()->Free(buffer->first, buffer->second); |
1767 freed_memory += buffer->second; | 1767 freed_memory += buffer->second; |
1768 live_buffers.erase(buffer->first); | 1768 if (!from_scavenge) { |
1769 live_array_buffers_.erase(buffer->first); | |
1770 } | |
1771 live_array_buffers_for_scavenge_.erase(buffer->first); | |
1769 } | 1772 } |
1770 not_yet_discovered_buffers = live_buffers; | 1773 if (from_scavenge) { |
1774 not_yet_discovered_buffers = live_array_buffers_for_scavenge_; | |
1775 } else { | |
1776 not_yet_discovered_buffers = live_array_buffers_; | |
1777 not_yet_discovered_buffers.insert(live_array_buffers_for_scavenge_.begin(), | |
1778 live_array_buffers_for_scavenge_.end()); | |
1779 } | |
1771 return freed_memory; | 1780 return freed_memory; |
1772 } | 1781 } |
1773 | 1782 |
1774 | 1783 |
1775 void Heap::TearDownArrayBuffersHelper( | 1784 void Heap::TearDownArrayBuffersHelper( |
Michael Lippautz
2015/08/28 08:05:02
Also inline please.
fedor.indutny
2015/08/28 10:02:37
This one is going to result in duplicated code, is
fedor.indutny
2015/08/28 11:03:34
Acknowledged.
| |
1776 Isolate* isolate, std::map<void*, size_t>& live_buffers, | 1785 Isolate* isolate, std::map<void*, size_t>& live_buffers, |
1777 std::map<void*, size_t>& not_yet_discovered_buffers) { | 1786 std::map<void*, size_t>& not_yet_discovered_buffers) { |
1778 for (auto buffer = live_buffers.begin(); buffer != live_buffers.end(); | 1787 for (auto buffer = live_buffers.begin(); buffer != live_buffers.end(); |
1779 ++buffer) { | 1788 ++buffer) { |
1780 isolate->array_buffer_allocator()->Free(buffer->first, buffer->second); | 1789 isolate->array_buffer_allocator()->Free(buffer->first, buffer->second); |
1781 } | 1790 } |
1782 live_buffers.clear(); | 1791 live_buffers.clear(); |
1783 not_yet_discovered_buffers.clear(); | 1792 not_yet_discovered_buffers.clear(); |
1784 } | 1793 } |
1785 | 1794 |
1786 | 1795 |
1787 void Heap::RegisterNewArrayBuffer(bool in_new_space, void* data, | 1796 void Heap::RegisterNewArrayBuffer(bool in_new_space, void* data, |
1788 size_t length) { | 1797 size_t length) { |
1789 if (!data) return; | 1798 if (!data) return; |
1790 RegisterNewArrayBufferHelper(live_array_buffers_, data, length); | |
1791 if (in_new_space) { | 1799 if (in_new_space) { |
1792 RegisterNewArrayBufferHelper(live_array_buffers_for_scavenge_, data, | 1800 RegisterNewArrayBufferHelper(live_array_buffers_for_scavenge_, data, |
1793 length); | 1801 length); |
1802 } else { | |
1803 RegisterNewArrayBufferHelper(live_array_buffers_, data, length); | |
1794 } | 1804 } |
1795 reinterpret_cast<v8::Isolate*>(isolate_) | 1805 reinterpret_cast<v8::Isolate*>(isolate_) |
1796 ->AdjustAmountOfExternalAllocatedMemory(length); | 1806 ->AdjustAmountOfExternalAllocatedMemory(length); |
1797 } | 1807 } |
1798 | 1808 |
1799 | 1809 |
1800 void Heap::UnregisterArrayBuffer(bool in_new_space, void* data) { | 1810 void Heap::UnregisterArrayBuffer(bool in_new_space, void* data) { |
1801 if (!data) return; | 1811 if (!data) return; |
1802 UnregisterArrayBufferHelper(live_array_buffers_, | |
1803 not_yet_discovered_array_buffers_, data); | |
1804 if (in_new_space) { | 1812 if (in_new_space) { |
1805 UnregisterArrayBufferHelper(live_array_buffers_for_scavenge_, | 1813 UnregisterArrayBufferHelper(live_array_buffers_for_scavenge_, |
1806 not_yet_discovered_array_buffers_for_scavenge_, | 1814 not_yet_discovered_array_buffers_for_scavenge_, |
1807 data); | 1815 data); |
1816 not_yet_discovered_array_buffers_.erase(data); | |
1817 } else { | |
1818 UnregisterArrayBufferHelper(live_array_buffers_, | |
1819 not_yet_discovered_array_buffers_, data); | |
1808 } | 1820 } |
1809 } | 1821 } |
1810 | 1822 |
1811 | 1823 |
1812 void Heap::RegisterLiveArrayBuffer(bool from_scavenge, void* data) { | 1824 void Heap::RegisterLiveArrayBuffer(bool from_scavenge, void* data) { |
1813 // ArrayBuffer might be in the middle of being constructed. | 1825 // ArrayBuffer might be in the middle of being constructed. |
1814 if (data == undefined_value()) return; | 1826 if (data == undefined_value()) return; |
1815 RegisterLiveArrayBufferHelper( | 1827 RegisterLiveArrayBufferHelper( |
1816 from_scavenge ? not_yet_discovered_array_buffers_for_scavenge_ | 1828 from_scavenge ? not_yet_discovered_array_buffers_for_scavenge_ |
1817 : not_yet_discovered_array_buffers_, | 1829 : not_yet_discovered_array_buffers_, |
1818 data); | 1830 data); |
1819 } | 1831 } |
1820 | 1832 |
1821 | 1833 |
1822 void Heap::FreeDeadArrayBuffers(bool from_scavenge) { | 1834 void Heap::FreeDeadArrayBuffers(bool from_scavenge) { |
Michael Lippautz
2015/08/28 08:05:02
The logic here is way too complicated as the seman
fedor.indutny
2015/08/28 11:03:34
Acknowledged.
| |
1823 if (from_scavenge) { | 1835 if (from_scavenge) { |
1824 for (auto& buffer : not_yet_discovered_array_buffers_for_scavenge_) { | 1836 for (auto& buffer : not_yet_discovered_array_buffers_for_scavenge_) { |
1825 not_yet_discovered_array_buffers_.erase(buffer.first); | 1837 not_yet_discovered_array_buffers_.erase(buffer.first); |
1826 live_array_buffers_.erase(buffer.first); | |
1827 } | 1838 } |
1828 } else { | 1839 } else { |
1829 for (auto& buffer : not_yet_discovered_array_buffers_) { | 1840 for (auto& buffer : not_yet_discovered_array_buffers_) { |
1830 // Scavenge can't happend during evacuation, so we only need to update | 1841 // Scavenge can't happend during evacuation, so we only need to update |
1831 // live_array_buffers_for_scavenge_. | 1842 // live_array_buffers_for_scavenge_. |
1832 // not_yet_discovered_array_buffers_for_scanvenge_ will be reset before | 1843 // not_yet_discovered_array_buffers_for_scanvenge_ will be reset before |
1833 // the next scavenge run in PrepareArrayBufferDiscoveryInNewSpace. | 1844 // the next scavenge run in PrepareArrayBufferDiscoveryInNewSpace. |
1834 live_array_buffers_for_scavenge_.erase(buffer.first); | 1845 live_array_buffers_for_scavenge_.erase(buffer.first); |
1835 } | 1846 } |
1836 } | 1847 } |
1837 size_t freed_memory = FreeDeadArrayBuffersHelper( | 1848 size_t freed_memory = FreeDeadArrayBuffersHelper( |
1838 isolate_, | 1849 isolate_, |
1839 from_scavenge ? live_array_buffers_for_scavenge_ : live_array_buffers_, | 1850 from_scavenge, |
1840 from_scavenge ? not_yet_discovered_array_buffers_for_scavenge_ | 1851 from_scavenge ? not_yet_discovered_array_buffers_for_scavenge_ |
1841 : not_yet_discovered_array_buffers_); | 1852 : not_yet_discovered_array_buffers_); |
1842 if (freed_memory) { | 1853 if (freed_memory) { |
1843 reinterpret_cast<v8::Isolate*>(isolate_) | 1854 reinterpret_cast<v8::Isolate*>(isolate_) |
1844 ->AdjustAmountOfExternalAllocatedMemory( | 1855 ->AdjustAmountOfExternalAllocatedMemory( |
1845 -static_cast<int64_t>(freed_memory)); | 1856 -static_cast<int64_t>(freed_memory)); |
1846 } | 1857 } |
1847 } | 1858 } |
1848 | 1859 |
1849 | 1860 |
1850 void Heap::TearDownArrayBuffers() { | 1861 void Heap::TearDownArrayBuffers() { |
1851 TearDownArrayBuffersHelper(isolate_, live_array_buffers_, | 1862 TearDownArrayBuffersHelper(isolate_, live_array_buffers_, |
1852 not_yet_discovered_array_buffers_); | 1863 not_yet_discovered_array_buffers_); |
1864 TearDownArrayBuffersHelper(isolate_, live_array_buffers_for_scavenge_, | |
1865 not_yet_discovered_array_buffers_for_scavenge_); | |
1853 } | 1866 } |
1854 | 1867 |
1855 | 1868 |
1856 void Heap::PrepareArrayBufferDiscoveryInNewSpace() { | 1869 void Heap::PrepareArrayBufferDiscoveryInNewSpace() { |
1857 not_yet_discovered_array_buffers_for_scavenge_ = | 1870 not_yet_discovered_array_buffers_for_scavenge_ = |
1858 live_array_buffers_for_scavenge_; | 1871 live_array_buffers_for_scavenge_; |
1859 } | 1872 } |
1860 | 1873 |
1861 | 1874 |
1862 void Heap::PromoteArrayBuffer(Object* obj) { | 1875 void Heap::PromoteArrayBuffer(Object* obj) { |
1863 JSArrayBuffer* buffer = JSArrayBuffer::cast(obj); | 1876 JSArrayBuffer* buffer = JSArrayBuffer::cast(obj); |
1864 if (buffer->is_external()) return; | 1877 if (buffer->is_external()) return; |
1865 void* data = buffer->backing_store(); | 1878 void* data = buffer->backing_store(); |
1866 if (!data) return; | 1879 if (!data) return; |
1867 // ArrayBuffer might be in the middle of being constructed. | 1880 // ArrayBuffer might be in the middle of being constructed. |
1868 if (data == undefined_value()) return; | 1881 if (data == undefined_value()) return; |
1869 DCHECK(live_array_buffers_for_scavenge_.count(data) > 0); | 1882 DCHECK(live_array_buffers_for_scavenge_.count(data) > 0); |
1870 DCHECK(live_array_buffers_.count(data) > 0); | 1883 live_array_buffers_[data] = live_array_buffers_for_scavenge_[data]; |
1871 live_array_buffers_for_scavenge_.erase(data); | 1884 live_array_buffers_for_scavenge_.erase(data); |
1872 not_yet_discovered_array_buffers_for_scavenge_.erase(data); | 1885 not_yet_discovered_array_buffers_for_scavenge_.erase(data); |
1873 } | 1886 } |
1874 | 1887 |
1875 | 1888 |
1876 void Heap::ProcessAllocationSites(WeakObjectRetainer* retainer) { | 1889 void Heap::ProcessAllocationSites(WeakObjectRetainer* retainer) { |
1877 Object* allocation_site_obj = | 1890 Object* allocation_site_obj = |
1878 VisitWeakList<AllocationSite>(this, allocation_sites_list(), retainer); | 1891 VisitWeakList<AllocationSite>(this, allocation_sites_list(), retainer); |
1879 set_allocation_sites_list(allocation_site_obj); | 1892 set_allocation_sites_list(allocation_site_obj); |
1880 } | 1893 } |
(...skipping 4894 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6775 *object_type = "CODE_TYPE"; \ | 6788 *object_type = "CODE_TYPE"; \ |
6776 *object_sub_type = "CODE_AGE/" #name; \ | 6789 *object_sub_type = "CODE_AGE/" #name; \ |
6777 return true; | 6790 return true; |
6778 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME) | 6791 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME) |
6779 #undef COMPARE_AND_RETURN_NAME | 6792 #undef COMPARE_AND_RETURN_NAME |
6780 } | 6793 } |
6781 return false; | 6794 return false; |
6782 } | 6795 } |
6783 } // namespace internal | 6796 } // namespace internal |
6784 } // namespace v8 | 6797 } // namespace v8 |
OLD | NEW |